OpenCV GUI常用函数详解
在OpenCV的High_level GUI模组中有很多GUI函数,下面介绍几个常用的函数。
图像显示窗口相关函数
生成图像显示窗口函数nameWindow()
nameWindow()函数的原型如下:
函数用以创建一个给定名的图像显示窗口(后面简单叫做图像窗口),该窗口可以放置滑动条等控件,还可响应鼠标事件。
函数参数:
winname 图像窗口名
flags 窗口类型标志,有一下几种:
销毁图像窗口函数
销毁图像窗口函数有两个,其原型如下:
该函数销毁所有HighGUI 窗口。
该函数销毁指定窗口名的HighGUI 窗口。
获取图像窗口矩形函数getWindowImageRect()
getWindowImageRect()函数的原型如下:
该函数返回指定名窗口客户端屏幕坐标、图像渲染区域的宽度和高度组成的矩形。
获取图像窗口属性函数getWindowProperty
getWindowProperty()的原型如下:
该函数返回指定窗口属性。
函数参数:
Winname 窗口名称
prop_id 窗口属性标记, 有以下几种:
移动图像窗口函数moveWindow()
moveWindow()函数的原型如下:
该函数将指定图像窗口移动到指定位置。
函数参数:
winname 窗口名
X 新位置的横坐标
Y 新位置的纵坐标。
调整图像窗口图像显示区域大函数resizeWindow()
resizeWindow()函数的原型如下:
该函数功能是指定窗口图像区域大小,不包含工具条区域。
函数参数:
winname 窗口名
width 图像显示区域宽度
height 图像显示区域高度
选择感兴趣区域函数selectROI()
selectROI()有两个原型函数,如下:
该函数实现选取图像窗口中显示图像的ROI区域,该函数使用cv::setMouseCallback(windowName,…)为指定窗口设置自己的鼠标回调。工作完成后,将为已使用的窗口设置一个空回调。
函数参数:
winName 图像窗口名
img 输入图像
showCrosshair 如果为真,显示选择矩形的十字准线
fromCenter 如果为真,选择ROI中心与初始鼠标位置匹配。在相反的 情况下,选择矩形的一角将对应于初始鼠标位置。
printNotice 如果为真,将在控制台中打印选择ROI或取消选择的通知。
设置窗口属性函数setWindowProperty()
setWindowProperty()函数的原型如下:
setWindowProperty函数允许动态更改窗口的属性。
函数参数:
winname 窗口名
prop_id 属性id,可为以下几种之一:
prop_value 窗口属性新值,可以为以下几种之一:
函数参数:
winname 窗口名称
title 新的名称
启动窗口线程函数startWindowThread()
startWindowThread()原型如下:
在窗口中显示图像函数imshow()
imshow()函数的原型如下:
函数参数:
winname 窗口名
mat 含图像的mat对象。
延时等待按键输入函数waitKey()
waitKey()的原型如下:
如果delay小于或等于0,将无限期等待,直到有按键输入,才停止等待执行该包含函数语句后名程序。如果delay大于0,等待时间将以毫秒计,但等待时间并不是精确的。如果在等待时间内有按键输入,将会停止等待,执行后面程序,但这并非真正意义的立即停止,如果需要真正意义的立即执行后面程序,可使用pollKey()函数。
与鼠标操作相关的函数
获取鼠标滚轮运动增量函数getMouseWheelDeldlta()
getMouseWheelDeldlta()的原型如下:
对于带有滚轮的普通小鼠,delta将是120的倍数。值120对应于滚轮的一个凹口旋转或要采取行动的阈值,并且每个增量都应该发生一个这样的行动。一些具有更高分辨率的高精度鼠标自由旋转的轮子可能会产生更小的值。
参数 flags 鼠标回调标志参数。
鼠标事件相应函数类型MouseCallback
MouseCallback的定义如下:
参数:
envent 鼠标事件,鼠标事件有以下几种:
x 鼠标指针位置横坐标x
y 鼠标指针位置纵坐标x
flags 鼠标事件标志,可以是一下几种之一:
userdata 这是一个可选参数。
设置鼠标事件响应函数setMouseCallback()
setMouseCallback()函数的原型如下:
函数参数:
winname 图像窗口名
onMouse 鼠标事件相应函数名
userdata 传递给回调函数的可选参数。
与滑动条相关的函数
生成滑动条函数createTrackbar()
createTrackbar()的原型如下:
函数参数:
trackbarname 生成滑动条名称
winname 窗口名
value 指向整数变量的可选指针,其值反映滑块的位置。创建后,滑 块位置由此变量定义。
count 滑块的最大位置。最小位置始终为0。
onChange 指向每次滑块改变位置时要调用的函数的指针。这个函数应该被原型化为void Foo(int,void*),其中第一个参数是轨迹条位置,第二个参数是用户数据(见下一个参数)。如果回调是NULL指针,则不调用回调,只更新值。每次滑块改变位置时要调用的函数需为TrackbarCallback 类型,TrackbarCallback的定义如下:
UserData 按原样传递给回调函数的用户数据。它可用于处理轨迹栏事件,而无需使用全局变量。
获取滑动条游标位置函数getTrackbarPos()
getTrackbarPos()的原型如下:
改函数的返回值即为滑动条游标的位置。
函数参数:
trackbarname 滑块条名
winname 窗口名称
设置滑块条最大值位置函数setTrackbarMax()
setTrackbarMax()的原型如下:
函数参数:
trackbarname 滑块条名
winname 窗口名
maxVal 欲设置的最大值
设置滑块条最小值位置函数setTrackbarMin()
setTrackbarMin()的原型如下:
函数参数:
trackbarname 滑块条名
winname 窗口名
minVal 欲设置的最小值
示例程序
新建一个控制台应用程序来演示OpenCV GUI函数的用法。程序代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("1.webp");if (src1.empty()){cout << "Cann't open image!" << endl;return -1;}namedWindow("Src", WINDOW_AUTOSIZE); //demo namedWindow()imshow("Src", src1); //demo imshow()Rect rec = getWindowImageRect("Src"); //demo getWindowImageRectcout << rec << endl;double dbData = getWindowProperty("Src", WND_PROP_AUTOSIZE); //demo getWindowProperty()cout << dbData << endl;dbData = getWindowProperty("Src", WND_PROP_FULLSCREEN); //demo getWindowProperty()cout << dbData << endl;waitKey(0);destroyWindow("Src"); //demo destroyWindownamedWindow("Src", WINDOW_NORMAL); //demo namedWindow()setWindowProperty("Src", WND_PROP_FULLSCREEN,WINDOW_FULLSCREEN);//demosetWindowPropertydbData = getWindowProperty("Src", WND_PROP_AUTOSIZE); //demo getWindowProperty()cout << dbData << endl;imshow("Src", src1); waitKey(0); //demo waitKey()return 0;
}
试运行, 结果如下;
按任意键后,结果如下:
图片满屏显示,控制台输出如下:
注释掉上面程序中main函数中的前部分,加入新代码来演示与鼠标 相关的函数用法,并在main函数的前面,添加一个 MouseCallback函数,代如下:
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;static void onMouse(int event, int x, int y, int flags, void* userIuput) //demo MouseCallback function
{Mat* pimg = (Mat*)userIuput;Rect rec(0,0,0,0);Mat roi;switch (event){ case EVENT_LBUTTONDOWN:circle(*pimg, Point(x, y), 20, Scalar(0, 0, 255), 2); rec = selectROI("Src", *pimg); //demo selectRoIroi = (*pimg)(rec);moveWindow("Src", x, y); //demo mmovebreak;case EVENT_MOUSEWHEEL:int mouseDelta = getMouseWheelDelta(flags); //demo getMouseWheelDeltamouseDelta /= 12;rec = getWindowImageRect("Src"); //demo getWindowImageRectresizeWindow("Src", Size(rec.width + mouseDelta, rec.height + mouseDelta)); //demo resizeWindowbreak;}imshow("Src", *pimg);if(!roi.empty())imshow("Roi", *pimg);
}int main()
{/*Mat src1 = imread("1.webp");if (src1.empty()){cout << "Cann't open image!" << endl;return -1;}namedWindow("Src", WINDOW_AUTOSIZE); //test namedWindow()imshow("Src", src1); //test imshow()Rect rec = getWindowImageRect("Src"); //test getWindowImageRectcout << rec << endl;double dbData = getWindowProperty("Src", WND_PROP_AUTOSIZE); //test getWindowProperty()cout << dbData << endl;dbData = getWindowProperty("Src", WND_PROP_FULLSCREEN); //test getWindowProperty()cout << dbData << endl;waitKey(0);destroyWindow("Src"); //test destroyWindownamedWindow("Src", WINDOW_NORMAL); //test namedWindow()setWindowProperty("Src", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN); //test setWindowPropertydbData = getWindowProperty("Src", WND_PROP_AUTOSIZE); //test getWindowProperty()cout << dbData << endl;imshow("Src", src1);*///demo mosue functionMat src1 = imread("1.webp");if (src1.empty()){cout << "Cann't open image!" << endl;return -1;}namedWindow("Src", WINDOW_AUTOSIZE); //test namedWindow()imshow("Src", src1); //test imshow()setMouseCallback("Src", onMouse, &src1); //demo setMouseCallbackwaitKey(0); //test waitKey()return 0;
}
试运行,结果如下:
在右眼位置,点击鼠标,结果如下:
依据提示,选择ROI,
然后按键盘的空格键,结果如下:
再测试下鼠标滚轮滚动效果,关闭掉试运行程序,重新试运行。
向后滚动滚轮,结果如下:
向前滚动滚轮结果如下:
下面演示一下与TrackBar相关函数的用法。添加TrackBar回调函数如下:
注释掉main函数的前面部分代码,添加新代码,如下:
试运行,结果如下:
将游标拖动到0,结果如下:
将将游标拖动到2,结果如下:
将将游标拖动到3,结果如下:
将将游标拖动到16,结果如下:
将将游标拖动到17,结果如下:
通过Trackbar实现了显示图片的切换。本示例程序就演示到这里,示例代码已上传到CSDN,下载链接为:https://download.csdn.net/download/billliu66/89754230
相关文章:

OpenCV GUI常用函数详解
在OpenCV的High_level GUI模组中有很多GUI函数,下面介绍几个常用的函数。 图像显示窗口相关函数 生成图像显示窗口函数nameWindow() nameWindow()函数的原型如下: 函数用以创建一个给定名的图像显示窗口(后面简单叫做图像窗口)…...

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件
Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件,提供Fat32、NTFS、Exfat、mac os扩展格式的转换,稳定性好,传输速度极快。Tuxera NTFS for Mac功能丰富,能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…...
oceanbase(ob)基于备份集搭建备租户方式
一、搭建备租户方式(基于备份的方式) 注意事项:要有一个源端OB集群和目标端OB集群。 1、新建主租户(如果原来有主租户可是省略) #创建unit create resource unit ut_2c2g max_cpu2, memory_size2G, max_iops10000,l…...

Javase复习day21算法、arrays、Lamdba表达式
常见算法 查找算法 基本查找 package search;public class BasicSearchDemo1 {public static void main(String[] args) {//基本算法(顺序查找)int[] arr {131,23,57,37,95,48,57,43};System.out.println(basicSearch(arr, 43));}public static boo…...

移动硬盘无法读取?别慌!这些方法助你恢复数据!
在我们的日常工作和生活中,移动硬盘作为重要的数据存储工具,承载着珍贵资料。然而,移动硬盘无法被电脑读取的情况时有发生,令人焦急。别慌,下面为大家详细介绍恢复移动硬盘数据的有效方法。 一、检查硬件连接和驱动问题…...
Java集合面试(上)
Java集合面试(上) 集合概述 Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对 说说List,Set,Queue&#…...

Python画笔案例-046 绘制小红伞
1、绘制小红伞 通过 python 的turtle 库绘制 小红伞,如下图: 2、实现代码 绘制 小红伞,以下为实现代码: """小红伞.py """ import turtledef draw_pattern():"""画填充圆弧"&…...
使用 .NET 6 构建跨平台 Worker Service 服务:跨越平台的 C# 服务开发——解决Windows服务跨平台问题
现代软件开发中,构建跨平台的应用程序变得愈加重要。C# 和 .NET 6 的出现使得在 Windows、Linux 和 macOS 上创建背景服务变得简单而高效。在本指南中,我们将通过创建一个使用 .NET 6 的 Worker Service 来展示如何实现跨平台后台服务。 项目概述 我们…...

terminator-gnome
gnome import os#启动节点指令变量 stere"ros2 launch stereo_c start.py" utils"ros2 launch task utils.launch.py" #tab标题 stere_title"stere_driver" utils_title"utils"#一个终端界面打开5个tab cmd1f"gnome-terminal --…...
7.测试用例设计方法 + Bug
一、正交实验法 1.使用场景 因果关系比较庞大的情况下,不太适合用因果图判定表,在这种情况下,一般会采用正交实验法。 2.例子: 字符属性设置(4个条件) 字体很多 字符样式很多 …...

uniapp小程序,使用腾讯地图获取定位
本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题,在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址:uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了,大…...
Reactive 编程-Project Reactor
Reactive 编程与 Project Reactor Reactive 编程是一种编程范式,主要用于处理异步数据流。它旨在通过声明式的编程方式处理事件驱动的非阻塞任务,特别适合于构建响应式、可扩展、高并发的应用。随着互联网应用规模的扩大和响应速度的提升需求࿰…...

splice用法
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Redis - 缓存
文章目录 目录 文章目录 1. 什么是缓存? 2. 使用Redis作为缓存 2.1 关系型数据库的缺点 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 缓存淘汰策略 4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 缓存预热 缓存穿透 缓存雪崩 缓存击穿 总结 1. 什么…...

基于SpringBoot+Vue的养老院管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...
多线程爬虫接入代理IP:高效数据抓取的秘诀
在现代网络环境中,爬虫已经成为获取信息的利器。然而,随着网站反爬措施的不断升级,单线程爬虫往往无法满足需求。多线程爬虫与代理IP的结合,不仅能提高效率,还能有效规避IP封禁问题。本文将详细探讨多线程爬虫接入代理…...
[网络][CISCO]Cisco-PIX配置详解
Cisco PIX防火墙配置指南 任何企业安全策略的一个主要部分都是实现和维护防火墙,因此防火墙在网络安全的实现当中扮演着重要的角色。防火墙通常位于企业网络的边缘,使内部网络与Internet之间或与其他外部网络互相隔离,并限制网络互访&#x…...

拒绝千篇一律,AI帮你定制独一无二的个人写真
每个女人都渴望展现最美的自己,你是否厌倦了拍出千篇一律的照片?今天,我要告诉你一个秘密,用简单三步,即可打造属于你的独一无二个人写真!文生图、蒙版换脸、图生图,三步化身超级模特࿰…...
在云服务器上安装 RabbitMQ:从零到一的最佳实践
🛠 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息代理中间件,广泛应用于高并发、异步任务队列的场景中。在分布式系统架构中,RabbitMQ 可以充当消息的中转站,帮助不同服务之间进行高效的消息通信。 在这篇文章中,我们…...

【nginx】搭配okhttp 配置反向代理
nginx的默认是一个反向代理。 nginx会默认把输入的请求,转向其他的服务器执行。 这些转向的服务器与客户端发起的服务器不是同一个。 客户端只认识nginx,不知道ngiix转向何方。 正向代理修改okhttp的proxy,实际上很多代理都是正向的。 反向代理修改请求路径到nginx。 感觉还…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...