加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenCV和GoPro – VideoCapture流中的空帧

发布时间:2020-12-16 07:08:39 所属栏目:百科 来源:网络整理
导读:我有一个GoPro Hero 3(黑色)连接到视频采集卡(AverMedia Game Broadcaster HD).我只是想在OpenCV中获取视频流.使用Logitech网络摄像头没有问题.使用的代码如下. VideoCapture cap;cap.open(0);waitKey(300);//cap.set(CV_CAP_PROP_FRAME_WIDTH,1280);//cap.s
我有一个GoPro Hero 3(黑色)连接到视频采集卡(AverMedia Game Broadcaster HD).我只是想在OpenCV中获取视频流.使用Logitech网络摄像头没有问题.使用的代码如下.

VideoCapture cap;
cap.open(0);

waitKey(300);

//cap.set(CV_CAP_PROP_FRAME_WIDTH,1280);
//cap.set(CV_CAP_PROP_FRAME_HEIGHT,720);

if (cap.isOpened()){
    cout << "Cam identified" << endl;
}

namedWindow("dst",1);

while (1){

Mat frame;

if (!cap.read(frame)) {
    std::cout << "Unable to read frame from video stream" << std::endl;
    continue;
}

imshow("dst",frame);

[...]

}

使用GoPro会发生以下情况:OpenCV能够打开VideoCapture(“Cam已识别”)但无法读取任何帧(只有灰色屏幕和输出:“无法从视频流中读取帧”).我还用frame.empty();检查了这个.

我知道视频采集卡工作正常,因为Unity使用GoPro流打开WebCamTexture没有任何问题.我读了OpenCv中的编解码器问题,所以我已经尝试用FFMPEG支持编译OpenCV.现在可以显示录制的GoPro的MP4-Videos但是流仍然不起作用.

我使用OpenCV 2.48,Windows 7和Visual Studio 2013.

编辑:这是libVLC解决方案的代码:

struct ctx
{
uint8_t* pixeldata;
std::mutex imagemutex;
};

static void display(void *data,void *id);
static void unlock(void *data,void *id,void *const *p_pixels);
static void *lock(void *data,void **p_pixels);

struct ctx ctx;

libvlc_instance_t *inst;
libvlc_media_player_t *mp;
libvlc_media_t *m;

int main(int argc,char* argv[])
{
    ctx.pixeldata = new uint8_t[1280 * 720 * 3];

    char const *vlc_argv[] =
    {
        "-vvv","--no-audio",/* skip any audio track */
        "--no-xlib",/* tell VLC to not use Xlib */
    };

    int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
    inst = libvlc_new(vlc_argc,vlc_argv);

    const char *options[] =
    {
        ":dshow-vdev=AVerMedia HD Capture",":dshow-adev=none",//":dshow-size=1280x720",":dshow-fps=24",":dshow-chroma=YUY2",":dshow-video-input=1",":dshow-video-output=1",":dshow-aspect-ratio=16:9",":live-caching=80",NULL
    };

    m = libvlc_media_new_location(inst,"dshow://");
    for (const char **opt = options; *opt; opt++)
        libvlc_media_add_option(m,*opt);

    mp = libvlc_media_player_new_from_media(m);
    libvlc_media_release(m);
    libvlc_video_set_callbacks(mp,lock,unlock,display,&ctx);
    libvlc_video_set_format(mp,"RV24",1280,720,1280 * 3);
    libvlc_media_player_play(mp);

    namedWindow("all",1);

    Mat frame(720,CV_8UC3);

    while (1){

        ctx.imagemutex.lock();
        memcpy(gesamt.data,ctx.pixeldata,1280 * 720 * sizeof(uint8_t) * 3);
        ctx.imagemutex.unlock();

        imshow("all",gesamt);

        if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed,break loop
        {
            cout << "esc key is pressed by user" << endl;
            break;
        }

    }

    libvlc_media_player_stop(mp);
    libvlc_media_player_release(mp);
    libvlc_release(inst);
    delete[] ctx.pixeldata;

    return 0;
}

void display(void *data,void *id){
    (void)data;
    assert(id == NULL);
}

void unlock(void *data,void *const *p_pixels){
    struct ctx *ctx = (struct ctx*)data;
    ctx->imagemutex.unlock();
    assert(id == NULL);
}

void *lock(void *data,void **p_pixels){
    struct ctx *ctx = (struct ctx*)data;
    ctx->imagemutex.lock();
    *p_pixels = ctx->pixeldata;
    return NULL;
}

解决方法

我试图通过Avermedia采集卡流式传输索尼动作凸轮时遇到了同样的问题.一个快速修复似乎是使用DVDrive,这使您的捕获卡输出看起来像一个网络摄像头.我已成功使用它作为一种解决方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读