我可能只是在谷歌上搜索错了,但我找不到在新的 Open CV 中更改相机属性的方法(读取函数)。我需要禁用相机的自动曝光和自动增益。
这甚至可能吗?
问问题
9112 次
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 回答