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 避免使用全局变量的更多相关文章

  1. VS2008编写MFC程序--使用opencv2.4()

    开始记录VS2008环境下学习OPENCV2.4 头文件: #pragma once #include "CvvImage.h" #include "opencv/cv. ...

  2. 滑动条 Trackbar[OpenCV 笔记9]

    OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能. , ); trackbarname 轨迹条的名字. winname 窗口的名字,轨迹条会依附在这个窗口上. value 一个指向整 ...

  3. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

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

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

  5. opencv笔记3:trackbar简单使用

    time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...

  6. opencv如何实现【不用全局变量进行滚动条控制】

    opencv中自带滚动条,其中一个问题是该回调函数(on_trackbar)大多使用的是全局变量,大型项目调试时弊端众多,比如下图: 为此,留意了void on_Trackbar(int par1, ...

  7. 【bug】“Mat map” opencv全局变量不明确

    Mat map= Mat::zeros(WIN_WIDTH, WIN_HIGH, CV_8UC3);//全局变量 int main() { map.setTo(); } Error map 不明确 s ...

  8. 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整

    学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...

  9. 【OpenCV】直方图

    今天写直方图,学了几个相关函数 1. mixChannels void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const ...

随机推荐

  1. Android 6.0系统动态请求系统相机权限

    private static final int TAKE_PHOTO_REQUEST_CODE = 1; public static String takePhoto(Context context ...

  2. flask 源码剖析

    flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一  偏函数_mro [flask源码梳理]之二  面向对象中__setattr__ [flask源码梳理]之三  Local ...

  3. Pytorch 细节记录

    1. PyTorch进行训练和测试时指定实例化的model模式为:train/eval eg: class VAE(nn.Module): def __init__(self): super(VAE, ...

  4. 004_wireshark专题

    一.常用的wireshark搜索语法 (1) http.request.uri contains "admin/activities" #搜索URL包含"admin/ac ...

  5. CAN总线相关的几个gitlab代码

    https://github.com/brtiberio/ATV71_CANopen.git https://github.com/linux-can/can-utils.git https://gi ...

  6. 简单的三级联动demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. Java二维码生成与解码

      基于google zxing 的Java二维码生成与解码   一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...

  8. Jmeter下载安装配置及使用(windows)

    1 前言 仅作为记录使用. 2 步骤 2.1 下载地址:http://jmeter.apache.org/download_jmeter.cgi 2.2 选择binary版本即可:apache-jme ...

  9. Arrays.asList()vs Collections.singletonList()

    Collections.singletonList(something)是不可变的, 对Collections.singletonList(something)返回的列表所做的任何更改将导致Unsup ...

  10. 小白6步搞定vue脚手架创建项目

    1.安装node及npm node -v (测试node是否安装成功)npm -v(测试npm是否安装成功) 2.安装cnpm npm install -g cnpm --registry=http: ...