OpenCV 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;
}
OpenCV trackbar 避免使用全局变量的更多相关文章
- VS2008编写MFC程序--使用opencv2.4()
开始记录VS2008环境下学习OPENCV2.4 头文件: #pragma once #include "CvvImage.h" #include "opencv/cv. ...
- 滑动条 Trackbar[OpenCV 笔记9]
OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能. , ); trackbarname 轨迹条的名字. winname 窗口的名字,轨迹条会依附在这个窗口上. value 一个指向整 ...
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- opencv笔记3:trackbar简单使用
time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...
- opencv如何实现【不用全局变量进行滚动条控制】
opencv中自带滚动条,其中一个问题是该回调函数(on_trackbar)大多使用的是全局变量,大型项目调试时弊端众多,比如下图: 为此,留意了void on_Trackbar(int par1, ...
- 【bug】“Mat map” opencv全局变量不明确
Mat map= Mat::zeros(WIN_WIDTH, WIN_HIGH, CV_8UC3);//全局变量 int main() { map.setTo(); } Error map 不明确 s ...
- 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整
学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...
- 【OpenCV】直方图
今天写直方图,学了几个相关函数 1. mixChannels void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const ...
随机推荐
- 20165325 2017-2018-2 《Java程序设计》结对编程_第一周:四则运算
一.码云链接 项目名称FAO 码云链接 二.需求分析 实现一个命令行程序: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确 ...
- inception_v2版本《Rethinking the Inception Architecture for Computer Vision》(转载)
转载链接:https://www.jianshu.com/p/4e5b3e652639 Szegedy在2015年发表了论文Rethinking the Inception Architecture ...
- Nest + typeorm
1\ Nest (https://nestjs.com/) is a framework for building efficient, scalable Node.js web appli ...
- 无线桥接(WDS)如何设置?
一.WDS使用介绍 无线桥接(WDS)可以将多台无线路由器通过无线方式互联,从而将无线信号扩展放大.无线终端在移动过程中可以自动切换较好的信号,实现无线漫游. 本文指导将TL-WR740N当作副路由器 ...
- Ubuntu 关闭触摸板
1.关闭 sudo modporbe -r psmouse 2.开启 sudo modprobe psmouse
- mybatis打印SQL日志
在配置的log4j输出时,不能打印SQL信息,在mybatis-config.xml中添加如下配置即可 <settings> <setting name="logImpl& ...
- HBase Snapshot简介
一.简介 HBase 从0.95开始引入了Snapshot,可以对table进行Snapshot,也可以Restore到Snapshot.Snapshot可以在线做,也可以离线做.Snapshot的实 ...
- python old six day
今天主要内容: . is 和== 的区别 . 编程的问题 一. is和==的区别! is 比较的是内存地址 == 比较的是值 记住结果就好 ⑴id 通过id() 我们查看到一个变量表示 ...
- Laravel资源理由器跟隐式控制的对比及是怎样的吧?- Route::resource vs Route::controller
stackoverflow找到的问题:http://stackoverflow.com/questions/23505875/laravel-routeresource-vs-routecontrol ...
- [转]自定义alert弹框,title不显示域名
//(仅去掉网址) (function(){ window.alert = function(name){ var iframe = document.createElement("IFRA ...