【问题标题】:OpenCV and GoPro - empty frames in VideoCapture streamOpenCV 和 GoPro - VideoCapture 流中的空帧
【发布时间】:2014-04-28 15:37:13
【问题描述】:

我有一个连接到视频采集卡(AverMedia Game Broadcaster HD)的 GoPro Hero 3+(黑色)。我只是想在 OpenCV 中获取视频流。使用罗技网络摄像头没有问题。使用的代码如下。

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(“已识别摄像头”),但无法读取任何帧(只是灰屏和输出:“无法从视频流中读取帧”)。我还用 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, 1280, 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 *id, 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;
}

【问题讨论】:

    标签: c++ opencv ffmpeg video-capture gopro


    【解决方案1】:

    我在尝试通过 Avermedia 采集卡流式传输 Sony 运动摄像机时遇到了同样的问题。一个快速修复似乎是使用 DVDrive,它使您的采集卡输出看起来像一个网络摄像头。我已经成功地将其用作解决方法。

    【讨论】:

    • 谢谢!你说的对。使用 DVDDriver 它可以工作。我发现的另一个解决方法是使用 libVLC 的 directshow 功能。知道只使用 openCV 框架的解决方案仍然很高兴。
    • libVLC 是一个很好的技巧。让它工作有什么复杂的吗?我可能会试一试,因为 DVDrive 在高分辨率下占用了大量的 CPU 周期。
    • 我花了一些时间才弄清楚。您可以在上面的帖子中看到我的代码。最大的问题是视频格式设置和正确转换为 opencv::Mat。在我的第一个解决方案中,我使用了“libvlc_video_set_format(mp, "YUY2", 1280, 720, 1280 * 2);"这有点难以转换,因为它是一个包装。所以第一个和第三个字节是第一个和第二个像素的 Y 值。第二个和第四个字节是两个像素的 Cb 和 Cr 值。后来发现可以直接在set_format命令中选择RV24而不是YUY2来进行转换。
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2016-12-15
    • 2017-07-04
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多