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

在OpenCV/Python中设置摄影机参数,python,opencv,camera,python-2.7,Python,Opencv,Camera,Python 2.7,我正在使用OpenCV(2.4)和Python(2.7.3)以及Thorlabs(DC1545M)的USB摄像头 我正在视频流上做一些图像分析,我希望能够从我的视频流中更改一些相机参数。令人困惑的是,我能够改变一些相机属性,但不是全部,我不确定我做错了什么 下面是使用Python中的cv2绑定的代码,我可以确认它是否运行: import cv2 #capture from camera at location 0 cap = cv2.VideoCapture(0) #set the widt

我正在使用OpenCV(2.4)和Python(2.7.3)以及Thorlabs(DC1545M)的USB摄像头

我正在视频流上做一些图像分析,我希望能够从我的视频流中更改一些相机参数。令人困惑的是,我能够改变一些相机属性,但不是全部,我不确定我做错了什么

下面是使用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.
2. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file
3. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
4. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
5. CV_CAP_PROP_FPS Frame rate.
6. CV_CAP_PROP_FOURCC 4-character code of codec.
7. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
8. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
9. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
10. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
11. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
12. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
13. CV_CAP_PROP_HUE Hue of the image (only for cameras).
14. CV_CAP_PROP_GAIN Gain of the image (only for cameras).
15. CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
16. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
17. CV_CAP_PROP_WHITE_BALANCE Currently unsupported
18. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
(请注意,正如评论员Markus Weber在下面指出的,在OpenCV 4中,您必须从属性名称中删除“CV”前缀,例如
cv2.CV\u CAP\u PROP\u FRAME\u HEIGHT->cv2.CAP\u PROP\u FRAME\u HEIGHT

我的问题是:

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

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

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

并非所有相机都支持所有参数-实际上,它们是OpenCV库中最麻烦的部分之一。每种摄像机类型——从android摄像机到USB摄像机再到专业摄像机——都提供了不同的界面来修改其参数。OpenCV代码中有许多分支可以支持尽可能多的分支,但当然并不是所有的分支都包含在内

您可以做的是调查您的相机驱动程序,为OpenCV编写补丁并将其发送到code.OpenCV.org。这样别人会喜欢你的工作,就像你喜欢别人一样

还有一种可能性是,您的相机不支持您的请求-大多数USB摄像头价格便宜且简单。可能该参数不可用于修改


如果你确信相机支持给定的PARAM(你说相机制造商提供了一些代码),并且不想弄乱OpenCV,那么你可以在C++中用Boosi::Python包装这个示例代码,使其在Python中可用。然后,享受使用它的乐趣。

我在树莓皮上的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)

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

为了避免使用整数值来标识
VideoCapture
属性,可以使用,例如OpenCV 2.4中的
cv2.cv.cv.CAP\u PROP\u FPS
和OpenCV 3.0中的
cv2.CAP\u PROP\u FPS
。(另请参见下文Stefan的评论。)

下面是一个适用于OpenCV 2.4和3.0的实用程序函数:

# returns OpenCV VideoCapture property id given, e.g., "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的问题,但在使用Linux时,video4linux(V4L2)解决方案确实可以与OpenCV一起使用。至少,在我的树莓皮上,它和我的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

它会将您的相机快门时间覆盖为手动设置,并将最后一个参数的快门时间(以毫秒为单位)更改为(在本例中)10。该值越低,图像越暗。

如果有人仍然想知道CV\u CAP\u PROP\u EXPOSURE中的值可能是什么:


视情况而定。对于我的廉价网络摄像头,我必须直接输入所需的值,例如0.1表示1/10秒。对于昂贵的工业相机,我必须输入-5以获得2^-5s=1/32s的曝光时间。

那么第15个选项是什么,即CV\u CAP\u PROP\u曝光?这不是曝光时间吗?是的。我想说的一点是,试图修改它确实会产生任何可测量的结果。(这是
cap.set(15,x)
,其中
x
的值不会产生可测量的变化。)顺便说一下,谢谢你的博客。它对我通过python快速使用opencv非常有用。你会得到一张赞成票:)他把他们的数目弄错了。它们都太高了。有人请编辑它。@KatasticVoyage完成了,现在对我来说似乎是对的:)对于opencv 4,我必须从属性名称中删除“CV”前缀。所以
cv2.CV\u CAP\u PROP\u FRAME\u HEIGHT
->
cv2.CAP\u PROP\u FRAME\u HEIGHT
我花了10分钟试图找到这些常量在Python中定义的位置-谢谢!你是对的-如果你使用像2.4.9(2014-04-25稳定下载)这样的版本,你必须使用
cv2.cv.cv\u CAP\u PROP\u XXXX
东西-有关这方面的更多信息,请查看你是否使用了最新的分支,你可以使用
cv2.CAP\u PROP\u XXXX
视频捕获通用属性的最新列表是(OpenCV 4.3)是否有mac linux windows上支持opencv的摄像头的工作列表?这听起来像在未来,我将开始与软件,然后工作回到硬件之前购买。编写相机驱动程序是一个很好的目标,但要学会它还需要一段时间。@sammy我已经发布了一个关于如何做到这一点的问题。你想在这里详细说明一下吗:哇,你的代码让我的罗技c615网络摄像头在我的macbook上用opencv工作!“真管用!”我已经试了好几天了。我认为它不是很高清,也不确定我是否可以改变焦距参数,但这是一个非常好的开始。我绝对不是专家,3、4和15对我来说是神奇的数字。它是CV\U CAP\U PROP\U FRAME\U WITH的替代品吗?CAP.set(15,-8.0)是什么意思?我正试图在我的logitech网络摄像头上设置曝光时间。@user391339你在logitech网络摄像头上设置曝光时间了吗?@AllanNørgaard是的,这些标志只是伪装的整数。这在我运行Ubuntu 14.04的东芝英特尔笔记本电脑上运行。我用v