2013-05-04 122 views
9

我想为Linux编写一个C++/Qt程序,在这里我从网络摄像头拍摄静态图像照片,对照片进行一些转换(裁剪,调整大小等) ,并将其保存为jpeg文件。如何在linux上从网络摄像头捕捉静态图像

但我遇到了一些问题。主要问题是标准的UVC(USB视频设备类)linux驱动程序目前不支持直接静止图像捕获:http://www.ideasonboard.org/uvc/

因此,有两种可能的方式来捕捉静止图像。您可以从相机的视频流中取出一帧,也可以拍摄单独的照片,如数码便携式相机。第二种方式在Linux uvc驱动程序中不受支持,所以第一种方法是唯一的方法。但问题是,如果你想从视频流中获取帧,照片的大小不能大于视频预览窗口中视频的大小。因此,如果我想拍摄200万像素的照片,我必须开始1600x1200大小的视频流,这并不是那么舒服(至少在Qt视频流的大小取决于视频视图窗口大小)。

我知道有用于Linux 2 API的视频,这可能对此任务有帮助,但我不知道如何使用它。我目前正在学习gstreamer,但现在我无法弄清楚如何使用这些工具来完成我所需要的工作。

所以,我会很感激任何帮助。我认为对于了解Linux,GStreamer,v4l2 API和其他特定于Linux的人来说这不是一个难题。

顺便说一句,该方案将只能用于网络摄像头罗技C270 HD。

请帮帮我。我不知道什么API或框架可以帮助我做到这一点。可能是你知道的。

+0

我不知道这是否有帮助,这就是为什么我把它作为评论。有一个叫做“奶酪”的oss程序可以拍摄照片和录像。看看这里:https://apps.ubuntu.com/cat/applications/precise/cheese/ ...也许看看代码可能会帮助你。 – Joe 2014-03-20 13:06:22

+0

[Linux上用于C的网络摄像头库?](http:// stackoverflow。com/questions/278112/webcam-library-for-c-on-linux) – 2016-11-12 09:53:05

回答

1
**Download And Install 'mplayer'** 
mplayer -vo png -frames 1 tv:// 
+0

据我所知,mplayer使用gstreamer来播放媒体...可能你知道一些gstreamer代码做同样的事情吗? – locomotion 2013-05-05 09:53:10

+0

> mplayer -vo png -frames 1电视:// 不起作用。普通的绿色图片出现在主目录中。 – locomotion 2013-05-05 12:35:38

+0

不,mplayer不使用gstreamer播放媒体,而是他们都使用相同的底层库,如x264和ffmpeg。 – 2013-08-05 18:16:59

0

这个程序怎么样?

#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集成:)

+0

不起作用。我删除了部分代码,现在只需拍摄一张照片并将其保存到文件中,而无需显示在窗口中。并输出HIGHGUI ERROR:V4L/V4L2:VIDIOC_S_CROP – locomotion 2013-05-06 13:02:56

+0

好吧,那么你需要设置一些选项来打开函数,比如捕获大小,帧等等。或者你可以使用GLWidget在Qt窗口中显示摄像头视频。 – 2013-05-06 17:16:08

3

不幸的是,opencv中的C4V2调用不能用于使用UVC驱动程序试用过的任何相机拍摄的静态图像。

为了调试我一直在试图用c代码直接调用c4v2来实现这个问题。

我一直在玩示例代码找到here。它使用从视频流中拉出帧的方法。

你可以编译:

gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename 

我有3个罗技摄像头试验。最好的部分似乎是罗技C910。但即使它有重大的问题。

以下是我尝试使用此代码完成相同任务时遇到的问题。

它的工作几乎每一次的宽度和高度设置为1920x1080。

当我使用例如直接查询从命令行其他可能性:

v4l2-ctl --list-formats-ext 

和我尝试一些其他的“可用的”更小它在选择等待挂起大小的相机以释放缓冲器。

而且当我尝试在命令行中使用,例如直接设置其他尺寸:

v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV 

然后用

v4l2-ctl -V 

检查我发现它返回正确的像素格式,但往往不正确的大小。

显然这是对UVC site列为是UVC并且因此用v412兼容此照相机是达不到鼻烟。我怀疑它和其他相机一样糟糕。另外两个我尝试过的网站也被列为兼容网站,但问题更严重。

我做了一些LogitechC910更多的测试我张贴了这个之后。我想我会公布结果以防别人帮忙。

我写了一个脚本来测试用v412抓取代码上面提到的所有的相机声称它支持的格式,当它被查询与用v412这里的结果:

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. 

事实证明,默认设置640x480不起作用,这就是困扰我和大多数在留言板上张贴的人。

由于它抓住一个视频帧启动时可具有不正确的曝光(通常为黑色或接近)它抓住的第一帧。我相信这是因为它被用作摄像机,所以它会随着时间的推移调整曝光,而不关心第一帧。我相信这也困扰了我和其他谁看到第一帧为黑色或接近黑色,并认为这是某种错误。后来帧正确的曝光量

事实证明,与OpenCV的Python包装,如果你避免上面列出的地雷和忽略所有的错误信息正常工作与这台相机。错误信息是由于相机接受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) 
1
mplayer -vo png -frames 1 tv:// 

可能会给一个绿屏输出。

mplayer -vo png -frames 2 tv:// 

您可以尝试增加帧数并选择相机提供正确图像的数字。