无法使用OpenCV访问网络摄像头。

3

我正在win 7 64位电脑上使用OpenCV 2.2和visual studio 2010。我能够显示图片和播放AVI文件,如《学习OpenCV》一书中所述,但我无法捕获摄像头图像。即使是OpenCV文件附带的示例也无法访问摄像头。

当我选择"视频源->捕获源"时,会出现两个选项:HP webcam Splitter和HP webcam。如果我选择HP webcam,则窗口会立即关闭而不显示任何错误。(我认为任何错误消息在关闭之前都太快了,无法看到)。如果我选择HP Webcam splitter,则应该显示网络摄像头图像(视频)的新窗口会被填充成统一的灰色。网络摄像头的指示灯亮着,但没有视频画面。我的网络摄像头在flash (www.testmycam.com)和直接显示(DirectShow)下运行正常 http://www.codeproject.com/KB/audio-video/WebcamUsingDirectShowNET.aspx

我尝试使用以下代码获取一些错误消息:

#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace cv;
using namespace std;

int main(int, char**)
{
    VideoCapture cap("0"); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
       {
     cout << "Error opening camera!";
     getchar();
     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;
}

我收到的错误信息是:

warning: Error opening file (C:\Users\vp\work\ocv\opencv\modules\highgui\src\cap
_ffmpeg.cpp:454)
Error opening camera!

我不知道这个“cap_ffmpeg.cpp”是什么,也不知道这是否与烦人的“HP Media Smart”有关。
非常感谢您的帮助。

在行VideoCapture cap("0");中,我添加了“引号”。也许这就是问题所在。但为什么默认示例仍然无法运行?而且在结束进程“YouCam Mirage”http://www.pacs-portal.co.uk/startup_pages/22000-22999/22266_YCMMirage.exe.htm之后,如果我选择“HP Webcam”而不是“HP Webcam Spltter”,这些示例不会关闭。很奇怪。 - Astromaz3
我不知道这对你是否有用,但是user660815的回答解决了我所有的问题。你可能想考虑将他的答案标记为正确答案。 - Tom
8个回答

12

我在使用 Windows 7 64 位系统时,遇到了同样的问题。我不得不重新编译 opencv_highgui 并更改属性页面中 C/C++ 面板中的“预处理器定义”,以包括:

HAVE_VIDEOINPUT HAVE_DSHOW

希望这能有所帮助。


2
哦。我的。天。您,先生,是我的英雄;)我谷歌了好几天,降级到opencv 2.1,因为我差点放弃了,我的所有代码在OpenCv2.1下都崩溃了(blobslib遇到了奇怪的异常,在2.2下运行良好)。按照您的步骤,一切都很顺利。有很多人遇到了这个问题,如果您不介意,我会传播您的建议,并引用这篇SO帖子。 - Tom

1

最近我安装了OpenCV 2.2和NetBeans 6.9.1。我遇到了一个相机捕获的问题,窗口中的图像是黑色的,但程序运行完美,没有错误。我不得不以管理员身份运行NetBeans来解决这个问题。

希望这能帮助大家。


1

我刚刚转换到OpenCV 2.2,但在运行Vista的32位计算机上遇到了基本相同的问题。网络摄像头会启动,但我会收到一个错误消息,设置相机的宽度属性。如果我专门请求DirectShow相机,则cvCreateCameraCapture将失败。
我认为正在发生的是HighGUI的分发版本构建时排除了DirectShow相机。 OpenCV上受欢迎的Windows相机曾经是Video For Windows(VFW),但自从Windows Vista推出以来已被弃用,并引起了各种问题。我不知道为什么他们不包括它。请检查源文件cap.cpp

我的下一步是重新构建HighGUI并确保设置了HAVE_DSHOW标志。我似乎记得在使用最后一个版本的OpenCV之前也遇到了同样的问题,直到我重建它并确保启用了DirectShow版本。


1

cap_ffmpeg.cpp是使用ffmpeg执行设备捕获的源文件。如果OpenCV提供的默认示例无法与您的网络摄像头配合使用,那么您就没有办法了。我建议您购买另一个受支持的摄像头。


老鼠。至少现在我知道了。谢谢。 - Astromaz3
如果是这样,那么坚持使用OpenCV2.1。它足够好用了。您需要向OpenCV提交一个错误报告。 - Dat Chu
有趣的是 - 这个问题(对我来说)只出现在Windows平台上 - 在Mac或Linux上没有错误 =( - Rella

1

这是我一段时间前写的一篇文章。它使用videoInput库从网络摄像头获取输入。它使用DirectX,因此几乎可以与所有网络摄像头一起使用。使用DirectX捕获图像


1

我遇到了同样的问题。我的Vaio Webcam LED灯亮着,但屏幕上没有图像。 然后我尝试将第一帧导出为JPEG文件,它可以工作。然后我尝试在捕获任何帧之前插入33毫秒的延迟,这次它就像魔法般地工作了。希望这能有所帮助。


0

一旦您创建了cv::VideoCapture,您应该提供一个整数而不是字符串(因为字符串意味着输入是文件)。

要打开默认摄像头,请使用以下流打开:

cv::VideoCapture capture(0); 

它将正常工作。


0

CMAKE GUI,MSVC++10E,Vista 32-bit,OpenCV2.2

看起来HAVE_VIDEOINPUT/WITH_VIDEOINPUT选项不起作用。

但是在CMAKE_CXX_FLAGSCMAKE_C_FLAGS中添加/D HAVE_DSHOW /D HAVE_VIDEOINPUT对我有帮助(由于宏重定义会有警告)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接