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如何实现【不用全局变量进行滚动条控制】的更多相关文章

  1. OpenCV trackbar 避免使用全局变量

    OpenCV trackbar 避免使用全局变量 在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果.但是很不幸,绝大多数教程上使用 ...

  2. Selenium入门11 滚动条控制(通过js)

    这一节要有js基础.做web端的UI自动化必须要有html,css,javascript前端基础. 滚动条控制: 1 移动垂直滚动条 document.documentElement.scrollTo ...

  3. 不用循环控制、条件控制、三目运算符 实现阶乘n!

    long func(int n) { ( n <= 1 && (n=1) ) || ( n*=func(n-1)); return n; } template<int N& ...

  4. 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二

    今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...

  5. WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成

    一.项目背景: 最近,做项目,因为是金融项目,客户登录交易的时候,有一个提示框,就是告知客户要“入市需谨慎”等等,想必大家都遇到这样的场景,当然,这种提示是没人会看的,不过作为交易所,这样的提示又必不 ...

  6. 自定义滚动条——控制div的大小和透明度

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...

  7. Angularjs 滚动条控制

    控制滚动条 依赖 $location, $anchorScroll $scope.gotoTop = function () { $location.hash("top"); $a ...

  8. OpenCV 入门示例之三:AVI 视频播放控制

    前言 在前文中给出了一个非常简短的视频播放程序,但它没有实现常规视频播放器中的播放滚动条功能,本文对此视频播放器程序加以改进,实现此功能. 滚动条的实现思路 滚动条的功能实质上就是从一帧跳跃到另外一帧 ...

  9. Java&Selenium 鼠标键盘及滚动条控制相关方法封装

    一.摘要 本片博文主要展示在使用Selenium with java做web自动化时,一些不得不模拟鼠标操作.模拟键盘操作和控制滚动条的java代码 二.模拟鼠标操作 package util; im ...

随机推荐

  1. 以太坊的crypto模块--以太坊源码学习

    以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...

  2. MarkDown编辑器快捷方式

    常用快捷: Ctrl+K 插入代码块 Ctrl+G 插入图片 Ctrl+B 文字加粗 Ctrl+I 文字倾斜 Ctrl+G 插入图片 Tab 默认新建高亮代码块 ">" 向右 ...

  3. TypeScript 零基础入门

    前言 2015 年末看过一篇文章<ES2015 & babel 实战:开发 npm 模块>,那时刚接触 ES6 不久,发觉新的 ES6 语法大大简化了 JavaScript 程序的 ...

  4. NLTK学习笔记(一):语言处理和Python

    目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...

  5. python面向对象的编程

    self相当于在实例化类的过程中传入参数,实例化对象本身 静态方法,静态字段属于类,动态字段,动态方法输入每一个实例化的对象 类实例化的过程把一些属性,方法封装到一个实例化对象当中 动态字段,动态方法 ...

  6. CentOS上安装redis记录

    下载稳定版 curl -O http://download.redis.io/releases/redis-stable.tar.gz tar -zxvf redis-stable.tar.gz cd ...

  7. ActiveMQ 和消息简介

    Apache ActiveMQ 是远程系统间进行通信的消息代理,实现了 JMS(Java Message Service,Java 消息服务).尽管 ActiveMQ 是使用 Java 写的,但是其提 ...

  8. HTML里的哪一部分Javascript 会在页面加载的时候被执行?

    最近遇到一个问题:HTML里的哪一部分Javascript 会在页面加载的时候被执行()A : 文件头部 B : 文件尾 C : <head>标签部分 D : <body>标签 ...

  9. 【FFmpeg】FFmpeg常用基本命令

    1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acod ...

  10. IntelliJ IDEA:给web应用提供JSTL支持

    最近在看<Head First Servlet JSP>学习JSP,看到JSTL一章,为了添加JSTL支持折腾了好久. 网上的教程五花八门,而且多数比较旧. 我尝试了各种方法都没有成功,很 ...