【opencv】createTrackbar视频流创建滑动条+曝光亮度参数调节

由于更改摄像头参数,不想在代码或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);
}

好文章记录

关于opencv更改摄像头参数(帧率,分辨率,曝光度……)的几个问题
创建图片阈值调节滑动条

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值