2014-05-01 199 views
0

我在Ubuntu 12.04LTS中編寫了一個簡單的Opencv程序,用於調整網絡攝像頭(Logitech C525)設置,如亮度和曝光等。Ubuntu Opencv相機設置V4L2錯誤曝光控制不支持

它工作在Windows 7罰款,但在Linux中它給我這個錯誤

$ ./adjust-camera
init done
opengl support available
HIGHGUI ERROR: V4L2: Unable to get property Exposure(9963793) - Invalid argument
HIGHGUI ERROR: V4L: Exposure control in V4L is not supported
HIGHGUI ERROR: V4L: Property Exposure(15) not supported by device
HIGHGUI ERROR: V4L: Property Exposure(15) not supported by device
HIGHGUI ERROR: V4L: Property Exposure(15) not supported by device

在一個側面說明,如果我在啓動Ubuntu和插上攝像頭,我可以像奶酪的程序打開它。但是,如果我用相機運行我的Opencv程序,關閉Opencv後,相機將不再能夠在奶酪上顯示。我必須重新啓動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%.*}" 

這裏是腳本什麼相機顯示器奶酪或在Windows中使用我的opencv的程序 Here is what the camera displays with Cheese or in Windows using my Opencv program

這是OpenCV在Ubuntu上顯示的內容 Here is what OpenCV displays on Ubuntu

有關如何解決此問題的任何想法?

+1

我在我的MacBook內置攝像頭上試過這個程序。該程序運行,但沒有任何滑塊做任何事情,我沒有得到任何highgui錯誤。它看起來像相機的Ubuntu驅動程序不支持曝光屬性,而不是平靜地失敗它給你一個錯誤信息。 – SSteve

+0

Linux的攝像頭支持並不是那麼棒,驅動程序的openCV實現最好是shakey。如果你知道你在做什麼,你可以潛入openCV代碼並用你的修補程序重新編譯openCV。如果這不是你的一杯茶,剩下的唯一選擇是提交bugreport /功能請求。 – Nallath

+0

真是無賴!!!!!!我很樂意幫助驅動程序的東西,但不知道該怎麼做(也許是一個模糊的想法),但這裏的問題是時間。我需要這個儘快,所以...呃,這是現在的一個蕭條。 – user3474042

回答

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); 
} 

我希望你覺得它很有用!

相關問題