我正在尝试使用opencv从USB摄像头捕获图像帧。但是我总是得到一个黑框。我已经阅读了很多关于这个问题的帖子并尝试了所有的建议,但没有任何对我有用。
我开始使用这里讨论的代码: http://opencv-users.1802565.n2.nabble.com/Using-USB-Camera-td6786148.html
我尝试在许多“关键”句子之后加入方法cvWaitKey(1000)。如您所见,等待值非常高(1000)。
我也试图保存图像框,同样,它是一个黑色图像。
我使用以下系统:
USB摄像头适用于AMCAP.EXE 1.00。
可能是因为Windows正在使用相机驱动程序吗?我可以更改为其他更适合OpenCV 2.2.0的驱动程序吗?
由于
答案 0 :(得分:5)
确定。正如我在评论中答应了你的要求,抱歉让你久等了,真的很忙。几乎没有时间发布这个答案。但这是:
这是我模拟opencv捕获黑色图像。在输出窗口中,我在评论中询问了它的内容,表明存在错误。
经过调查,我意识到这是由于相机的可用格式:
因为这是一个糟糕的相机。如果您有像罗技这样的更好的相机,您可以看到可用的格式更多。
有很多方法,你可以试试像
这样的东西capture.set(CV_CAP_PROP_FRAME_WIDTH , 640);
capture.set(CV_CAP_PROP_FRAME_HEIGHT , 480);
capture.set (CV_CAP_PROP_FOURCC, CV_FOURCC('B', 'G', 'R', '3'));//diff from mine, using as example
然后网络摄像头将能够捕捉。这个网络摄像头有点故障,因此拍摄的图像不是很漂亮。
希望这是你的问题。但也可能不是这样。我喜欢调试问题,但是我不能因为你真的很忙而放下所有可能的原因,因为你问了一个例子,这是其中之一。干杯。如果你能告诉我你输出的窗口错误是什么,我可能会提供更多帮助。
编辑(在评论中回答更多内容):
好的,我想让你尝试一些事情:
1)首先,我希望您尝试使用该网络摄像头来捕获视频,而不是使用cvQueryFrame
或类似的捕获方法。等到可能会说10秒,看看它是否成功。原因是,一些相机(质量较差的相机)需要很长时间来预热,而它们捕获的前几帧可能是空的。
2)如果第一步不起作用,请尝试输入
cout << cv::getBuildInformation() << endl;
并粘贴媒体I / O和视频I / O的结果?我想看看结果。我也怀疑你的库依赖,但是因为你说它适用于罗技相机,我怀疑是这样的。当然,这总是有可能是因为相机与OpenCV不兼容。顺便提一下相机有没有品牌?
3)或者,只需在线搜索USB驱动程序并安装它,我有一个朋友为类似的问题做了这个,但不确定这个过程。
答案 1 :(得分:1)
首先,我建议是,访问此链接并检查您的相机是否正常工作
http://www.youronlinemirror.com/
如果是,那么请通过以下链接开始使用,你也会在那里找到一个好的opencv c ++代码,你使用的代码是opencv1 api的c代码,我宁愿鼓励你去c ++比旧版本的opencv。
http://opencv-srf.blogspot.in/2011/09/capturing-images-videos.html
如果你想要你的代码的答案,那么,它很简单,因为你说它给了一个黑屏,这发生在我的情况下,当我用opencv开始时, 它无法从设备中获取数据,因此,试试这个,它可能会起作用,就像它对我一样。
添加
cvQueryFrame( capture );
之前
IplImage* frame = cvQueryFrame( capture );
答案 2 :(得分:1)
我遇到了和你一样的问题。然后我只是将版本从3.1.0更改为2.4.13,然后我的网络摄像头正常工作!没有更多的黑色图像。我猜这个版本与vs15不兼容。认为你很久以前就已经解决了这个问题。但只是发帖让其他人知道他们是否碰巧遇到同样的问题。
答案 3 :(得分:0)
即使我在运行OpenCV相关程序时遇到了同样的黑屏问题。因此,我没有使用USB摄像头,而是使用了移动相机,它工作得很好。使用DroidCam等谷歌应用程序(在移动设备和笔记本电脑/ PC上安装DroidCam)通过Wi-Fi将移动摄像头连接到笔记本电脑。