OpenCV - Videocapture中未处理的异常

时间:2013-11-14 11:22:06

标签: c++ opencv

我最近安装了OpenCV 2.4.7并将其配置为我的Visual Studio 2010 Ultimate ide ...我甚至测试了一个代码来显示图像......

#include "opencv2/highgui/highgui.hpp"
#include "iostream"

using namespace cv;
using namespace std;

int main()
{
    Mat im = imread("d:/lena.jpg");
    if (im.empty()) 
    {
        cout << "Cannot load image!" << endl;
        return -1;
    }
    imshow("Image", im);
    waitKey(0);
}

并且它有效但当我尝试使用给定here的视频捕捉代码时,它会出错...

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);
        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}
  

myNewOpenCv1.exe中0x75dc812f处的未处理异常:Microsoft C ++异常:cv ::内存位置0x0019f6d8的异常

我不知道它是否与安装有关。我对OpenCV很新,并且不太了解,如果任何习惯这种情况的人都可以为我解决这个错误,并且还会给我一个关于它为什么会发生的解释,并且对此的指导会很好。

希望等待你的答案 - 乔纳森 -

2 个答案:

答案 0 :(得分:3)

尝试替换

cap >> frame;

使用:

while (frame.empty()) {
    cap >> frame;
}

有时opencv camera API会为前几帧提供垃圾,但过了一段时间后一切都会有效。

您可能希望将该循环限制为固定的迭代次数,以避免无限运行。

答案 1 :(得分:0)

以下代码行仅用于边缘检测。

cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);

所以,如果您对视频捕获感兴趣,请使用以下代码:

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        imshow("display", frame);
        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

要运行此代码,您应该在VS中设置库路径,并且您应该在VS中设置链接器选项中的dll。它将起作用!!!