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. 回归-LDA与QDA

    作者:桂. 时间:2017-05-23  06:37:31 链接:http://www.cnblogs.com/xingshansi/p/6892317.html 前言 仍然是python库函数sci ...

  2. 第6章 影响 MySQL Server 性能的相关因素

    前言: 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部分数据操作都是通过数据库管理软件所提供的相关接口 ...

  3. 开涛spring3(6.8) - AOP 之 6.8 切面实例化模型

    所谓切面实例化模型指何时实例化切面. Spring AOP支持AspectJ的singleton.perthis.pertarget实例化模型(目前不支持percflow.percflowbelow ...

  4. 开涛spring3(3.2) - DI之循环依赖

    3.2.1  什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用 CircleC,CircleC引用CircleA ...

  5. docker安装-centos7

    操作系统要求 要安装Docker,您需要64位版本的CentOS 7.步骤:   卸载旧版本 Docker的旧版本被称为docker或docker-engine . 如果这些已安装,请卸载它们以及关联 ...

  6. ORACLE中死锁的知识点总结

      死锁的概念 什么是死锁呢? 其实我们生活中也有很多类似死锁的例子. 我先举一个生活中的例子:过年回家,父亲买了一把水弹枪,儿子和侄子争抢着要先玩,谁也不让谁,拆开包装后,一个抢了枪, 一个逮住了子 ...

  7. PHP基础入门(二)---入门必备哦!

    前言 在上一章中,我们初步了解了PHP的网页基础和PHP的入门基础,今天继续给大家分享更多有关PHP的知识. 理论知识看起来可能比较枯燥一些,但是我们的实践(敲代码)毕竟离不开它. 只有理论与实践相结 ...

  8. 从零开始理解JAVA事件处理机制(1)

    “事件”这个词已经被滥用了.正因为“事件”的被滥用,很多人在用到事件的时候不求甚解,依样画葫芦,导致学习工作了很多年,还是不清楚什么是事件处理器.什么是事件持有者.所以,如果你对于Event这个词还是 ...

  9. javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)

    javaCV图像处理系列: 一.javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 二.javaCV图像处理之2:实时视频添 ...

  10. AES加密解密算法---java

    package com.BFGJ.AES; import java.util.Random; import java.util.StringTokenizer; import javax.crypto ...