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. Mac电脑如何搭建php环境,并且开发php.

    这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.12.4为例,需要的朋友可以参考下! Mac O ...

  2. 基于底层的 XML 的解析方式详解

    在上一篇博客中,我们介绍了什么是 XML ,http://www.cnblogs.com/ysocean/p/6901008.html,那么这一篇博客我们介绍如何来解析 XML . 部分文档引用:ht ...

  3. grant all赋权后mysql.user表权限字段还是N,但能登录和新建表

    grant all赋权后mysql.user表权限字段还是N,但能登录和新建表 grant all privileges on linuxeye.* to linuxeye@'localhost' i ...

  4. Promise (1) 初步接触

    总想着王者荣耀排位赛再提升个等级就弃掉游戏好好学习,然而打了两个周也没升上去,看来是应该换个方向发挥了. 最近看了<javascript Promise迷离书>,对Promise的理解颇有 ...

  5. 简易-五星评分-jQuery纯手写

    超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...

  6. C/C++遍历目录下的所有文件(Windows/Linux篇,超详细)

    本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6815924.html. 前面的一篇文章我们讲了用Windows API遍历一个目录下的所有文 ...

  7. 你是否也在学习ES6 Promise时遇到过这个问题?

    背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.p ...

  8. MAVEN总结,整合Eclipse以及配置私服

    对maven的理解 我们知道maven是一个项目管理工具,其核 心特点就是通过maven可以进行jar包的依赖管理,保证jar包版本的一致性,以及可以使多个项目共享jar包,从而能够 在开发大型jav ...

  9. 常见的Message Queue应用场景

    在最近的工作的里面有同事问到我说,为什么我们需要一个Message Queue,Message Queue可以在哪些地方用,经过一些整理,大概能找到这些点,假如你有这方面的要求,也可以考虑使用Mess ...

  10. Nginx实用教程(二):配置文件入门

    Nginx配置文件结构 nginx配置文件由指令(directive)组成,指令分为两种形式,简单指令和区块指令. 一条简单指令由指令名.参数和结尾的分号(;)组成,例如: listen backlo ...