opencv如何实现【不用全局变量进行滚动条控制】
opencv中自带滚动条,其中一个问题是该回调函数(on_trackbar)大多使用的是全局变量,大型项目调试时弊端众多,比如下图:

为此,留意了void on_Trackbar(int par1, void *)中的第二个参数,
按理说,这是允许用户传递参数进入的,但网上及书籍中未找到不用全局变量而自己传参数的例子,因此特意写了一版可以自己传局部参数的写法。
代码如下:
 #include <opencv2/opencv.hpp>
 namespace ycv {
 #include<iostream>
     class Win {
     public:
         Win(std::string name, int type);
         void imshow(cv::Mat &img);
         std::string getName();
     private:
         std::string name;
     };
 }
 namespace ycv {
     Win::Win(std::string name, int type) {
         this->name = name;
         cv::namedWindow(this->name, type);
     }
     void Win::imshow(cv::Mat &img) {
         cv::imshow(this->name, img);
     }
     std::string Win::getName() {
         return this->name;
     }
 }
 void on_Trackbar1(int par, void *pvoid)
 {
     static void *p0 = (void*)(*( + ((int*)pvoid)));
     static void *p1 = (void*)(*( + ((int*)pvoid)));
     static void *p2 = (void*)(*( + ((int*)pvoid)));
     static void *p3 = (void*)(*( + ((int*)pvoid)));
     static void *p4 = (void*)(*( + ((int*)pvoid)));
     ycv::Win *win = (ycv::Win*)p0;
     cv::Mat *mgray = (cv::Mat*)p1;
     cv::Mat *mbin = (cv::Mat*)p2;
     int *bs = (int*)p3;
     int *value = (int*)p4;
     *bs = par;//diff
     adaptiveThreshold(*mgray, *mbin, ,
         cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY,
         *bs = (*bs >  ? ((*bs) %  ==  ? *bs : *bs + ) : ),
         *value);
     win->imshow(*mbin);
 }
 void on_Trackbar2(int par, void *pvoid)
 {
     static void *p0 = (void*)(*( + ((int*)pvoid)));
     static void *p1 = (void*)(*( + ((int*)pvoid)));
     static void *p2 = (void*)(*( + ((int*)pvoid)));
     static void *p3 = (void*)(*( + ((int*)pvoid)));
     static void *p4 = (void*)(*( + ((int*)pvoid)));
     ycv::Win *win = (ycv::Win*)p0;
     cv::Mat *mgray = (cv::Mat*)p1;
     cv::Mat *mbin = (cv::Mat*)p2;
     int *bs = (int*)p3;
     int *value = (int*)p4;
     *value = par;//diff
     adaptiveThreshold(*mgray, *mbin, ,
         cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY,
         *bs = (*bs >  ? ((*bs) %  ==  ? *bs : *bs + ) : ),
         *value);
     win->imshow(*mbin);
 }
 void on_Trackbar3(int par, void *pvoid)
 {
     static void *p0 = (void*)(*( + ((int*)pvoid)));
     static void *p1 = (void*)(*( + ((int*)pvoid)));
     static void *p2 = (void*)(*( + ((int*)pvoid)));
     static void *p3 = (void*)(*( + ((int*)pvoid)));
     static void *p4 = (void*)(*( + ((int*)pvoid)));
     ycv::Win *win = (ycv::Win*)p0;
     cv::Mat *mgray = (cv::Mat*)p1;
     cv::Mat *mbin = (cv::Mat*)p2;
     int *bs = (int*)p3;
     int *value = (int*)p4;
     *value = par;//dif
     threshold(*mgray, *mbin, *value, , cv::THRESH_BINARY);
     win->imshow(*mbin);
 }
 int main(int argc, char** argv)
 {
     //读取图片、创建窗口
     ycv::Win w1 = ycv::Win("窗口1", CV_WINDOW_NORMAL);
     cv::Mat mgray = cv::imread("out1.jpg");
     cv::Mat mbin;
     if (!mgray.data) {
         std::cout << "read error\n" << std::endl;
         return -;
     }
 #if 1 //转换为HSV空间
     cvtColor(mgray, mgray, CV_BGR2HSV);
 #endif
 #if 1 //分离通道
     std::vector<cv::Mat> sbgr(mgray.channels());
     split(mgray, sbgr);
 #endif
 #if 0 //合并通道
     std::vector<cv::Mat> mbgr(mgray.channels());
     mbgr[] = sbgr[];//or sbgr.at(2);
     mbgr[] = sbgr[];
     mbgr[] = sbgr[];
     merge(mbgr, mgray);
 #endif
 #if 0 //灰度化
     cvtColor(mgray, mgray, CV_BGR2GRAY);
 #endif
     mgray = sbgr[];
     int bs = ;
     int value = ;
     int *p[];
     p[] = (int*)&w1;
     p[] = (int*)&mgray;
     p[] = (int*)&mbin;
     p[] = (int*)&bs;
     p[] = (int*)&value;
 #if 0 //OSTU法
     cv::threshold(mgray, mbin, , , cv::THRESH_BINARY | cv::THRESH_OTSU);//thresh is not setted manually
     w1.imshow(mbin);
 #elif 0 //自适应二值化
     cv::createTrackbar("滑动条1", w1.getName(), &bs, , on_Trackbar1,p);//多个滚动条,需要指明用户参数
     cv::createTrackbar("滑动条2", w1.getName(), &value, , on_Trackbar2);
     on_Trackbar2(bs, p);//显示调用一次,避免未进入之前画面无法显示
 #else //固定二值化
     cv::createTrackbar("滚动条3", w1.getName(), &value, , on_Trackbar3);//单个滚动条,可以不指明用户参数,通过下面的显示调用来指明
     on_Trackbar3(value, p);
 #endif
     cv::waitKey();
     return ;
 }
opencv如何实现【不用全局变量进行滚动条控制】的更多相关文章
- OpenCV trackbar 避免使用全局变量
		OpenCV trackbar 避免使用全局变量 在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果.但是很不幸,绝大多数教程上使用 ... 
- Selenium入门11 滚动条控制(通过js)
		这一节要有js基础.做web端的UI自动化必须要有html,css,javascript前端基础. 滚动条控制: 1 移动垂直滚动条 document.documentElement.scrollTo ... 
- 不用循环控制、条件控制、三目运算符 实现阶乘n!
		long func(int n) { ( n <= 1 && (n=1) ) || ( n*=func(n-1)); return n; } template<int N& ... 
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
		今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ... 
- WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
		一.项目背景: 最近,做项目,因为是金融项目,客户登录交易的时候,有一个提示框,就是告知客户要“入市需谨慎”等等,想必大家都遇到这样的场景,当然,这种提示是没人会看的,不过作为交易所,这样的提示又必不 ... 
- 自定义滚动条——控制div的大小和透明度
		p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ... 
- Angularjs  滚动条控制
		控制滚动条 依赖 $location, $anchorScroll $scope.gotoTop = function () { $location.hash("top"); $a ... 
- OpenCV 入门示例之三:AVI 视频播放控制
		前言 在前文中给出了一个非常简短的视频播放程序,但它没有实现常规视频播放器中的播放滚动条功能,本文对此视频播放器程序加以改进,实现此功能. 滚动条的实现思路 滚动条的功能实质上就是从一帧跳跃到另外一帧 ... 
- Java&Selenium 鼠标键盘及滚动条控制相关方法封装
		一.摘要 本片博文主要展示在使用Selenium with java做web自动化时,一些不得不模拟鼠标操作.模拟键盘操作和控制滚动条的java代码 二.模拟鼠标操作 package util; im ... 
随机推荐
- SQLiteDatabase的使用
			新建DBHeler.JAVA package com.hixin.db; import java.util.ArrayList; import java.util.HashMap; import co ... 
- bytes与str
			Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ... 
- File 常用方法
			1.判断当前文件是否封装的文件夹目录 //返回true--是,false--不是 File file =new File("C:\\Users\\mac\\Desktop\\复习.txt&q ... 
- Oracle体系结构之进程
			Oracle体系结构之进程 一.概述 Oracle中的每个进程都要执行一个特定的任务(或者一组任务),每个进程都会为自己分配内存(PGA)来完成它的任务.一个Oracle实例主要有以下3类进程: (1 ... 
- 我做的第一个程序(菜鸟的java课堂笔记)
			内存: 堆区,栈区,常量区,计数区,代码区: 数据类型: 基本数据类型:整形,浮点型,布尔型 boolean 只能返回真假值,字符型: 引用数据类型:类,数组: 基本数据类型-->直接存放到栈区 ... 
- 基于TF-IDF的新闻标签提取
			基于TF-IDF的新闻标签提取 1. 新闻标签 新闻标签是一条新闻的关键字,可以由编辑上传,或者通过机器提取.新闻标签的提取主要用于推荐系统中,所以,提取的准确性影响推荐系统的有效性.同时,对于将标签 ... 
- sqlmap详细使用 [精简]
			1. 基础用法: 一下./sqlmap.py 在kali和backtrack中使用sqlmap的时候,直接用:sqlmap ./sqlmap.py -u “注入地址” -v 1 –dbs // 列 ... 
- 编写原生JS的insertAfter函数
			DOM里有insertBefore函数,但没有insertAfter函数,所以自己编写一个该函数: function insertAfter(newElement, targetElement){ v ... 
- SQLServer数据库操作
			--创建数据库create database 在线考试系统on(name=在线考试系统_DATA,filename='E:\DB\在线考试系统_DATA.mdf',size=5mb,maxsize=2 ... 
- 重温Android中的消息机制
			引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ... 
