【问题标题】:Configuring camera properties in new OCV 2.4.3在新的 OCV 2.4.3 中配置相机属性
【发布时间】:2017-06-12 02:06:49
【问题描述】:

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

【问题讨论】:

    标签: c++ opencv webcam


    【解决方案1】:

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

    opencv 调用底层 v4l 方法来查询帧、设置/获取相机属性等。问题是,调用不完整。同样出于某种原因,该库调用 v4l 方法而不是 v4l2 方法。类似问题here。好像是通过修改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。

    相机控件的完整列表是here

    【讨论】:

    • 只是好奇,这些设置是持久的吗?
    • 非常感谢!我一直在寻找这样的解决方案很长时间。 +1
    • 谢谢,这真的很有帮助!在碰到这里之前,我已经在谷歌上搜索了几个小时来寻找这个简单的解决方案。
    【解决方案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

    【讨论】:

    • 那么,如果该函数没有返回错误,但不工作,这是否意味着我的网络摄像头不支持该操作?是否有一些返回值可能让我知道操作失败?
    • 它可能只是没有实现。可悲的是,除了“工作”与否之外,没有办法找出答案。但是,由于这些设置在大多数情况下会永久存储在驱动程序中,因此您可以尝试使用其他程序来访问您的 cam(vlc!!) 并尝试在那里进行设置
    • 我也有使用其他应用程序配置相机的想法,但我正在为不想使用第三方(下载)软件的公司做程序。所以我的应用程序应该集成了所有功能。
    • 好吧,如果驱动程序允许更改此属性,至少使用另一个程序会告诉您(开发人员)。如果不是这样,你可以从opencv中做到这一点的可能性就越大。就我而言,我可以设置 HUE,但不能设置 EXPOSURE
    • 我们都是从小做起,我也是 :)
    【解决方案3】:

    您可以使用 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 和许多其他值的设置,虽然我没有尝试过。

    更多讨论
    Setting Manual Exposure in OpenCV

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      相关资源
      最近更新 更多