OpenCV网络摄像头捕获问题

时间:2010-12-13 15:22:56

标签: c++ c opencv webcam

我已经安装了OpenCV 2.2,现在我无法使网络摄像头捕获工作。它在2.1中运行正常。 OpenCV检测到网络摄像头,不报告任何错误或警告,但每个帧都是灰色图像。我甚至尝试过OpenCV wiki的代码示例:

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;

有没有人遇到过这个问题?我正在使用64位Win7和Visual Studio 2010。

8 个答案:

答案 0 :(得分:9)

经过长时间的搜索,我找到了解决方案。

问题是如果在显示帧之间没有延迟发生这个问题。

解决方案将cvWaitKey(20);置于循环中。

答案 1 :(得分:3)

问题在于我使用的相机,MSFT LifeCam。我试过Logitech C210和120,它们都工作正常。

答案 2 :(得分:3)

以下是解决方案。

拍摄的每个图像帧都在下面的第一行中转换为灰度图像。 单独注释和运行代码将显示错误,因为您没有将任何已处理的图像捕获到边框中,这将以imshow显示。

因此,请对cvtColor行进行评论,并将imshow中的第二个参数更改为frame。这样您就可以显示网络摄像头的彩色视频。

cvtColor(frame, edges, CV_BGR2GRAY);

imshow("edges", frame);

答案 3 :(得分:1)

我真的对OpenCV一无所知,但下一行不是问题吗?

cvtColor(frame, edges, CV_BGR2GRAY);

好像是故意将B-G-R色彩空间转换为灰度空间。

不应该是这样的:

cvtColor(frame, edges, CV_BGR2RGB);

答案 4 :(得分:0)

您也可以尝试查看this post

简单来说,改变

  

import cv

  

将cv2.cv导入为cv

为我工作。另请参阅帖子here

答案 5 :(得分:0)

我遇到了同样的问题。我想它可能是我的相机上的设置,因为我应该输入640x480px(我无法调整),我无法调整Feed的权限。所以我安装了一个虚拟网络摄像头,几乎解决了这两个问题。我得到了一个输入对话框,选择了虚拟摄像头并且工作正常。我设法在应用程序中将其设置为640x480。

我的虚拟相机被称为ManyCam,但看起来它是为十几岁的女孩制作的,希望我安装其他3个应用程序,而我仍然不确定天气不会带有“互补”特洛伊木马。

但是,它可以让您调整颜色,色调,对比度等以及测试时可能需要的其他东西。

答案 6 :(得分:0)

我正在使用cvtColor并发现

cvtColor(image,image,CV_BGR2RGB);无效。

但好消息是这项改变工作!!

cvtColor(image,image,**COLOR_BGR2RGB**);

还包括:

include opencv2/imgproc/imgproc.hpp

在.pro文件中的库:

-lopencv_imgproc 

答案 7 :(得分:0)

试试这个:

VideoCapture cap(0); // open the default camera
if(!cap.isOpened())  // check if we succeeded
{
  cout<<"Cam not captured\n";
}

Mat frame;
namedWindow("frame");
for(;;)
{
    cap >> frame; // get a new frame from camera
    imshow("frame", frame);

    if(waitKey(10) >= 0) break;
}

return 0;