Ubuntu Opencv Camera settings V4L2 error 不支持曝光控制

Posted

技术标签:

【中文标题】Ubuntu Opencv Camera settings V4L2 error 不支持曝光控制【英文标题】:Ubuntu Opencv Camera settings V4L2 error Exposure control not supported 【发布时间】:2014-05-01 23:36:18 【问题描述】:

我在 Ubuntu 12.04LTS 中编写了一个简单的 Opencv 程序,用于调整网络摄像头 (Logitech C525) 设置,例如亮度和曝光等。

它在 Windows 7 中运行良好,但在 Linux 中却出现此错误

$ ./adjust-camera 初始化完成 提供 opengl 支持 HIGHGUI 错误:V4L2:无法获取属性 Exposure(9963793) - 无效参数 HIGHGUI 错误:V4L:不支持 V4L 中的曝光控制 HIGHGUI 错误:V4L:设备不支持 Property Exposure(15) HIGHGUI 错误:V4L:设备不支持 Property Exposure(15) HIGHGUI 错误:V4L:设备不支持 Property Exposure(15)

附带说明,如果我启动 Ubuntu 并插入网络摄像头,我可以使用 Cheese 之类的程序打开它。但是如果我用相机运行我的 Opencv 程序,在我关闭 Opencv 后,相机将不再能够在 Cheese 上显示。我必须重新启动 Ubuntu 才能让它与其他任何东西一起工作。

这里是代码adjust-camera.cpp

#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"       // Basic OpenCV structures (cv::Mat)
#include "opencv2/highgui/highgui.hpp"  // Video write

#include "string.h"

using namespace cv;
using namespace std;

void calibrateCamera();
void getCameraVals();
VideoCapture cam(0);
//variables for cam camera
int brightness_slider=125;
int contrast_slider=86;
int gain_slider=77;
int saturation_slider=34;
int exposure_slider=6; //exposure range is from 0 to -7. 

int main()


namedWindow("camera 1",WINDOW_AUTOSIZE);
Mat frame;
getCameraVals();
createTrackbar("Brightness", "camera 1", &brightness_slider, 255);
createTrackbar("Contrast", "camera 1", &contrast_slider, 255);
createTrackbar("Gain", "camera 1", &gain_slider, 255);
createTrackbar("Saturation", "camera 1", &saturation_slider, 255);
createTrackbar("Exposure", "camera 1", &exposure_slider, 2047);

while(true)

    calibrateCamera();
    cam>>frame;
    imshow("camera 1",frame);
    if(waitKey(3)>=0) break;

return(0);


void getCameraVals()

brightness_slider = cam.get(CV_CAP_PROP_BRIGHTNESS);
contrast_slider = cam.get(CV_CAP_PROP_CONTRAST);
gain_slider=cam.get(CV_CAP_PROP_GAIN);
saturation_slider=cam.get(CV_CAP_PROP_SATURATION);
exposure_slider=cam.get(CV_CAP_PROP_EXPOSURE);


void calibrateCamera()

cam.set(CV_CAP_PROP_BRIGHTNESS, brightness_slider);
cam.set(CV_CAP_PROP_CONTRAST, contrast_slider);
cam.set(CV_CAP_PROP_GAIN, gain_slider);
cam.set(CV_CAP_PROP_SATURATION, saturation_slider);
cam.set(CV_CAP_PROP_EXPOSURE, exposure_slider);
//cam.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
//cam.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

这是我用来编译的脚本

![enter image description here][1]ls#!/bin/bash
echo "compiling $1"
if [[ $1 == *.c ]]
then
    gcc -ggdb `pkg-config --cflags opencv` -o `basename $1 .c` $1 `pkg-config --libs opencv`;
elif [[ $1 == *.cpp ]]
then
    g++ -ggdb `pkg-config --cflags opencv` -o `basename $1 .cpp` $1 `pkg-config --libs opencv`;
else
    echo "Please compile only .c or .cpp files"
fi
echo "Output file => $1%.*"

这是相机使用 Cheese 或在 Windows 中使用我的 Opencv 程序显示的内容

这是 OpenCV 在 Ubuntu 上显示的内容

关于如何解决这个问题的任何想法?

【问题讨论】:

我在 MacBook 的内置摄像头上试用了该程序。程序运行了,但没有一个滑块做任何事情,我也没有得到任何 highgui 错误。看起来相机的 Ubuntu 驱动程序不支持 Exposure 属性,而不是安静地失败,而是给你一条错误消息。 Linux 的网络摄像头支持不是很好,驱动程序的 openCV 实现充其量也很不稳定。如果您知道自己在做什么,则可以深入研究 openCV 代码并使用您的修复程序重新编译 openCV。如果那不是您的理想之选,那么剩下的唯一选择就是提交错误报告/功能请求。 太糟糕了!!!!!!我很想帮助驱动程序,但不知道该怎么做(也许是一个模糊的想法),但这里的问题是时间。我需要这个尽快,所以......呃,现在这是一个半身像。 【参考方案1】:

问题与您使用的范围有关。 CV 属性的值是 0 到 1 之间的两倍,但您使用的轨迹栏的值从 0 到 255... 一种可能的解决方案是将所有内容放在相同的范围内,例如从 0 到 100。

#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"       // Basic OpenCV structures (cv::Mat)
#include "opencv2/highgui/highgui.hpp"  // Video write

#include "string.h"

using namespace cv;
using namespace std;

void calibrateCamera();
void getCameraVals();
VideoCapture cam(0);
//variables for cam camera
int brightness_slider=25;
int contrast_slider=86;
int gain_slider=77;
int saturation_slider=34;
int exposure_slider=6; //exposure range is from 0 to -7. 

int main()


namedWindow("camera 1",WINDOW_AUTOSIZE);
Mat frame;
getCameraVals();
createTrackbar("Brightness", "camera 1", &brightness_slider, 100);
createTrackbar("Contrast", "camera 1", &contrast_slider, 100);
createTrackbar("Gain", "camera 1", &gain_slider, 100);
createTrackbar("Saturation", "camera 1", &saturation_slider, 100);
createTrackbar("Exposure", "camera 1", &exposure_slider, 100);

while(true)

    calibrateCamera();
    cam>>frame;
    imshow("camera 1",frame);
    if(waitKey(3)>=0) break;

return(0);


void getCameraVals()

brightness_slider = cam.get(CV_CAP_PROP_BRIGHTNESS)*100;
contrast_slider = cam.get(CV_CAP_PROP_CONTRAST)*100;
gain_slider=cam.get(CV_CAP_PROP_GAIN)*100;
saturation_slider=cam.get(CV_CAP_PROP_SATURATION)*100;
exposure_slider=cam.get(CV_CAP_PROP_EXPOSURE)*100;


void calibrateCamera()

cam.set(CV_CAP_PROP_BRIGHTNESS, double(brightness_slider/100));
cam.set(CV_CAP_PROP_CONTRAST, double(contrast_slider/100));
cam.set(CV_CAP_PROP_GAIN, double(gain_slider/100));
cam.set(CV_CAP_PROP_SATURATION, double(saturation_slider/100));
cam.set(CV_CAP_PROP_EXPOSURE, double(exposure_slider/100));
//cam.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
//cam.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

希望对你有用!!!

【讨论】:

以上是关于Ubuntu Opencv Camera settings V4L2 error 不支持曝光控制的主要内容,如果未能解决你的问题,请参考以下文章

试图让 OpenCV 工作的时间很糟糕

错误:包 android.hardware.camera2 不存在 OpenCV

OpenCV 相机参数标定(Camera Calibration)

使用Android IP Camera(python)在openCv中直播

Raspiberry Camera详解+picamera库+Opencv控制

RPi 2B python opencv camera demo example