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

Posted

技术标签:

【中文标题】无法在 OpenCV 2.4.7 中从摄像头捕获视频【英文标题】:Can't capture Video from Cam in OpenCV 2.4.7 【发布时间】:2013-12-16 05:34:37 【问题描述】:

这是我从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;

但我收到此错误:


OpenCV error: Assertion failed (scn==3 || scn==4) 
in unknown function, file ..\..\..\..\opencv\modules\imgproc\src\color.cpp, line 3737

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

可能是什么问题?

编辑:

有时有效,有时无效。

编辑 2:

我将 VideoCapture cap(0); 编辑为 cv::VideoCapture cap(0); 然后,我重建我的解决方案并运行它。第一次运行,我第二次尝试运行,它给了我同样的错误。

编辑 3:

我什至编辑了 for(;;)

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 ..\..\..\..\opencv\modules\highgui\src\window.cpp, line 261

我猜问题出在 imshow

【问题讨论】:

你能告诉我这个错误在你的程序中究竟发生在哪里吗?如,它是否发生在cap >> framecvtColor.. 之后?请设置断点并回复我。 @scap3y 我把 cout>框架;和 cout @scap3y 还有一个错误 (size.width>0 && size.height>0) 问题出在cvtColor,很明显。我可以建议您更改窗口的名称并尝试..吗?否则,您可能需要逐步调试并查看每一步的值变化。 @scap3y 我解决了我的问题,我刚刚添加了 cap.read(frame);在 cap>>frame 之前,它起作用了。你怎么看待这件事?为什么? 【参考方案1】:

我遇到了类似的问题。我通过将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;
    

【讨论】:

【参考方案2】:

我在我的环境(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");

你可以试试看你的环境是否也有问题。 希望对你有一点帮助!

【讨论】:

哦,请不要向任何人指出过时的c-api,甚至请不要自己停止使用它!

以上是关于无法在 OpenCV 2.4.7 中从摄像头捕获视频的主要内容,如果未能解决你的问题,请参考以下文章

Jetson --- 人脸识别(OpenCV安装)

OpenCV 视频捕获 API

在 .Net Core 2.0 中从网络摄像头捕获图像

VoIP:如何在 Qt 多媒体中从摄像头捕获实时音频/视频流字节?

从网络摄像头捕获帧,它在 opencv cv2.VideoCapture() 中仅返回 1 帧

OpenCv - 从网络摄像头捕获帧时发生内存泄漏