OpenCV 2.4.6.1:从相机抓取帧时出错

时间:2013-09-24 14:01:05

标签: c++ xcode opencv osx-mountain-lion

我正在使用XCode(OS X Mountain Lion)和OpenCV。 OpenCV通过自制程序(版本2.4.6.1)安装

我的程序应该只能访问相机。

这是我的代码sofar:

using namespace cv;

int main(int argc, const char * argv[])
{
    Mat frame;
    VideoCapture cap(CV_CAP_ANY);
    if (!cap.isOpened())
    {
        std::cerr << "Webcam error. Was not able to open webcam!\n";
        exit(1);
    }

    namedWindow("webcam", CV_WINDOW_AUTOSIZE);

    while (cap.isOpened())
    {
        cap >> frame;
        if (frame.empty())
        {
            std::cerr << "Frame data error.\n";
        }

    imshow("webcam", frame);

    if(waitKey(50) >= 0)
    {
        cap.release();
        std::cout << "Webcam closed.\n";
    }
}

std::cout << "The Program has finished.";
return 0;
}

但我得到了输出:

  

帧数据错误。

     

OpenCV的错误:断言失败(size.width大于0&安培;&安培; size.height大于0)中imshow,文件/tmp/default-mebu/opencv-2.4.6.1/modules/highgui/src/window.cpp ,第261行

     

libc ++ abi.dylib:terminate调用抛出异常   (lldb)

我认为我的程序没有正确访问相机。它以某种方式无法获取数据。

我知道Linux存在一些问题,但我认为它们已被修复,我不确定它们是如何影响OS X的。

有人知道我的问题的解决方案吗?

编辑:

所以我找到了解决方案。我为imshow添加了一个try {} catch {}。现在我的程序在点击imshow时不会退出。相反,它只是通过一个错误并保持while循环运行。它错过了几帧,但仍然足以保持良好的视频流。

try
{
     imshow("webcam", frame);
}
catch (Exception& e)
{
    const char* err_msg = e.what();
    std::cout << "exception caught: imshow:\n" << err_msg << std::endl;
}

抛出的错误仍然是同一个:

  

帧数据错误。

     

OpenCV的错误:断言失败(size.width大于0&安培;&安培; size.height大于0)中imshow,文件/tmp/default-mebu/opencv-2.4.6.1/modules/highgui/src/window.cpp ,第261行

     

异常捕获:imshow:   /tmp/default-mebu/opencv-2.4.6.1/modules/highgui/src/window.cpp:261:错误:(-215)size.width&gt; 0&amp;&amp;函数imshow中的size.height&gt; 0

3 个答案:

答案 0 :(得分:0)

VideoCapture cap(CV_CAP_ANY);
Sleep(1000);  // Wait for response of camera, don't forget to #include <windows.h>

答案 1 :(得分:0)

我有类似的问题。你可以添加类似的代码,也许解决它。因为捕获大小会导致此问题

VideoCapture cap;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 

然后

cap.read(image);

答案 2 :(得分:0)

所以我找到了一个解决方法。我为imshow添加了一个try {} catch {}。现在我的程序在点击imshow时不会退出。相反,它只是通过一个错误并保持while循环运行。它错过了几帧,但仍然足以保持良好的视频流。

try
{
     imshow("webcam", frame);
}
catch (Exception& e)
{
    const char* err_msg = e.what();
    std::cout << "exception caught: imshow:\n" << err_msg << std::endl;
}