4

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

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

到目前为止,这是我的代码:

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 错误:imshow 中的断言失败 (size.width>0 && size.height>0),文件 /tmp/default-mebu/opencv-2.4.6.1/modules/highgui/src/window.cpp,第 261 行

libc++abi.dylib:终止调用抛出异常(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 错误:imshow 中的断言失败 (size.width>0 && size.height>0),文件 /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>0 && size.height>0 in function imshow

4

3 回答 3

0

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

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

然后

cap.read(image);
于 2013-11-09T09:10:56.740 回答
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;
}
于 2014-01-02T17:21:09.770 回答
0
VideoCapture cap(CV_CAP_ANY);
Sleep(1000);  // Wait for response of camera, don't forget to #include <windows.h>
于 2013-10-31T09:40:33.953 回答