Ubuntu Opencv Настройки камеры Ошибка V4L2 Контроль экспозиции не поддерживается
Я написал простую программу Opencv в Ubuntu 12.04LTS, которая регулирует настройки веб-камеры (Logitech C525), такие как яркость, экспозиция и тому подобное.
В Windows 7 работает нормально, но в Linux выдает эту ошибку
$ ./adjust-camera
инициализация выполнена
Доступна поддержка OpenGL
HIGHGUI ERROR: V4L2: невозможно получить экспозицию свойства (9963793) - неверный аргумент
HIGHGUI ERROR: V4L: Контроль экспозиции в V4L не поддерживается
HIGHGUI ERROR: V4L: Экспозиция свойства (15) не поддерживается устройством
HIGHGUI ERROR: V4L: Экспозиция свойства (15) не поддерживается устройством
HIGHGUI ERROR: V4L: Экспозиция свойства (15) не поддерживается устройством
Кроме того, если я загружаю Ubuntu и подключаю веб-камеру, я могу открыть ее с помощью такой программы, как Cheese. Но если я запускаю свою программу Opencv с камерой, после закрытия Opencv камера больше не сможет показываться на Cheese. Я должен перезагрузить Ubuntu, чтобы он работал с чем-либо еще.
Вот код настройки-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
Любые идеи о том, как это исправить?
1 ответ
Проблема связана с диапазонами, которые вы используете. Значения свойств CV являются двойными между 0 и 1, но вы используете трекбары со значениями от 0 до 255... Одно из возможных решений si - поместить все в один и тот же масштаб, например, от 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);
}
Я надеюсь, что вы найдете это полезным!