本节书摘来自华章计算机《OpenCV图像处理》一书中的第1章,第1.7节,作者:[西]葛罗瑞亚·布埃诺·加西亚(Gloria Bueno García)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.7 用户交互工具

前面几节介绍了如何创建窗口(namedWindow)来显示(imshow)一幅图像和提取/处理事件(waitKey)。我们提供的示例展示了一种通过键盘使用OpenCV应用进行用户交互的简单方法。waitKey函数在超时之前会返回一个按键
编码。
幸运的是,OpenCV为用户交互提供了更为灵活的方式,例如,滑动条和鼠标交互,它们可以和某些绘图功能结合提供丰富的用户体验。而且,如果使用Qt支持(CMake的WITH_QT选项)对OpenCV进行本地编译,那么一组新函数可用来编写一个更好的用户界面(UI)。
本节给出一个快速综述来说明,在使用Qt支持的一个OpenCV项目中,编写用户界面的可用功能。下面使用一个名为showUI的示例,在OpenCV界面支持下对上述综述进行说明。
该示例展示了一个窗口中的一幅彩色图片,说明如何使用某些基本元素来丰富用户交互。图1-6显示了在该示例中创建的UI元素:

showUI示例(没有回调函数)的源代码如下:



当使用Qt支持建立OpenCV时,每个所创建的窗口(通过highgui模块)显示了一个默认工具栏(见图1-6),带有平移、缩放、保存和打开属性窗口的选项(从左到右)。
除了上述提到的工具栏(仅在Qt上可用),下面几节将说明在该示例中创建的各种UI元素和实现这些UI元素的代码。
1.7.1 滑动条
在指定的窗口(winname)中,使用createTrackbar(const String& trackbarname, const String& winname, int value, int count, TrackbarCallback onChange=0, void userdata=0)函数创建滑动条,该函数使用了一个链接整数值(value)、一个最大值(count)、一个当滑动条改变时被调用的可选回调函数(onChange)和回调函数的一个参数(userdata)。回调函数本身得到两个参数:值(通过滑动条选取)和一个指向userdata(可选)的指针。对于Qt支持,如果没有指定窗口,那么会在属性窗口中创建该滑动条。在showUI示例中,创建了两个滑动条:第一个在主窗口中,第二个在属性窗口中。滑动条回调的代码是:

1.7.2 鼠标交互
总是生成鼠标事件使得用户可以用鼠标(移动和点击)进行交互。通过设置正确的处理程序或回调函数,可以实现诸如选择、拖放之类的动作。在指定的窗口(winname)和可选参数(userdata)下使用setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata=0)函数可启用该回调函数(onMouse)。
处理鼠标事件的回调函数的源代码是:


在showUI示例中,通过一个回调函数(cbMouse),可用鼠标事件绘制一个矩形来选择一个矩形区域。在这个示例中,该函数的声明为void cbMouse(int event, int x, int y, int f?lags, void*),其参数为事件发生点(x, y)的位置、事件发生(f?lags)时的条件和可选项userdata。
可以在highgui.hpp头文件中找到可用的事件、标志以及它们对应的定义符号。
1.7.3 按钮
OpenCV(只在使用Qt支持时)允许创建三种类型的按钮:复选框(QT_CHECKBOX)、单选框(QT_RADIOBOX)和按钮(QT_PUSH_BUTTON)。可以分别使用这些类型的按钮来设置选项、设置互斥选项和按钮上的执行动作。在属性窗口中,这三个按钮可使用函数createButton(const String& button_name, ButtonCallback on_change, void* userdata=0, int type=QT_PUSH_BUTTON, bool init_state=false)来创建,它被安排在这个窗口所创建的最后一个滑动条之后的一个按钮条中。该按钮的参数是它的名字(button_name)、状态变化(on_change)时调用的回调函数、该回调函数的一个可选参数(userdate)、按钮的类型(type)和该按钮的初始状态(init_state)。
接下来,展示本示例中按钮所对应的回调函数的源代码:

一个按钮的回调函数得到两个参数:它的状态和一个指向用户数据的(可选项)指针。在showUI示例中,展示了如何将一个整数(radioboxCallBack(int state, void id))传递到指定的按钮和一个更复杂的对象(pushbuttonCallBack(int, void font))。
1.7.4 文本绘制与显示
实现图像处理结果与用户间通信的一种非常有效的方式是在被处理的图片上绘制形状或显示文本。通过imgproc模块,OpenCV提供了一些方便的功能来实现诸如输入文本、绘制线、圆、椭圆、矩形、多边形等之类的任务。showUI示例说明了如何在一幅图像上选择一个矩形区域和绘制一个矩形来标记所选择的区域。下面的函数绘制(img)一个矩形,该矩形通过在一幅图像上的两个点(p1,p2)定义,并具有指定的颜色和其他可选参数,如线条的宽度(对于填充形状是负数)和类型:

除了支持形状绘制之外,imgproc模块提供一个功能,使用下面的函数在一幅图像上放置文本:

在core.hpp头文件中,可以为文本检查可用的字体。
在highgui模块中,Qt支持还增加了一些附加方法用于在一个OpenCV应用的主窗口上显示文本:
图像上的文本:使用函数addText(const Mat& img, const String& text, Point org, const QtFont& font)得到这个结果。这个函数允许选择所显示文本的起点,该文本使用了之前用的函数fontQt(const String& nameFont, int pointSize=-1, Scalar color=Scalar::all(0), int weight=QT_FONT_NORMAL, int style=QT_STYLE_NORMAL, int spacing=0)创建的字体。在showUI示例中,当点击按钮时(通过在回调函数内调用addText函数)这个函数用于在图像上输入文本。
状态栏上的文本:使用函数displayStatusBar(const String& winname, const String& text, int delayms=0)显示状态栏中的文本,由最后一个参数(delayms)指定显示的毫秒数。在showUI示例中,当属性窗口的按钮和滑动条更改其状态时,使用该函数(在回调函数中)显示一条文本信息。
覆盖在图像上的文本:使用函数displayOverlay(const String& winname, const String& text, int delayms=0)显示覆盖在图像上的文本,由最后一个参数指定显示的毫秒数。在showUI示例中,当主窗口滑动条更改其值时,使用该函数(在回调函数中)显示文本信息。

《OpenCV图像处理》——1.7 用户交互工具相关推荐

  1. python怎么模拟浏览器交互_python+webdriver 模拟用户交互工具

    概述: 使用webdriver(引用摘抄于"Python模拟登陆万能法-微博|知乎" 使用selenium库 步骤: 安装webdriver: Windows: pc:chrome ...

  2. OpenCV 图像处理学习手册:1~5

    原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

  3. opencv图像处理总结

    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...

  4. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较

    OpenCV图像处理入门学习教程系列,上一篇第五篇:基于背景差分法的视频目标运动侦测 一.网络爬虫简介(Python3) 网络爬虫,大家应该不陌生了.接下来援引一些Jack-Cui在专栏<Pyt ...

  5. halcon opencv 图像处理面试指南

    珠海某上市公司算法总监: 1.相机标定的原理与坐标系之间的转换,如何转换 2.激光三角原理,如何搭建 3.测量拟合的过程中有哪些算子,原理什么,接着问5,跌代多少次?什么情况最优,如何优化, 4.那个 ...

  6. Python通用编程 - 第一章:用户交互

    本文是Python通用编程系列教程,已全部更新完成,实现的目标是从零基础开始到精通Python编程语言.本教程不是对Python的内容进行泛泛而谈,而是精细化,深入化的讲解,共5个阶段,25章内容.所 ...

  7. 《交互式程序设计 第2版》一3.5 捕获简单用户交互行为

    本节书摘来华章计算机<交互式程序设计 第2版>一书中的第3章 ,第3.5节,Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区"华章 ...

  8. linux 移除python_第16 p,PYthon中的用户交互,Python GUI编程

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第16篇文章,第二阶段的课程:Python基础知识:PYthon中的用户交互.Python GUI编程实现方式介绍. 学习本课程,建 ...

  9. OpenCV图像处理(Python)学习笔记

    OpenCV图像处理 OpenCV图像处理 第1章 OpenCV入门 第2章 图像处理基础 2.1 基本表示方法 2.2 感兴趣区域(ROI) 第3章 图像运算 3.1 加法运算 3.2 图像加权和 ...

最新文章

  1. 大数据处理语言U-SQL介绍
  2. FireDac 的数据库批量语句提交(高效)
  3. RCNN SPP_net
  4. QT通过JavaScript动态创建QML对象
  5. Unity 实现物体破碎效果(转)
  6. python整数类型进制表示_Python数据类型--整型
  7. [iOS]ARC和MRC下混编
  8. 一个比较全介绍UltraGrid的博客
  9. python object和type的关系-Python 的 type 和 object 之间是怎么一种关系?
  10. RabbitMQ用户角色及权限控制
  11. jquery 常用方法 集锦
  12. CCPC-WFinal-女生专场
  13. QRCode.js 生成二维码(文字信息二维码)
  14. Win10取消开机密码
  15. HYSPLIT 模型 传输轨迹 使用指南
  16. 恒指均线流区间突破法的构建
  17. 紫薇圣人的程序员人生-第3回[原创IT小说]
  18. PMP项目管理—质量情景题
  19. 如何用javaweb实现网上招聘系统、基于SSM+mysql的校园大学生兼职招聘平台
  20. java的public int_Java语言中“int”、“public”、“static int ”有什么区别?

热门文章

  1. Linux 用户被差别对待?无法通过 apple.com 管理 Apple ID
  2. Nuxt.js开发中碰到的问题(二)引入gitment评论系统
  3. 用 Ganglia 监控基于 Biginsights 的 HBase 集群性能
  4. Swift - 程序进入后台,以及应用终止时调用的方法
  5. javascript数据类型一览
  6. paip.文件目录操作uAPI php python java对照
  7. 控制ftp访问时间段
  8. C#抽象类和抽象方法的特征和用途
  9. 页面如何让它不显示标题栏,菜单栏,工具栏,地址栏
  10. python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例