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 ...
随机推荐
- OpenCV探索之路(十三):详解掩膜mask
在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...
- 重构了cxlt-vue2-toastr插件
距离上篇文章已经过去一个多月了,期间有很多想法,但时间真不是想挤就能挤出来的.其实这段时间我就做了一件事,一个小程序的项目,已上线半月有余,也迭代了几个版本,现在还在不断完善. 先说点题外话,我们做了 ...
- Running R jobs quickly on many machines(转)
As we demonstrated in “A gentle introduction to parallel computing in R” one of the great things abo ...
- Windows、Office系列产品精华部分集锦
提示 有了这个帖子麻麻再也不用担心我因为四处找Microsoft家的软件和系统而四处劳累所烦恼了! 首先,你们最爱的老XP同志,XP同志虽然退休了,但是依然坚持在岗位上,向他致敬!! Windows ...
- Python+requests库 POST接口图片上传
捕获到POST接口的请求参数,如下: 包括data.file两个部分,上传代码如下: 比较简单,直接发送files参数即可 heads中 content-type 折腾了1个小时,呵呵
- Mac系统占用空间大、空间不够、查看系统文件大小分布
最近电脑老提示空间不够,甚是心烦,决定研究下,为啥空间这么快就花完了. 如图,256的空间,就剩下几个G了,其中最大头的系统占用:160G,占比60%多,我勒个擦... 正常情况下:我们可以点击管理, ...
- [BZOJ4008]亚瑟王
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- 二阶段项目所遇问题 如何实现php向js传输数据
首先当前页面做了一个双处理的界面,就是有PhP也有JS的处理界面. 上一个传值界面是一个PHP的传值,结果,在当前页面的JS中也要用到上一界面传的值,这时发现,PHP与JS就像是两个互相孤立的小岛,根 ...
- Bash中的字符串变量扩展
1.向尾部方向的最小化删除 (%) $pathname="/usr/bin/local/bin"$echo ${pathname%/bin*}/usr/bin/local 2.向尾 ...