繁体   English   中英

如何更改OpenCV不支持但v4l2 API支持的网络摄像头属性?

[英]How can I change webcam properties that OpenCV doesn't support but v4l2 API does?

我正在使用OpenCV 3.1Python 2.7从我的网络摄像头Logitech C270中捕获视频帧。 我也使用video4linux2(v4l2)来设置我的相机的属性,但这导致了一些问题。 我的操作系统是Ubuntu 15.04

我想要改变的具体属性是absolute_exposure

我可以通过终端使用v4l2 API手动更改它,使用命令v4l2-ctl --set-ctrl exposure_absolute=40 ,它运行良好,但我需要为此任务编写脚本。

使用OpenCV的set(cv2.CAP_PROP_EXPOSURE, 20)会导致“VIDEOIO ERROR:V4L:属性暴露(15)不受设备支持”。 我确定网络摄像头支持更改此属性,因为可以使用v4l2这样做,然后我认为问题在于OpenCV的包装器。

我还尝试使用 进程 lib发送终端命令并使用v4l2更改属性。 该命令是subprocess.call('v4l2-ctl --device=/dev/video0 --set-ctrl exposure_absolute=20', shell=True)

结果是exposure_absolute更改但它不适用于我当前的视频捕获。 图1显示了通过脚本设置属性后的结果。 图2显示了通过终端设置相同属性后的结果,同一视频捕获处于活动状态。

通过脚本设置exposure_absolute (图片1)

通过终端设置exposure_absolute (图像2)

在图像1之后立即拍摄图像2,突出显示的线与图像1相同。

我在子进程调用上做错了吗? 或者如何使用脚本更改此属性?

另外,为什么cv2.VideoCapture(id)重置了摄像机属性,在运行脚本之前更改它们是没有用的,是否可以阻止它?

__________________________________________________

编辑:我可能找到了解决此问题的方法。 cv2.read()调用确实是正确的,我只需要在更改属性之前使用cv2.read()一次,显然第一个cv2.read()是重置相机属性的地方。 我仍然不知道如何阻止它自动重置网络摄像头的属性。

如果您使用GStreamer支持构建opencv(标志:-D WITH_GSTREAMER = ON),您可以使用GStreamer管道打开VideoCapture,您可以在其中为v4l2指定所有类型的参数:

std::string cameraPipeline;
cameraPipeline ="v4l2src device=/dev/video0 extra-controls=\"c,exposure_auto=1,exposure_absolute=500\" ! ";
cameraPipeline+="video/x-raw, format=BGR, framerate=30/1, width=(int)1280,height=(int)720 ! ";
cameraPipeline+="appsink";

VideoCapture cap;
cap.open(cameraPipeline);

这适用于C ++和Python。 您可以通过在终端中键入以下内容来获取完整的控件列表:v4l2-ctl --list-ctrls-menus

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM