OpenCV trackbar 避免使用全局变量

简介: OpenCV trackbar 避免使用全局变量在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果。但是很不幸,绝大多数教程上使用trackbar的样例代码,都通过全局变量的方式进行调用。

OpenCV trackbar 避免使用全局变量

在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果。但是很不幸,绝大多数教程上使用trackbar的样例代码,都通过全局变量的方式进行调用。此做法,优点:写demo时候快速方便;缺点:糟糕的代码风格。

看看函数原型:

createTrackbar(const string& trackbarname, 
               const string& winname, 
               int* value, 
               int count, 
               TrackbarCallback callback=(TrackbarCallback)0,
               void* userdata=(void*)0
            );

其中最后一个参数,userdata,就是用来解救糟糕代码风格的。把回调函数中“不得不使用的全局变量”们,组装到一起,作为userdata传入createTrackbar函数,就避免了全局变量的使用。组装方式?用一个结构体就可以了;而在回调函数中,则通过类型转化而使用(void*->自定义结构体类型*)

使用trackbar但是不使用全局变量的阈值分割代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

// 自定义结构体类型,将数据打包封装到结构体里
struct FkOpenCV {
    string winname;
    Mat im;
    FkOpenCV(string winname_, Mat& im_):
        winname(winname_), im(im_){}
};

// 回调函数
void on_threshold(int bar_val, void* userdata) {
    cout << "bar_val is:" << bar_val << endl; //bar_val就是createTrackbar调用时的value参数
    FkOpenCV fk = *(FkOpenCV*)(userdata);

    Mat dst;
    threshold(fk.im, dst, bar_val, 255, 0);
    imshow(fk.winname, dst);
}

// demo代码
void thresh_seg_demo() {
    string im_name = "imgs/test.jpg";
    Mat image = imread(im_name);

    namedWindow("原图");
    imshow("原图", image);

    Mat im_gray;
    cvtColor(image, im_gray, CV_BGR2GRAY);

    string winname = "阈值分割";
    namedWindow(winname);
    int value = 30;
    FkOpenCV fk(winname, im_gray);
    createTrackbar("模式", winname, &value, 255, on_threshold, &fk);

    waitKey();
    destroyAllWindows();
}

// 主函数
int main() {
    thresh_seg_demo();
    
    return 0;
}
目录
相关文章
|
1月前
|
编译器 C++
CPP的常量引用
CPP的常量引用
10 0
|
5月前
|
存储 Python
32 python - 局部变量和全局变量
32 python - 局部变量和全局变量
31 0
|
6月前
|
编译器
引用头文件的操作
引用头文件的操作。
25 0
|
4月前
|
存储 算法 安全
opencv基础函数使用
opencv基础函数使用
33 0
|
4月前
|
前端开发 Python
Python 教程之变量(3)—— 全局变量和局部变量
Python 教程之变量(3)—— 全局变量和局部变量
32 0
|
10月前
|
PHP C语言 Python
详解python 局部变量与全局变量
详解python 局部变量与全局变量
|
11月前
|
C++
C++ 你会使用cmath库里的宏常量吗?(π、e、ln2、√2、(2/√π) 等等)
C++ 你会使用cmath库里的宏常量吗?(π、e、ln2、√2、(2/√π) 等等)
126 0
|
计算机视觉 索引
OpenCV findContours函数
OpenCV findContours函数
160 0
OpenCV findContours函数
|
计算机视觉
OpenCV copyTo()函数
OpenCV copyTo()函数
514 0
OpenCV copyTo()函数
|
计算机视觉
使用opencv中的VideoWriter函数,保存视频
使用opencv中的VideoWriter函数,保存视频
559 0