簡體   English   中英

Ubuntu Opencv相機設置V4L2錯誤不支持曝光控制

[英]Ubuntu Opencv Camera settings V4L2 error Exposure control not supported

我在Ubuntu 12.04LTS中編寫了一個簡單的Opencv程序,該程序可調節網絡攝像頭(Logitech C525)的設置,例如亮度和曝光等。

它在Windows 7中可以正常工作,但在Linux中會給我這個錯誤

$ ./調整相機
初始化完成
提供opengl支持
HIGHGUI錯誤:V4L2:無法獲取屬性Exposure(9963793)-無效的參數
HIGHGUI錯誤:V4L:不支持V4L中的曝光控制
HIGHGUI錯誤:V4L:設備不支持屬性暴露(15)
HIGHGUI錯誤:V4L:設備不支持屬性暴露(15)
HIGHGUI錯誤:V4L:設備不支持屬性暴露(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程序顯示的內容 這是相機使用Cheese或在Windows中使用我的Opencv程序顯示的內容

這是OpenCV在Ubuntu上顯示的內容 這是OpenCV在Ubuntu上顯示的內容

有想法該怎么解決這個嗎?

問題與您使用的范圍有關。 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);
}

希望對你有幫助!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM