OpenCV trackbar 避免使用全局变量-阿里云开发者社区

开发者社区> lovedan> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏
Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏                                            先看效果图。
2307 0
ACCESS 触发器delete table事件变量使用及连续删除
    ACCESS的TABLE DELETE 事件触发后,会出现一个[旧]的记录,这条记录非常有用,可以用来作条件判断使用。     如下图的table event事件中,删除一条记录后,可以使用[旧]记录连接执行多个删除相关记录的操作。
582 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8463 0
使用MANIFEST.MF文件来track War包做持续部署
在我工作的项目中有这样一个需求。当通过自动部署脚本将当前一个CI构建的WAR包部署到指定服务器后,需要验证该WAR包是否被部署成功。 在这个项目中,持续集成服务器使用的是Jenkins,构建脚本使用的是maven,向服务器的部署使用的是Groovy写的部署脚本,调用了Tableuax API。
774 0
使用innobackupex基于从库搭建mysql主从架构
        MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一。但对于较大的数据库则该方式并非理想的选择。使用Xtrabackup可以快速轻松的构建或修复mysql主从架构。
1167 0
使用Innobackupex快速搭建(修复)MySQL主从架构
    MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一。但对于较大的数据库则该方式并非理想的选择。使用Xtrabackup可以快速轻松的构建或修复mysql主从架构。
1121 0
线程同步:条件变量的使用细节分析
如同互斥量和读写锁一样,条件变量也需要初始化和回收#includeint pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond);互斥量和读写锁解决了多线程访问共享变量产生的竞争问题,那么条件变量的作用何在呢。
707 0
+关注
lovedan
计算机科学与技术硕士,专注计算机视觉(目标检测、深度学习),关注Linux环境下各算法配置。
387
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载