在OpenCV / Python中设置相机参数


86

我正在使用来自Thorlabs(DC1545M)的USB摄像机的OpenCV(2.4)和Python(2.7.3)。

我正在对视频流进行一些图像分析,我希望能够从我的视频流中更改某些相机参数。令人困惑的是,我可以更改某些相机属性,但不能更改所有属性,而且我不确定自己做错了什么。

这是在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)

我的问题是:

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

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

注意:相机制造商提供了C ++代码来显示如何执行此操作,但是我不是C ++的专家(长期来看),并且希望使用任何基于python的解决方案。

提前致谢!


3
那么第15个选项是什么,即CV_CAP_PROP_EXPOSURE?不是曝光时间吗?
阿比德·拉赫曼K

3
它是。我要说的是,尝试修改确实会产生任何可衡量的结果。(这是cap.set(15, x),其中没有任何值x会产生可测量的变化。)顺便说一句,谢谢您的博客。这对我通过python加快opencv的速度非常有用。您对此表示支持:)
Mike

4
他给他们打错了号码。它们都太高了。有人请编辑它。
Katastic Voyage

1
@KatasticVoyage完成了,现在对我来说似乎是正确的:)
linusg '18

2
对于opencv 4,我必须从属性名称中删除“ CV”前缀。所以cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Answers:


54

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

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

您的相机也有可能不支持您的请求-大多数USB凸轮既便宜又简单。也许该参数不可用于修改。

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


2
在mac linux窗口上,opencv是否有受支持的摄像机的工作清单?听起来像是将来我会先从软件开始,然后再回到硬件上再购买。编写摄像头驱动程序是一个不错的目标,但是要等到我学会之前,还需要一段时间。
2014年

@sammy我已经发布了有关如何执行此操作的问题。你愿意在这里阐述:stackoverflow.com/questions/27914780/...
evan54

27

我在Raspberry Pi上的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)

您必须使用的时间可能会有所不同


哇,您的代码使我的Logitech c615网络摄像头可以在带有opencv的macbook上使用!“就可以了!” 我已经尝试了好几天了。我认为它不是很高清,也不确定是否可以更改聚焦参数,但这是一个很好的开始。
user391339 2014年

2
我绝不是专家,对我来说3、4和15是神奇的数字。是否可以替代例如CV_CAP_PROP_FRAME_WIDTH?
艾伦·诺加德(AllanNørgaard)2014年

5
cap.set(15,-8.0)是什么意思?我正在尝试在Logitech网络摄像头上设置曝光时间。
user391339'2

1
@ user391339您是否设置了Logitech网络摄像头的曝光时间?
广播公司

@AllanNørgaard是的,标志只是伪装成的整数
Kev1n91 '19

26

为了避免使用整数值来标识VideoCapture属性,可以使用cv2.cv.CV_CAP_PROP_FPSOpenCV 2.4和cv2.CAP_PROP_FPSOpenCV 3.0。(另请参阅下面的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')

2
我花了10分钟的时间来查找那些常量在Python中定义的位置-谢谢!
rescdsk 2013年

2
你是正确的-如果你使用像2.4.9(2014年4月25日从稳定下载版本opencv.org),你必须使用cv2.cv.CV_CAP_PROP_XXXX的东西-更多的相关信息这个看 code.opencv.org/issues/3181 如果您使用可以使用的最新分支机构cv2.CAP_PROP_XXXX
StefanKrüger2014年

最新的Video Capture通用属性列表在此处(OpenCV 4.3)
Mikolasan

8

我也无法解决OpenCV的问题,但是使用Linux时,video4linux(V4L2)解决方法确实适用OpenCV。至少,它可以在具有Rasbian和我便宜的网络摄像头的Raspberry Pi上运行。它不像您希望的那样坚固,轻巧且便于携带,但是在某些情况下,它可能仍然非常有用。

确保已经安装了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。值越低,图像越暗。


这在运行Ubuntu 14.04的基于Toshiba Intel的笔记本电脑上有效。我使用v4l2-ctl设置了我想要的任何选项,包括帧频。我确实使用OpenCV尝试了这些设置,但出现了与上述相同的错误。
Derek Simkowiak

4

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

依靠。对于我便宜的网络摄像头,我必须直接输入所需的值,例如0.1表示1 / 10s。对于昂贵的工业相机,我必须输入-5才能获得2 ^ -5s = 1 / 32s的曝光时间。


OpenCV的set函数可以处理整数吗?
Saeed Masoomi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.