无法在 OpenCV 2.4.7 中从摄像头捕获视频

Can't capture Video from Cam in OpenCV 2.4.7

本文关键字:摄像头 视频 OpenCV      更新时间:2023-10-16

这是我从这里复制/粘贴的代码:

#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;
}

但我得到了这个错误:


OpenCV error: Assertion failed (scn==3 || scn==4) 
in unknown function, file ........opencvmodulesimgprocsrccolor.cpp, line 3737

我使用的是Windows 7 x64、Visual Studio 2008、OpenCV 2.4.7

问题出在哪里?

编辑:

它有时有效,有时无效。

编辑2:

我编辑了VideoCapture cap(0)cv::VideoCapture cap(0)然后,我重新构建我的解决方案并运行它。它第一次起作用,我试图运行第二次,但它给了我同样的错误。

编辑3:

我甚至为(;;):编辑了

for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        imshow("edges", frame);
        if(waitKey(30) >= 0) break;
    }

这次我收到另一个错误:


OpenCV error: Assertion failed (size.width>0 && size.height>0) 
in unknown function, file ........opencvmoduleshighguisrcwindow.cpp, line 261

我想问题出在imshow上。

我遇到了类似的问题。我通过将cap >> frame之后的所有内容放入if语句来解决它:

 for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        if (!frame.empty()) {
          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;
    }

我在我的环境中测试了你的代码(Win XP 32位操作系统,VS2008,OpenCV2.4.7)。它每次都能正常工作。你也可以这样做:

IplImage* frame,*edges;
CvCapture* pcapture = cvCreateCameraCapture(0);
cvNamedWindow("edges",CV_WINDOW_AUTOSIZE);
while (1)
{
    frame = cvQueryFrame(pcapture);
    if (!frame) break;
    edges = cvCreateImage(cvGetSize(frame),8,1);
    cvCvtColor(frame, edges, CV_BGR2GRAY);
    cvSmooth(edges,edges,CV_GAUSSIAN,7,7,1.5,1.5);
    cvCanny(edges,edges,0,30,3);
    cvShowImage("edges",edges);
    cvReleaseImage(&edges);
    if (cvWaitKey(30)>=0) break;
}
cvReleaseCapture(&pcapture);
cvDestroyWindow("edges");

你可以试一下它是否在你的环境中也有一些问题。希望能给你一点帮助!