在 OpenCV/Python 中设置相机参数

Posted

技术标签:

【中文标题】在 OpenCV/Python 中设置相机参数【英文标题】:Setting Camera Parameters in OpenCV/Python 【发布时间】:2012-07-10 08:50:23 【问题描述】:

我将 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_CAP_PROP_FRAME_HEIGHT -> cv2.CAP_PROP_FRAME_HEIGHT)

我的问题是:

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

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

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

提前致谢!

【问题讨论】:

那么第 15 个选项是什么,即 CV_CAP_PROP_EXPOSURE ?不是曝光时间吗? 是的。我要说的是,尝试修改确实会产生任何可衡量的结果。 (这是cap.set(15, x)x 的值不会产生可衡量的变化。)顺便说一句,谢谢你的博客。它对我通过 python 熟悉 opencv 非常有用。你会为此投赞成票:) 他编号错误。他们都太高了。请有人编辑它。 @KatasticVoyage 完成,现在对我来说似乎是正确的 :) 对于 opencv 4,我必须从属性名称中删除“CV”前缀。所以cv2.CV_CAP_PROP_FRAME_HEIGHT -> cv2.CAP_PROP_FRAME_HEIGHT 【参考方案1】:

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

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

您的相机也有可能不支持您的要求 - 大多数 USB 相机既便宜又简单。也许该参数无法修改。

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

【讨论】:

在 mac linux windows 上是否有支持 opencv 的摄像头工作列表?听起来将来我将从软件开始,然后在购买前回到硬件。编写相机驱动程序是一个不错的目标,但我还需要一段时间才能学会这样做。 @sammy 我已经发布了一个关于如何执行此操作的问题。你愿意在这里详细说明:***.com/questions/27914780/…【参考方案2】:

我在 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)

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

【讨论】:

哇,您的代码让我的罗技 c615 网络摄像头可以在我的带有 opencv 的 macbook 上工作! “它只是工作!”我已经尝试了好几天了。我不认为它很高清,不确定我是否可以改变焦点参数,但一个非常好的开始。 我绝不是专家,3、4 和 15 对我来说都是神奇的数字。它是替代品吗? CV_CAP_PROP_FRAME_WIDTH? cap.set(15, -8.0) 是什么意思?我正在尝试在我的罗技网络摄像头上设置曝光时间。 @user391339 你设置罗技网络摄像头的曝光时间了吗? @AllanNørgaard 是的,这些标志只是伪装的整数【参考方案3】:

为避免使用整数值来识别VideoCapture 属性,可以使用例如,OpenCV 2.4 中的cv2.cv.CV_CAP_PROP_FPS 和 OpenCV 3.0 中的cv2.CAP_PROP_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')

【讨论】:

我花了 10 分钟试图找到这些常量在 Python 中的定义位置 - 谢谢! 你是对的——如果你使用像 2.4.9 这样的版本(2014-04-25 从opencv.org 稳定下载),你必须使用cv2.cv.CV_CAP_PROP_XXXX 的东西——关于这个的更多信息看到code.opencv.org/issues/3181如果你使用最新的分支你可以使用cv2.CAP_PROP_XXXX 最新的视频捕捉通用属性列表是here (OpenCV 4.3)【参考方案4】:

我也无法解决 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

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

【讨论】:

这适用于我运行 Ubuntu 14.04 的基于东芝英特尔的笔记本电脑。我使用 v4l2-ctl 来设置我想要的任何选项,包括帧速率。我确实使用 OpenCV 尝试了这些设置,但得到了与上述相同的错误。【参考方案5】:

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

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

【讨论】:

OpenCV的set函数可以处理整数吗?

以上是关于在 OpenCV/Python 中设置相机参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow C++ 中设置 inter_op_parallelism_threads 和 intra_op_parallelism_threads 以进行 Seesion 配置

在 android 中设置显示方向后,相机相机预览不正确

如何从图库和相机的 imageview 中设置图像? [复制]

在相机android中设置矩形焦点

如何在android中设置相机预览的大小

在 SceneKit 中设置相机的视点