一.简介

OpenCV中提供了程序界面中的鼠标和键盘事件

二.鼠标事件

//  设置鼠标回调函数

void setMouseCallback

(

const string& winname,

MouseCallback onMouse,

void* userdata = 0

)

// 被调用的函数指针

void Fun

(

int event,

int x,

int y,

int flags,
    void* param

)

  • event

    #define CV_EVENT_MOUSEMOVE 0--滑动

    #define CV_EVENT_LBUTTONDOWN 1--左键点击

    #define CV_EVENT_RBUTTONDOWN 2--右键点击

    #define CV_EVENT_MBUTTONDOWN 3--中键点击

    #define CV_EVENT_LBUTTONUP 4--左键放开

    #define CV_EVENT_RBUTTONUP 5--右键放开

    #define CV_EVENT_MBUTTONUP 6--中键放开

    #define CV_EVENT_LBUTTONDBLCLK 7--左键双击

    #define CV_EVENT_RBUTTONDBLCLK 8--右键双击

    #define CV_EVENT_MBUTTONDBLCLK 9--中键双击

  • flags

    #define CV_EVENT_FLAG_LBUTTON 1--左键拖曳

    #define CV_EVENT_FLAG_RBUTTON 2--右键拖曳

    #define CV_EVENT_FLAG_MBUTTON 4-中键拖曳

    #define CV_EVENT_FLAG_CTRLKEY 8~15--按Ctrl键不放事件

    #define CV_EVENT_FLAG_SHIFTKEY 16~31--按Shift键不放事件

    #define CV_EVENT_FLAG_ALTKEY 32~39--按Alt键不放事件

(1)图片信息

//鼠标点击事件#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>//全局变量
cv::Mat srcImage;
void MouseEvent(int event, int x, int y, int flags, void* data)
{char charText[30];cv::Mat tempImage, hsvImage;tempImage = srcImage.clone();//// 左键按下移动显示RGB信息//if (event == CV_EVENT_LBUTTONDOWN){cv::Vec3b p = tempImage.at<cv::Vec3b>(y,x);sprintf(charText, "R = %d, G = %d, B = %d", p[2], p[1], p[0]);// 写RGB信息文本到图像cv::putText(tempImage, charText, cv::Point(8,20),  cv::FONT_HERSHEY_COMPLEX, 2, CV_RGB(0,0,255));imwrite("c.jpg",tempImage);}//// 右键按下移动显示HSV信息//else if (event == CV_EVENT_RBUTTONDOWN){// 转换成HSV图像cv::cvtColor(tempImage, hsvImage, CV_BGR2HSV);cv::Vec3b p = hsvImage.at<cv::Vec3b>(y,x);// 获取相应的通道值sprintf(charText, "H = %d, S = %d, V = %d", p[0], p[1], p[2]);// 写HSV文本信息到图像cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_PLAIN, 2, CV_RGB(0,255,0));imwrite("d.jpg",tempImage);}//// 没有按下键显示对应坐标//else{// 移动鼠标显示坐标sprintf(charText, "x = %d, y = %d", x, y);// 写X Y坐标文本信息到图像cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_PLAIN, 2, CV_RGB(255,0,0));imwrite("e.jpg",tempImage);}}int main(int argc, char** argv)
{// 读取图像及判断是否正确读入srcImage = cv::imread("a.jpg");if (srcImage.empty())return -1;// 回调事件响应cv::namedWindow("srcImage");cv::setMouseCallback("srcImage", MouseEvent, 0);cv::imshow("srcImage", srcImage);cv::waitKey(0);return 0;
}

  • (2)滑动条

OpenCV提供滑动条函数createTrackbar(),当拖动滑块移动鼠标时触发滑动事件

// 滑动条二值化#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>//createTrackbar的回调响应函数
void onChangeTrackBar(int pos, void* data)
{// 强制类型转换cv::Mat srcImage = *(cv::Mat*)(data);cv::Mat dstImage;// 根据滑动条的值进行二值化cv::threshold(srcImage, dstImage, pos, 255, 0);cv::imshow("dyn_threshold", dstImage);
}int main()
{// 源图像载入及判断cv::Mat srcImage = cv::imread("a.jpg");if (!srcImage.data)return -1;//转换为灰度图像cv::Mat srcGray;cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);cv::namedWindow("dyn_threshold");cv::imshow("dyn_threshold", srcGray);//创建滑动条createTrackbar,调用回调函数createTrackbar("pos", "dyn_threshold", 0, 255, onChangeTrackBar, &srcGray);cv::waitKey(0);return 0;}

  • (3)固定区域提取

从整个图像中提取出兴趣区域ROI,通过Rect设置相应的感兴趣矩形区域,再用copyTo进行图像赋值

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>// 全局变量源图像
cv::Mat srcImage;// 方法1:利用Rect选择区域(100, 180, 150, 50)
void regionExtraction(int xRoi, int yRoi, int widthRoi, int heightRoi)
{// 提取指定坐标区域cv::Mat roiImage(srcImage.rows, srcImage.cols, CV_8UC3);std::cout << srcImage.rows << " " << srcImage.cols << std::endl;// 将兴趣区域复制到目标图像srcImage(cv::Rect(xRoi, yRoi, widthRoi, heightRoi)).copyTo(roiImage);cv::imshow("roiImage", roiImage);cv::waitKey(0);
}int main()
{// 源图像载入及判断srcImage = cv::imread("a.jpg");if (!srcImage.data)return -1;cv::imshow("ROIing", srcImage);// 方法1:利用Rect选择区域(100,180,150,50)int xRoi = 100;int yRoi = 180;int widthRoi = 150;int heightRoi = 50;regionExtraction(xRoi, yRoi, widthRoi, heightRoi);cv::waitKey(0);return 0;
}

(4)鼠标提取区域

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>using namespace cv;
using namespace std;//全局变量
cv::Mat srcImage;//所选矩形区域
cv::Rect roiRect;//起始点
cv::Point startPoint;//终止点
cv::Point endPoint;//完成所选区域标志位
bool downFlag = false;
bool upFlag = false;void MouseEvent(int event, int x, int y, int flags, void* data)
{// 鼠标左键按下 获取起始点if (event == EVENT_LBUTTONDOWN){downFlag = true;startPoint.x = x;startPoint.y = y;}// 鼠标拖到松开 获取终止点if (event == EVENT_LBUTTONUP){upFlag = true;endPoint.x = x;endPoint.y = y;}// 显示拖到图像区域if (downFlag == true && upFlag == false){Point tempPoint;tempPoint.x = x;tempPoint.y = y;// 用于显示图像生成cv::Mat tempImage = srcImage.clone();cv::rectangle(tempImage, startPoint, tempPoint, Scalar(255,0,0), 2, 3, 0);cv::imshow("ROIing", tempImage);}// 选择区域生成if (downFlag == true && upFlag == true){// 获取选择区域的ROIroiRect.width = abs(startPoint.x - endPoint.x);roiRect.height = abs(startPoint.y - endPoint.y);roiRect.x = min(startPoint.x, endPoint.x);roiRect.y = min(startPoint.y, endPoint.y);cv::Mat roiMat(srcImage, roiRect);imshow("ROI", roiMat);downFlag = false;upFlag = false;}cv::waitKey(0);
}int main(int argc, char** argv)
{// 读取图像及判断是否正确读入srcImage = cv::imread("a.jpg");if (srcImage.empty())return -1;// 回调事件响应cv::namedWindow("ROIing");cv::imshow("ROIing", srcImage);cv::setMouseCallback("ROIing", MouseEvent, 0);cv::waitKey(0);return 0;
}

三.键盘事件

转载于:https://www.cnblogs.com/k5bg/p/11083333.html

OpenCV2:幼儿园篇 第七章 界面事件相关推荐

  1. OpenCV2:幼儿园篇 第四章 访问图像

    一.行/列访问 1.单行/单列访问 Mat Mat::row(int i) const Mat Mat::col(int j) const 2.多行/多列访问 Range(start,end); Ra ...

  2. 明解C语言 入门篇 第七章练习题

    明解C语言 入门篇 第七章练习题 7-1 7-2 7-3 7-4 7-5 7-6 7-7(问题已解决) 7-8 7-9 7-10(此处借鉴了@野猪力量的代码) 7-11 7-1 #include &l ...

  3. 鸟哥的Linux私房菜(基础篇)- 第七章、Linux 文件与目录管理

    第七章.Linux文件与目录管理 最近升级日期:2009/08/26 在第六章我们认识了Linux系统下的文件权限概念以及目录的配置说明.在这个章节当中,我们就直接来进一步的操作与管理文件与目录吧!包 ...

  4. OpenCV2:幼儿园篇 第一章 创建图像并显示

    一.简介 相当于在PS中,新建一个画布 cv::Mat 类和 lplimage / cvMat结构体都可以表示一张图像 二.构造函数创建图像 // 创建一个空矩阵 cv::Mat image1;// ...

  5. vue.js实战 第一篇 第七章 组件详解_组件通信

    正向数据传递props <div id="app"><my-component message="来自父组件的数据"></my-c ...

  6. 第三篇 第七章气体灭火系统(三)

    自动启动实验 转载于:https://www.cnblogs.com/shan1393/p/10241480.html

  7. OpenCV2:开头篇 介绍

    一.OpenCV简介 OpenCV所有的类和函数都在cv命名空间里面,可以用 using namespace cv; #include "opencv2/opencv.hpp" 1 ...

  8. 【系统分析师之路】第七章 系统分析架构篇记忆敲出

    [系统分析师之路]第七章 系统分析架构篇记忆敲出 系统分析师系统设计架构篇记忆敲出 [系统分析师之路]第七章 系统分析架构篇记忆敲出 一. 软件架构的概念 二. 五种软件架构的风格 三. 数据流风格的 ...

  9. 《信息简史》第七章人物、事件、名言收集小感

    吴军老师的<文明之光>一书自上市以来,广受读者的称赞,并入选2014中国好书排行榜. 斯坦福大学物理系的张首晟教授为本书写了一篇名为<大数据时代读大历史--感受物理.科技.人文的跨界 ...

  10. 构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)—托管资源优化—监常用优化措施...

    构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)-托管资源优化-监常用优化措施   前言:有段时间没有写这个系列了,希望大家见谅,本篇主要将会介绍一些常用的CLR优化措施. 本篇的议题 ...

最新文章

  1. VTK:IO之ReadDICOMSeries
  2. LeetCode Algorithm 704. 二分查找
  3. MySQL优化系列_常见的sql使用-Mysql中的实践(Mysql优化系列8)
  4. python对列表中的数值进行统计运算_python-从单词列表中计算元音并返回数字作......
  5. Python--递归
  6. CAD编辑工具中如何设置图纸的比例
  7. 对初学者来说,Python难度不低于其他语言
  8. 捷联惯导数值更新算法-姿态更新+速度更新+位置更新
  9. 大学四年,自学编程常用的10个学习网站
  10. Qt与flash交互实现(播放Flash动画)
  11. 设计一款给爸爸妈妈用的手机
  12. 记录学习画漫画的过程~~2014.7.10(人物头像)
  13. Springmvc实现分页开发
  14. 鸿蒙系统大文件夹怎么调整大小,文件太大怎么变小
  15. centos 7系统Give root password for maintenance解决办法
  16. 解决浏览器不支持display:flex的问题
  17. SpringBoot+Vue从零开始做网站8-全局异常处理和使用mybatis-plus分页插件
  18. 淘客公众号系统要用到服务器吗,公众号淘客分销系统你用了吗?
  19. zedboard移植linux内核,zedboard-嵌入式Linux系統移植
  20. java 批量删除数据_一种批量删除数据的方法

热门文章

  1. python基于PIL模块实现矩阵与图像数据互相转换
  2. python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
  3. Pandas常用函数diff和shift函数学习使用
  4. oracle里的or 短路么,Oracle CASE短路不能分组工作
  5. 英语 没有听懂对方说什么 怎么说
  6. C++ 迭代器 删除(erase)插入(insert)之后失效
  7. 区块链 智能合约 虚拟机 EVM 资料总结
  8. vlc linux静态版本,vlc 在ubuntu 14下的linux版本编译
  9. 基于SSM的教学质量系统
  10. java用户登录窗口怎么删除_JAVA图形界面用户登录后如何关闭登录的对话框