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

转载于:https://www.cnblogs.com/zjutzz/p/7843651.html

OpenCV trackbar 避免使用全局变量相关推荐

  1. 颜色识别opencv+trackbar调节目标颜色hsv的阈值

    颜色识别opencv+trackbar调节目标颜色hsv的阈值 颜色识别,trackbar调节颜色阈值 #include <iostream> #include "opencv2 ...

  2. highgui基础 OpenCV trackbar

    在调试程序或者程序执行时需要调整某个变量的值亦或是参数的值,我们需要一个简单方便的操作,滚动条就是一个非常使用的工具.通过鼠标点击对滚动条进行拖动操作以期实现调整某个参数的值.下面例程参见Opencv ...

  3. opencv Trackbar实现带滚动条的视频播放,且滚动条可自动滑动

    为视频添加滚动条,可以实现视频的跳转功能,想播哪里就播哪里,是不是很便捷呢,下面我们就来看看如何实现这个功能,不多说,上代码! <pre name="code" class= ...

  4. 转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整

    [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调整 浅墨_毛星云 2014-03-18 21:43:18 103746 收藏 21 最后发布:2014-03-18 ...

  5. opencv计算图像亮度调节_OpenCV教程创建Trackbar图像对比度、亮度值调整

    这篇文章中我们一起学习了如何在OpenCV中用createTrackbar函数创建和使用轨迹条,以及图像对比度.亮度值的动态调整. 文章首先详细讲解了OpenCV2.0中的新版创建轨迹条的函数crea ...

  6. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  7. c++(和opencv)如何把局部变量变成全局变量的功能

    今天在开发opencv项目的时候,需求是:视频实时播放,鼠标点击某处,新窗口放大播放局部视频. 这里遇到的问题是:需要用opencv获取鼠标. 背景:opencv有自带的鼠标回调函数,而且它的on_M ...

  8. openCV滑动条TrackBar事件实例

    1.原理 函数原型: int createTrackbar( const string& trackname, const string& winname, int *value, i ...

  9. OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例(附完整代码)

    OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例 OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例 OpenCV添加图像轨迹轨迹条 ...

最新文章

  1. 2012年春节网购火车票方法及注意事项
  2. Pyinstaller 打包exe 报错 “failed to execute script XXX“的一种解决方案
  3. opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核
  4. linux通过c语言编程访问远程mysql
  5. ssl1692-魔板【HSAH,bfs】
  6. rest spring_带有Spring的REST的ETag
  7. SQLServer判断循环
  8. ZeroTier内网穿透工具配置
  9. MateBook14一个多月的使用体验(开发向)
  10. Docker web管理界面——Shipyard
  11. I/O多路复用之select,poll,epoll简介
  12. AdminLTE的介绍与使用(详细流程)-----前端框架
  13. linux下thinkpad X1 carbon 2018 电源管理
  14. 360安全备份 android,360安全卫士号码备份如何还原到另一个手机上
  15. html5文字游戏引擎,HTML5游戏实战(3): 60行代码实现水平跑酷游戏
  16. “甲骨文”的传奇故事
  17. Python数据挖掘(2)简单的分类问题
  18. 微贷七年之痒:重线下、追科技、争存量,能否赢未来?
  19. 5 种全局 ID 生成方式、优缺点及改进方案
  20. 梦里什么都有(状压DP)

热门文章

  1. 给DataList分页有两个办法:1、自定义实现分页方法 2、用第三方控件(例如AspNetPager)
  2. 浅谈LINQ to SQL集成数据库语言优劣
  3. python变量名区分大小写_python变量名要不要区分大小写
  4. flask执行python脚本_如何从Flask应用程序执行Shell脚本
  5. 理想制动力分配曲线matlab源代码_电动汽车机电复合制动力分配策略
  6. 声纹识别PLDA模型的理解
  7. 我们身边的知识产权单元测试答案(期末考试复习)【湘潭大学】
  8. K-Means原理详解与Java代码实现细节
  9. CentOs基础操作指令(运行级别)
  10. 关于快速排序的一些理解