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 ...
随机推荐
- Azure Messaging-ServiceBus Messaging消息队列技术系列-索引篇
Azure Messaging ServiceBus Messaging相关的技术系列,最近已经整理了不少了,统一做一个索引链接,置顶. 方便查找,并后续陆陆续续再增加. 学习消息队列技术,可以先看第 ...
- 01-.Net编程机制
.NetFarmwark特点: 多平台:该系统可以在广泛的计算机上运行,包括从服务器.桌面机到PDA和移动电话. 行业标准:该系统使用行业标准的通信协议,比如XML.HTTP.SOAP和WSDL. 安 ...
- Scrapy教程--豆瓣电影图片爬取
一.先上效果 二.安装Scrapy和使用 官方网址:https://scrapy.org/. 安装命令:pip install Scrapy 安装完成,使用默认模板新建一个项目,命令:scrapy s ...
- Myeclipse 配置多个tomcat
1.首先准备多个tomcat 命名为: tomcat-8087 tomcat-8088 tomcat-8089 2.修改对应的server.xml ①:修改关闭时端口,分别设为 8005 8 ...
- 实验:Oracle数据泵导出导入之序列问题
今天同事提出了一个问题: 使用数据泵expdp导出1个schema,有个表主键是触发器自增的id,导入测试库测试时,发现表里的数据比自增序列的值要大.导致插入数据报错. 最终结论是: 由于数据库先进行 ...
- 软件raid 5
软件raid 5的实现 RAID 5 是一种存储性能.数据安全和存储成本兼顾的存储解决方案. RAID 5可以理解为是RAID 0和RAID 1的折中方案.RAID 5可以为系统提供数据安全保障,但保 ...
- [Leetcode] Binary search--275 H-Index
Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize ...
- maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法
1.首先设置依赖项,这样maven就会把该路径下的jar包导入项目引用 <dependency> <groupId>DPSDK-Manager</groupId> ...
- Azure 认知服务 (2) 计算机视觉API - 分析图像
<Windows Azure Platform 系列文章目录> 在上一节内容中,笔者介绍了微软认知服务的概览. 在本节中,笔者将详细介绍微软认知服务中的一种:计算机视觉 (Computer ...
- 搭建vue开发环境及各种报错处理
1.安装node.js 参考教程:http://nodejs.cn/download/ 我的是windows 64位系统,以此为例: (1)打开 http://nodejs.cn/download/ ...