我正在尝试为Linux编写一个C ++ / Qt程序,在这里我从networking摄像机拍摄一张静止图像照片,对照片进行一些转换(裁剪,resize等),并将其保存为jpeg文件。
但是我遇到了一些问题。 主要的问题是,标准的UVC(USBvideo设备类)Linux驱动程序目前不支持直接静止图像捕获: http : //www.ideasonboard.org/uvc/ 。
所以,有两种可能的方法来捕捉静止图像。 您可以从相机的videostream中取出一帧,也可以拍摄另一张照片,如数码便携式相机。 第二种方法是不支持Linux uvc驱动程序,所以第一种方法是唯一的方法。 但是问题是,如果你想从videostream中取出一帧,照片的大小不能大于video预览窗口中video的大小。 所以,如果我想拍200万像素的照片,我必须开始1600×1200大小的videostream,这不是很舒服(至less在Qtvideostream的大小取决于videopreview窗口的大小)。
我知道有用于Linux 2 API的video,这可能对此任务有帮助,但我不知道如何使用它。 我目前正在学习gstreamer,但我现在不能弄清楚如何使用这些工具来做我所需要的。
所以,我会感谢任何帮助。 我认为对于了解Linux,GStreamer,v4l2 API和其他特定于Linux的人来说这不是一个难题。
顺便说一下,该scheme将只能用于networking摄像头罗技C270 HD。
请帮帮我。 我不知道什么API或框架可以帮助我做到这一点。 可能是你知道的。
不幸的是,opencv中的C4V2调用不能用于任何使用UVC驱动程序开箱即用的相机进行静态图像捕捉。
为了调试这个问题,我试图用c代码直接调用c4v2来实现这个功能。
我一直在玩这里找到的示例代码。 它使用从视频流中拉出帧的方法。
你可以编译它:
gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename
我已经试用了3款罗技相机。 罗技C910的好处似乎是最好的。 但是,即使它有重大的问题。
以下是我遇到的问题,试图用此代码完成相同的任务。
它的工作几乎每一次的宽度和高度设置为1920×1080。
当我直接从命令行查询其他可能性,例如:
v4l2-ctl --list-formats-ext
我尝试了一些其他的“可用”较小的尺寸,它挂在选择等待相机释放缓冲区。
另外,当我尝试使用例如直接从命令行设置其他大小:
v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV
然后检查
v4l2-ctl -V
我发现它返回正确的像素格式,但往往不是正确的大小。
很显然,这个在UVC网站上列出的相机是UVC,因此与v412兼容并不合格。 我怀疑它和其他相机一样糟糕。 另外两个我尝试了也被列为兼容的网站,但有更糟糕的问题。
我发布之后,我在LogitechC910上做了一些更多的测试。 我想我会公布结果,以防别人帮助别人。
我写了一个脚本来测试上面提到的相机声称支持的所有格式上面提到的v4l2抓取代码,当用v4l2查询的时候,结果如下:
640x480 => Hangs on clearing buffer 160x120 => Works 176x144 => Works 320x176 => Works 320x240 => Works 432x240 => Works 352x288 => Works 544x288 => Works 640x360 => Works 752x416 => Hangs on clearing buffer 800x448 => Hangs on clearing buffer 864x480 => Works 960x544 => Works 1024x576 => Works 800x600 => Works 1184x656 => Works 960x720 => Works 1280x720 => Works 1392x768 => Works 1504x832 => Works 1600x896 => Works 1280x960 => Works 1712x960 => Works 1792x1008 => Works 1920x1080 => Works 1600x1200 => Works 2048x1536 => Works 2592x1944 => Hangs on clearing buffer.
事实证明,640×480的默认设置不起作用,这就是困扰我和大多数在留言板上张贴的人。
由于它抓取视频帧,所以在启动时抓取的第一帧可能具有不正确的曝光(通常是黑色或接近它)。 我相信这是因为它被用作摄像机,所以它会调整曝光,而不关心第一帧。 我相信这也困扰了我和其他谁看到第一帧黑或几乎黑,认为这是一种错误。 后来的帧有正确的曝光
事实证明,如果你避开上面列出的地雷,并且忽略所有的错误信息,用python包装的opencv可以很好地用这个摄像头。 错误信息是由于这个事实,而相机接受v4l2命令,它没有正确响应。 所以,如果你设置的宽度,它实际上被正确设置,但它响应不正确的宽度。
要用python包装器在opencv下运行,你可以这样做:
import cv2 import numpy cap = cv2.VideoCapture(0) #ignore the errors cap.set(3, 960) #Set the width important because the default will timeout #ignore the error or false response cap.set(4, 544) #Set the height ignore the errors r, frame = cap.read() cv2.imwrite("test.jpg", frame)
**Download And Install 'mplayer'** mplayer -vo png -frames 1 tv://
mplayer -vo png -frames 1 tv://
由于相机尚未准备就绪,可能会出现绿屏输出。
mplayer -vo png -frames 2 tv://
您可以尝试增加相框的数量并选择相机提供正确图像的数字。
这个节目呢?
#include<opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture webcam; webcam.open(0); Mat frame; char key; while(true) { webcam >> frame; imshow("My Webcam",frame); key = waitKey(10); if(key=='s') break; } imwrite("webcam_capture.jpg", frame); webcam.release(); return 0; }
这将捕获您的摄像头允许的最大尺寸的图片。 现在你可以添加效果或调整与Qt捕获的图像。 而且OpenCV非常容易与Qt集成,:)