在OpenCV / Python中设置摄像机参数

我使用Thorlabs(DC1545M)的USB摄像头使用OpenCV(2.4)和Python(2.7.3)。

我正在做一些videostream的图像分析,我希望能够改变我的videostream的一些相机参数。 令人困惑的是,我能够改变一些相机的属性,但不是所有的,而我不确定我做错了什么。

这里是代码,使用Python中的cv2绑定,我可以确认它运行:

import cv2 #capture from camera at location 0 cap = cv2.VideoCapture(0) #set the width and height, and UNSUCCESSFULLY set the exposure time cap.set(3,1280) cap.set(4,1024) cap.set(15, 0.1) while True: ret, img = cap.read() cv2.imshow("input", img) #cv2.imshow("thresholded", imgray*thresh2) key = cv2.waitKey(10) if key == 27: break cv2.destroyAllWindows() cv2.VideoCapture(0).release() 

作为参考, cap.set()命令中的第一个参数引用下面列出的相机属性的枚举:

 0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds. 1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next. 3. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file 4. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. 5. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. 6. CV_CAP_PROP_FPS Frame rate. 7. CV_CAP_PROP_FOURCC 4-character code of codec. 8. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. 9. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . 10. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. 11. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). 12. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). 13. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). 14. CV_CAP_PROP_HUE Hue of the image (only for cameras). 15. CV_CAP_PROP_GAIN Gain of the image (only for cameras). 16. CV_CAP_PROP_EXPOSURE Exposure (only for cameras). 17. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. 18. CV_CAP_PROP_WHITE_BALANCE Currently unsupported 19. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently) 

我的问题是:

是否有可能通过python / opencv设置相机曝光时间(或其他相机参数)?

如果没有,我将如何去设置这些参数?

注意:相机制造商提供的C ++代码显示了如何做到这一点,但我不是C ++专家(很长一段时间),并会欣赏任何基于python的解决scheme。

提前致谢!

并非所有的摄像头都支持所有的参数 – 实际上,它们是OpenCV库中最麻烦的部分之一。 每个相机types – 从android相机到usb相机到专业相机都提供了不同的界面来设置参数。 OpenCV代码中有许多分支可以支持其中的许多分支,但是当然并不是涵盖所有的可能性。

你可以做的是调查你的摄像头驱动程序,打开OpenCV的补丁,并将其发送到code.opencv.org。 这样,其他人将享受你的工作,就像你享受别人的一样。

您的相机也可能不支持您的请求 – 大多数USB摄像头便宜,简单。 也许这个参数不能用于修改。

如果您确定相机支持给定的参数(您说相机制造商提供了一些代码),并且不想混淆OpenCV,那么可以使用boost :: python将示例代码封装在C ++中,以使其在Python中可用。 然后,享受使用它。

为避免使用整数值来标识VideoCapture属性,可以使用OpenCV 2.4中的cv2.CAP_PROP_FPS和OpenCV 3.0中的cv2.CAP_PROP_FPS 。 (另请参阅下面的Stefan的评论。)

这里有一个适用于OpenCV 2.4和3.0的实用函数:

 # returns OpenCV VideoCapture property id given, eg, "FPS" def capPropId(prop): return getattr(cv2 if OPCV3 else cv2.cv, ("" if OPCV3 else "CV_") + "CAP_PROP_" + prop) 

OPCV3是在我的实用程序代码中设置的,如下所示:

 from pkg_resources import parse_version OPCV3 = parse_version(cv2.__version__) >= parse_version('3') 

我在树莓派上的OpenCV有同样的问题…不知道这是否可以解决你的问题,但是对我来说有效的是

 import time import cv2 cap = cv2.VideoCapture(0) cap.set(3,1280) cap.set(4,1024) time.sleep(2) cap.set(15, -8.0) 

你必须使用的时间可以不同

我无法解决OpenCV问题,但是在使用Linux时,video4linux(V4L2)解决方法可以 OpenCV一起工作。 至less,它在我的Raspberry Pi上用Rasbian和我便宜的摄像头。 这并不像你想要的那么坚固,轻便和便携,但是在某些情况下,它可能是非常有用的。

确保安装了v4l2-ctl应用程序,例如从Debian v4l-utils软件包中安装。 比运行(在运行python应用程序之前,或从内部)命令:

 v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10 

它会将相机快门时间改写为手动设置,并将最后一个参数(以本例为例)中的快门时间(以ms?为单位)更改为10.此值越低,图像越暗。

如果有人仍然想知道CV_CAP_PROP_EXPOSURE的值是什么:

依靠。 对于我的廉价的摄像头,我必须直接input所需的值,例如1 / 10s的0.1。 对于昂贵的工业相机,我必须input-5来获得2 ^ -5s = 1 / 32s的曝光时间。