2

我可能只是在谷歌上搜索错了,但我找不到在新的 Open CV 中更改相机属性的方法(读取函数)。我需要禁用相机的自动曝光自动增益
这甚至可能吗?

4

3 回答 3

9

这是一个老问题,但我想为此添加一个解决方案。

opencv 调用底层 v4l 方法来查询帧、设置/获取相机属性等。问题是,调用不完整。同样出于某种原因,该库调用 v4l 方法而不是 v4l2 方法。类似的问题在这里。看来是通过修改opencv代码来解决的。

我还检查了 opencv 是否可以设置 v4l2 支持的属性,例如“手动曝光”、“或自动曝光优先级”。它不能。我玩了 v4l2 来解决这个问题:

#include <libv4l2.h>
#include <linux/videodev2.h>
#include <sys/ioctl.h>
#include <fcntl.h>

// open capture
int descriptor = v4l2_open("/dev/video0", O_RDWR);

// manual exposure control
v4l2_control c;
c.id = V4L2_CID_EXPOSURE_AUTO;
c.value = V4L2_EXPOSURE_MANUAL;
if(v4l2_ioctl(descriptor, VIDIOC_S_CTRL, &c) == 0)
    cout << "success";

// auto priority control
c.id = V4L2_CID_EXPOSURE_AUTO_PRIORITY;
c.value = 0;
if(v4l2_ioctl(descriptor, VIDIOC_S_CTRL, &c) == 0)
    cout << "success";

然后,您可以使用 opencv。

相机控制的完整列表在这里

于 2014-05-02T10:10:25.460 回答
2

所以,有你的 VideoCapture:

VideoCapture cap(0);

现在您可以尝试设置或获取属性:

//may work or not, highly driver/impl specific.
cap.set(CV_CAP_PROP_AUTO_EXPOSURE, 0 ); 
double exposure = cap.get(CV_CAP_PROP_AUTO_EXPOSURE); 

有时您甚至可以通过以下方式访问驱动程序配置对话框:

cap.set(CV_CAP_PROP_SETTINGS , 1 );

这些常数在 highgui_c.h 中,大约 l 333

于 2013-02-23T10:50:56.913 回答
0

您可以使用 OpenCV API 通过VideoCapture::Set()来执行此操作。以下是如何在 Python 中手动设置曝光的示例:

import cv2

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_EXPOSURE,-4)

while(True):
    ret, frame = cap.read()

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

这是我对每帧曝光时间的注释。虽然我相信它们是特定于相机的,但它们会给你一个好主意。

-1 640 毫秒
-2 320 毫秒
-3 160 毫秒
-4 80 毫秒
-5 40 毫秒
-6 20 毫秒
-7 10 毫秒
-8 5 毫秒
-9 2.5 毫秒
-10 1.25 毫秒
-11 650 微秒
-12 312 微秒
-13 150 微秒

相同的功能具有 GAIN 和许多其他值的设置,尽管我没有尝试过。

更多讨论
在 OpenCV 中设置手动曝光

于 2017-06-11T06:01:47.717 回答