2.12 滑动条事件

2024-09-01 11:12
文章标签 事件 滑动 2.12

本文主要是介绍2.12 滑动条事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

实验原理

实验代码

运行结果


实验原理

在 OpenCV 中,滑动条设计的主要目的是在视频播放帧中选择特定帧,而在调节图像参数时也会经常用到。在使用滑动条前,需要给滑动条赋予一个名字(通常是一个字符串),接下来将直接通过这个名字进行引用。 

创建滑动条的函数是 createTrackbar,函数声明如下:

int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void* userdata=0)其中参数
trackbarname 是滑动条的名称;
winname 是滑动条将要添加到父窗口的名称,一旦滑动条创建好,它将被添加到窗口的顶部或底部,滑动条不会挡住任何已经在窗口中的图像,只会让窗口变大,窗口的名称将作为一个窗口的标记,至于滑动条上滑动按钮的确切位置,由操作系统决定,一般都是在最左边;
value 是一个指向整数的指针,这个整数值会随着滑动按钮的移动自动变化;
count 是滑动条可以滑动的最大值;
onChange 是一个指向回调函数的指针,当滑动按钮移动时,回调函数就会自动调用;
userdata 可以是任何类型的指针,一旦回调函数执行,这个参数可以传递给回调函数的 userdata 参数,这样不创建全局变量也可以处理滑动条事件。

回调函数类型 TrackbarCallback 的定义如下:

typedef void(* cv::TrackbarCallback) (int pos, void *userdata);其中参数 
pos表示滚动块的当前位置;
userdata是传给回调函数的可选参数。这个回调函数不是必需的,如果直接赋值为 NULL,就没有回调函数,移动滑动按钮的唯一响应就是 createTrackbar的参数 value 指向的变量值的变化。 

除了创建滑动条的函数外,OpenCV 还提供了函数 getTrackbarPos 用于获取滑动块的位置和函数 setTrackbarPos 用于设置滑动条的位置。函数 getTrackbarPos 声明如下: 

int getTrackbarPos(const string& trackbarname, const string& winname);其中参数 
trackName 是滑动条的名称,
windowName 是滑动条将要添加到父窗口的名称。
函数返回滑动块的当前位置。 

函数 setTrackbarPos 声明如下:

void setTrackbarPos(const string& trackbarname, const string& winname, int pos);其中参数 
trackName 表示滚动条的名称,
windowName 是滑动条将要添加到父窗口的名称,
pos表示要设置的滑动块位置。

erode() 函数用于执行图像的腐蚀操作。腐蚀是一种形态学变换,主要用于去除图像中的小斑点噪声、平滑边界、分离粘连的目标物体等。腐蚀操作的基本思想是使用一个结构元素(structuring element)来探测图像中的每个像素点及其周围区域,根据结构元素的位置和形状来决定是否保留中心像素点。

void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),int iterations=1, int borderType=BORDER_CONSTANT,const Scalar& borderValue=Scalar());参数说明
src: 输入图像。
dst: 输出图像,必须与输入图像具有相同的类型和尺寸。
kernel: 结构元素,定义了如何进行局部操作。可以通过getStructuringElement()函数创建。
anchor: 结构元素的锚点位置,默认为结构元素的中心。
iterations: 腐蚀操作的迭代次数,默认为1。更大的迭代次数会导致更强的腐蚀效果。
borderType: 边界类型,指定了图像边界外的像素如何处理,默认为BORDER_CONSTANT,即常数值。
borderValue: 当边界类型为BORDER_CONSTANT时,指定的常数值。

dilate()函数用于执行图像的膨胀操作。膨胀是另一种形态学变换,主要用于填充目标物体中的小孔洞、扩展边界、连接相邻的目标物体等。膨胀操作的基本思想是使用一个结构元素(structuring element)来探测图像中的每个像素点及其周围区域,根据结构元素的位置和形状来决定是否将中心像素点标记为前景。

void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=Scalar());参数说明
src: 输入图像。
dst: 输出图像,必须与输入图像具有相同的类型和尺寸。
kernel: 结构元素,定义了如何进行局部操作。可以通过getStructuringElement()函数创建。
anchor: 结构元素的锚点位置,默认为结构元素的中心。
iterations: 膨胀操作的迭代次数,默认为1。更大的迭代次数会导致更强的膨胀效果。
borderType: 边界类型,指定了图像边界外的像素如何处理,默认为BORDER_CONSTANT,即常数值。
borderValue: 当边界类型为BORDER_CONSTANT时,指定的常数值。

getStructuringElement()函数用于生成一个结构元素(structuring element),这是进行形态学操作(如腐蚀、膨胀、开运算、闭运算等)时必需的一个组件。结构元素定义了如何对图像中的每个像素点及其邻居进行处理。

Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))参数说明
shape: 结构元素的形状,可以是以下几种之一:MORPH_RECT:矩形结构元素。MORPH_CROSS:十字形结构元素。MORPH_ELLIPSE:椭圆形结构元素。MORPH_RECT是最常用的形状,因为它简单且易于理解。MORPH_CROSS和MORPH_ELLIPSE则可能在某些情况下提供更好的性能或特定的应用效果。ksize: 结构元素的大小,由一个Size对象定义,通常是一个奇数大小的正方形。例如,Size(3, 3)表示3x3大小的结构元素。anchor: 结构元素的锚点位置,默认为结构元素的中心。锚点位置决定了结构元素相对于图像中的每个像素点的位置。如果设置了Point(-1, -1),则默认使用结构元素的中心作为锚点。返回值
返回一个Mat对象,代表生成的结构元素。

实验代码

本例利用滑动块调节设置参数——利用滑动块控制腐蚀和膨胀。


#include "pch.h" // 预编译头文件
#include <opencv2/highgui/highgui_c.h> // 包含旧版的highgui模块
#include <opencv2\opencv.hpp> // 包含整个OpenCV库
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 
using namespace cv;// 使用OpenCV命名空间
#include<iostream>// 输入输出流
using namespace std;// 使用标准命名空间Mat src, erosion_dst, dilation_dst;// 定义三个Mat对象,分别存储源图像、腐蚀后的图像和膨胀后的图像
int erosion_elem = 0; // 腐蚀操作核类型,默认为0(矩形)
int erosion_size = 0; // 腐蚀操作核大小,默认为0
//假设你正在使用一个3x3的方形结构元素进行腐蚀操作,那么erosion_size就是3
int dilation_elem = 0;// 膨胀操作核类型,默认为0(矩形)
int dilation_size = 0;// 膨胀操作核大小,默认为0
int const max_elem = 2;// 最大的操作核类型数(矩形、十字形、椭圆)
int const max_kernel_size = 21;// 最大的操作核大小
void Erosion(int, void*);//腐蚀滑动条的回调函数
void Dilation(int, void*);//膨胀滑动条的回调函数
int main(int argc, char** argv)
{src = imread("0901.jpg", IMREAD_COLOR);// 读取图像文件if (src.empty())// 检查图像是否正确加载{cout << "Could not open or find the image!\n" << endl;//cout << "无法打开或找到图像!\n";cout << "Usage: " << argv[0] << " <Input image>" << endl;//cout << "用法: " << argv[0] << " <输入图像>\n";return -1;}namedWindow("Erosion Demo", WINDOW_NORMAL);//腐蚀演示窗口 WINDOW_AUTOSIZEnamedWindow("Dilation Demo", WINDOW_NORMAL);//膨胀演示窗口 WINDOW_NORMAL//moveWindow("Dilation Demo", src.cols, 0);// 移动膨胀演示窗口到屏幕的适当位置//怕此处 腐蚀窗口与膨胀窗口重合/*createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",&erosion_elem, max_elem,Erosion);*/createTrackbar("元素:\n 0: 矩形 \n 1: 十字形 \n 2: 椭圆", "Erosion Demo", &erosion_elem, max_elem, Erosion); // 创建腐蚀操作核类型的滚动条/*createTrackbar("Kernel size:\n 2n +1", "Erosion Demo",&erosion_size, max_kernel_size,Erosion);*/createTrackbar("核大小:\n 2n +1", "Erosion Demo", &erosion_size, max_kernel_size, Erosion);  // 创建腐蚀操作核大小的滚动条/*createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",&dilation_elem, max_elem,Dilation);*/createTrackbar("元素:\n 0: 矩形 \n 1: 十字形 \n 2: 椭圆", "Dilation Demo", &dilation_elem, max_elem, Dilation); // 创建膨胀操作核类型的滚动条/*createTrackbar("Kernel size:\n 2n +1", "Dilation Demo",&dilation_size, max_kernel_size,Dilation);*/createTrackbar("核大小:\n 2n +1", "Dilation Demo", &dilation_size, max_kernel_size, Dilation); // 创建膨胀操作核大小的滚动条Erosion(0, 0);// 初始化腐蚀操作Dilation(0, 0);// 初始化膨胀操作waitKey(0);// 等待按键事件return 0;
}void Erosion(int, void*)
{int erosion_type = 0;// 初始化腐蚀类型为矩形if (erosion_elem == 0){erosion_type = MORPH_RECT; // 初始化腐蚀类型为矩形}else if (erosion_elem == 1){erosion_type = MORPH_CROSS;// 如果选择十字形}else if (erosion_elem == 2){erosion_type = MORPH_ELLIPSE; // 如果选择椭圆}Mat element = getStructuringElement(erosion_type,Size(2 * erosion_size + 1, 2 * erosion_size + 1),Point(erosion_size, erosion_size));// 获取腐蚀操作核erode(src, erosion_dst, element);// 对图像进行腐蚀操作imshow("Erosion Demo", erosion_dst);// 显示腐蚀后的图像
}
void Dilation(int, void*)
{int dilation_type = 0;// 初始化膨胀类型为矩形if (dilation_elem == 0){dilation_type = MORPH_RECT; // 初始化膨胀类型为矩形}else if (dilation_elem == 1) { dilation_type = MORPH_CROSS;// 初始化膨胀类型为十字形}else if (dilation_elem == 2){ dilation_type = MORPH_ELLIPSE; // 初始化膨胀类型为椭圆}Mat element = getStructuringElement(dilation_type,Size(2 * dilation_size + 1, 2 * dilation_size + 1),Point(dilation_size, dilation_size));// 获取腐蚀操作核dilate(src, dilation_dst, element);// 对图像进行膨胀操作imshow("Dilation Demo", dilation_dst);// 显示膨胀后的图像
}  

在代码中,首先读取 0901.jpg,然后利用函数namedWindow 创建两个窗口。接着利用函数createTrackbar 创建 4 个滑动条,每个窗口上两个滑动条(核的类型 和 核的大小)。Erosion 和 Dilation 都是滑动条的回调函数,用于响应用户滑动按钮这个事件。 
函数 erode 和 dilate 分别是 OpenCV 中腐蚀和膨胀图像的函数,图像腐蚀和膨胀是图像学中的两个基本概念。 

运行结果

这篇关于2.12 滑动条事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126772

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig