由于更改摄像头参数,不想在代码或xml文件里一个个更改,查了一圈都只有对图像创建滑动条,于是尝试写了一个视频流创建的案例。目前是回调函数只能放在全局里,不能写成指针或多文件调用。之后会再尝试研究一下。
createTrackerbar
函数原型:
int createTrackbar(
const String &trackbarname,
const String &winname,
int* value,
int count,
TrackbarCallback onChange=0,
void* userdata=0
);
- trackbarname:轨迹条的名字。
- winname:窗口名字。窗口得存在才能创建滑动条,可以用namedWindow()提前创好一个窗口,也可以直接加到imshow的窗口上。
- value(指针):表示滑块的初始值。
- count:滑块的最大值(最小位置的值始终为0)。
- onChange:回调函数,这是需要我们自己定义一个回调函数。
这个函数的定义格式必须为void xxx(int , void*)。调用时的参数无影响,填(0,0)就行。 - userdata:用户传给回调函数的数据。
注意事项
- 一定要记得在createTrackerbar后调用一次回调函数。
- 如果有产生新的图像,那么新的图像变量名不能用之前的变量;如Canny(),结果图像要重新在回调函数canny_track()中编写。
- createTrackbar()是将滑动条和onChange()关联。
onChange()是将滑动条与对应图像的相关操作关联。
创建视频流曝光亮度等滑动条 案例
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始图窗口】"
VideoCapture capture;
double time0;
int exposure = 100;
int maxExposure = 10000;
int brightness = 50;
int maxBrightness = 100;
int saturation = 60;
int maxSaturation = 128;
int Gamma = 72;
int maxGamma = 500;
Mat frame;
void onExposureChange(int pos, void* userdata);
void onBrightnessChange(int pos, void* userdata);
void onSaturationChange(int pos, void* userdata);
void onGammaChange(int pos, void* userdata);
int main( )
{
namedWindow(WINDOW_NAME1,WINDOW_AUTOSIZE);
capture.open(0);
if(false == capture.isOpened())
{
return -1;
}
capture.set(CAP_PROP_EXPOSURE, exposure);
exposure = capture.get(CAP_PROP_EXPOSURE);
cout << ">初始曝光值= " << exposure << endl;
capture.set(CAP_PROP_BRIGHTNESS, brightness);
brightness = capture.get(CAP_PROP_BRIGHTNESS);
cout << ">初始亮度= " << brightness << endl;
capture.set(CAP_PROP_SATURATION, saturation);
saturation = capture.get(CAP_PROP_SATURATION);
cout << ">初始饱和度= " << saturation << endl;
capture.set(CAP_PROP_GAMMA, Gamma);
Gamma = capture.get(CAP_PROP_GAMMA);
cout << ">初始gamma= " << Gamma << endl;
double width = capture.get(CAP_PROP_FRAME_WIDTH);
double height = capture.get(CAP_PROP_FRAME_HEIGHT);
cout << ">宽 = " << width << "; 高 =" << height << endl;
createTrackbar("曝光值", WINDOW_NAME1, &exposure, maxExposure, onExposureChange);
createTrackbar("亮度", WINDOW_NAME1, &brightness, maxBrightness, onBrightnessChange);
createTrackbar("饱和度", WINDOW_NAME1, &saturation, maxSaturation, onSaturationChange);
createTrackbar("Gamma", WINDOW_NAME1, &Gamma, maxGamma, onGammaChange);
while(1)
{
capture >> frame; //读取当前帧
if (frame.empty())
{
break;
}
onExposureChange(0, 0);
onBrightnessChange(0,0);
onSaturationChange(0,0);
onGammaChange(0,0);
//exposure = capture.get(CAP_PROP_EXPOSURE);
//cout << ">设置后: 曝光值= " << exposure << endl;
imshow(WINDOW_NAME1,frame); //显示当前帧
//cout << ">帧率= " << getTickFrequency() / (getTickCount() - time0) << endl;
char c = (char)waitKey(10);
if( c == 27 )
break;
}
return 0;
}
//曝光值变化回调函数
void onExposureChange(int pos, void* userdata)
{
capture.set(CAP_PROP_EXPOSURE, exposure);
}
//亮度变化回调函数
void onBrightnessChange(int pos, void* userdata)
{
//Mat m;
//m = Scalar(brightness, brightness, brightness);
//subtract(frame, m, frame);//减少亮度
//add(frame, m, frame);//增加亮度
//imshow("亮度调整",frame);
capture.set(CAP_PROP_BRIGHTNESS, brightness);
}
void onSaturationChange(int pos, void* userdata)
{
capture.set(CAP_PROP_SATURATION, saturation);
}
void onGammaChange(int pos, void* userdata)
{
capture.set(CAP_PROP_GAMMA, Gamma);
}