一.简介

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)图片信息

  1. //鼠标点击事件
  2.  
  3. #include <opencv2/imgproc/imgproc.hpp>
  4. #include <opencv2/highgui/highgui.hpp>
  5. #include <iostream>
  6. #include <stdio.h>
  7.  
  8. //全局变量
  9. cv::Mat srcImage;
  10. void MouseEvent(int event, int x, int y, int flags, void* data)
  11. {
  12.  
  13. char charText[30];
  14. cv::Mat tempImage, hsvImage;
  15. tempImage = srcImage.clone();
  16.  
  17. //
  18. // 左键按下移动显示RGB信息
  19. //
  20.  
  21. if (event == CV_EVENT_LBUTTONDOWN)
  22. {
  23.  
  24. cv::Vec3b p = tempImage.at<cv::Vec3b>(y,x);
  25. sprintf(charText, "R = %d, G = %d, B = %d", p[2], p[1], p[0]);
  26.  
  27. // 写RGB信息文本到图像
  28. cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_COMPLEX, 2, CV_RGB(0,0,255));
  29. imwrite("c.jpg",tempImage);
  30. }
  31.  
  32. //
  33. // 右键按下移动显示HSV信息
  34. //
  35.  
  36. else if (event == CV_EVENT_RBUTTONDOWN)
  37. {
  38.  
  39. // 转换成HSV图像
  40. cv::cvtColor(tempImage, hsvImage, CV_BGR2HSV);
  41. cv::Vec3b p = hsvImage.at<cv::Vec3b>(y,x);
  42.  
  43. // 获取相应的通道值
  44. sprintf(charText, "H = %d, S = %d, V = %d", p[0], p[1], p[2]);
  45.  
  46. // 写HSV文本信息到图像
  47. cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_PLAIN, 2, CV_RGB(0,255,0));
  48. imwrite("d.jpg",tempImage);
  49. }
  50.  
  51. //
  52. // 没有按下键显示对应坐标
  53. //
  54.  
  55. else
  56. {
  57.  
  58. // 移动鼠标显示坐标
  59. sprintf(charText, "x = %d, y = %d", x, y);
  60.  
  61. // 写X Y坐标文本信息到图像
  62. cv::putText(tempImage, charText, cv::Point(8,20), cv::FONT_HERSHEY_PLAIN, 2, CV_RGB(255,0,0));
  63. imwrite("e.jpg",tempImage);
  64. }
  65.  
  66. }
  67.  
  68. int main(int argc, char** argv)
  69. {
  70.  
  71. // 读取图像及判断是否正确读入
  72. srcImage = cv::imread("a.jpg");
  73. if (srcImage.empty())
  74. return -1;
  75.  
  76. // 回调事件响应
  77. cv::namedWindow("srcImage");
  78. cv::setMouseCallback("srcImage", MouseEvent, 0);
  79. cv::imshow("srcImage", srcImage);
  80. cv::waitKey(0);
  81. return 0;
  82. }
  • (2)滑动条

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

  1. // 滑动条二值化
  2.  
  3. #include "opencv2/imgproc/imgproc.hpp"
  4. #include "opencv2/highgui/highgui.hpp"
  5. #include <iostream>
  6.  
  7. //createTrackbar的回调响应函数
  8. void onChangeTrackBar(int pos, void* data)
  9. {
  10.  
  11. // 强制类型转换
  12. cv::Mat srcImage = *(cv::Mat*)(data);
  13. cv::Mat dstImage;
  14.  
  15. // 根据滑动条的值进行二值化
  16. cv::threshold(srcImage, dstImage, pos, 255, 0);
  17. cv::imshow("dyn_threshold", dstImage);
  18. }
  19.  
  20. int main()
  21. {
  22.  
  23. // 源图像载入及判断
  24. cv::Mat srcImage = cv::imread("a.jpg");
  25. if (!srcImage.data)
  26. return -1;
  27.  
  28. //转换为灰度图像
  29. cv::Mat srcGray;
  30. cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  31. cv::namedWindow("dyn_threshold");
  32. cv::imshow("dyn_threshold", srcGray);
  33.  
  34. //创建滑动条createTrackbar,调用回调函数
  35. createTrackbar("pos", "dyn_threshold", 0, 255, onChangeTrackBar, &srcGray);
  36.  
  37. cv::waitKey(0);
  38. return 0;
  39.  
  40. }
  • (3)固定区域提取

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

  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. #include <iostream>
  4.  
  5. // 全局变量源图像
  6. cv::Mat srcImage;
  7.  
  8. // 方法1:利用Rect选择区域(100, 180, 150, 50)
  9. void regionExtraction(int xRoi, int yRoi, int widthRoi, int heightRoi)
  10. {
  11.  
  12. // 提取指定坐标区域
  13. cv::Mat roiImage(srcImage.rows, srcImage.cols, CV_8UC3);
  14. std::cout << srcImage.rows << " " << srcImage.cols << std::endl;
  15.  
  16. // 将兴趣区域复制到目标图像
  17. srcImage(cv::Rect(xRoi, yRoi, widthRoi, heightRoi)).copyTo(roiImage);
  18. cv::imshow("roiImage", roiImage);
  19. cv::waitKey(0);
  20. }
  21.  
  22. int main()
  23. {
  24.  
  25. // 源图像载入及判断
  26. srcImage = cv::imread("a.jpg");
  27. if (!srcImage.data)
  28. return -1;
  29.  
  30. cv::imshow("ROIing", srcImage);
  31.  
  32. // 方法1:利用Rect选择区域(100,180,150,50)
  33. int xRoi = 100;
  34. int yRoi = 180;
  35. int widthRoi = 150;
  36. int heightRoi = 50;
  37. regionExtraction(xRoi, yRoi, widthRoi, heightRoi);
  38.  
  39. cv::waitKey(0);
  40. return 0;
  41. }

(4)鼠标提取区域

  1. #include <opencv2/imgproc/imgproc.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include <iostream>
  4. #include <stdio.h>
  5.  
  6. using namespace cv;
  7. using namespace std;
  8.  
  9. //全局变量
  10. cv::Mat srcImage;
  11.  
  12. //所选矩形区域
  13. cv::Rect roiRect;
  14.  
  15. //起始点
  16. cv::Point startPoint;
  17.  
  18. //终止点
  19. cv::Point endPoint;
  20.  
  21. //完成所选区域标志位
  22. bool downFlag = false;
  23. bool upFlag = false;
  24.  
  25. void MouseEvent(int event, int x, int y, int flags, void* data)
  26. {
  27.  
  28. // 鼠标左键按下 获取起始点
  29. if (event == EVENT_LBUTTONDOWN)
  30. {
  31. downFlag = true;
  32. startPoint.x = x;
  33. startPoint.y = y;
  34. }
  35.  
  36. // 鼠标拖到松开 获取终止点
  37. if (event == EVENT_LBUTTONUP)
  38. {
  39. upFlag = true;
  40. endPoint.x = x;
  41. endPoint.y = y;
  42. }
  43.  
  44. // 显示拖到图像区域
  45. if (downFlag == true && upFlag == false)
  46. {
  47.  
  48. Point tempPoint;
  49. tempPoint.x = x;
  50. tempPoint.y = y;
  51.  
  52. // 用于显示图像生成
  53. cv::Mat tempImage = srcImage.clone();
  54. cv::rectangle(tempImage, startPoint, tempPoint, Scalar(255,0,0), 2, 3, 0);
  55. cv::imshow("ROIing", tempImage);
  56. }
  57.  
  58. // 选择区域生成
  59. if (downFlag == true && upFlag == true)
  60. {
  61.  
  62. // 获取选择区域的ROI
  63. roiRect.width = abs(startPoint.x - endPoint.x);
  64. roiRect.height = abs(startPoint.y - endPoint.y);
  65. roiRect.x = min(startPoint.x, endPoint.x);
  66. roiRect.y = min(startPoint.y, endPoint.y);
  67. cv::Mat roiMat(srcImage, roiRect);
  68. imshow("ROI", roiMat);
  69. downFlag = false;
  70. upFlag = false;
  71. }
  72. cv::waitKey(0);
  73. }
  74.  
  75. int main(int argc, char** argv)
  76. {
  77. // 读取图像及判断是否正确读入
  78. srcImage = cv::imread("a.jpg");
  79. if (srcImage.empty())
  80. return -1;
  81.  
  82. // 回调事件响应
  83. cv::namedWindow("ROIing");
  84. cv::imshow("ROIing", srcImage);
  85. cv::setMouseCallback("ROIing", MouseEvent, 0);
  86. cv::waitKey(0);
  87. return 0;
  88. }

三.键盘事件

OpenCV2:第八章 界面事件的更多相关文章

  1. Java自学-图形界面 事件监听

    Swing 如何进行事件监听 示例 1 : 按钮监听 创建一个匿名类实现ActionListener接口,当按钮被点击时,actionPerformed方法就会被调用 package gui; imp ...

  2. OpenCV2:第八章 视频操作

    一.简介 OpenCV提供了专门操作视频的接口类VideoCapture类,可以从文件或摄像设备中读取视频

  3. OpenCV2:介绍

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

  4. javascript事件有哪些?javascript的监听事件

    事件类型: 1.界面事件 onload:描述文档,图片,css已经frame,object加载完毕时触发,window.onload window.onload = function(){ //代表图 ...

  5. 自学Zabbix6.1 Event acknowledgment 事件确认

    自学Zabbix6.1 Event acknowledgment 事件确认 1 概述以往服务器出现报警,运维人员处理完事之后,报警自动取消,但是下一次出现同样一个错误,但是换了一个运维人员,他可能需要 ...

  6. react native 之 事件监听 和 回调函数

    同原生一样,react native 同样也有事件监听和回调函数这玩意. 场景很多,比如:A界面push到B界面,B界面再pop回A界面,可以给A界面传值或者告诉A刷新界面. 事件监听 事件监听类似于 ...

  7. Android教材 | 第三章 Android界面事件处理(二)—— 杰瑞教育原创教材试读

     编者按 JRedu 杰瑞教育原创系列教材将于年后与大家正式见面.为更好的借鉴读者意见,我们将会陆续地在博客园推出一系列教材试读.我们也热忱的欢迎广大博友与我们互动,提出宝贵意见. 本篇博客将推出教材 ...

  8. Android教材 | 第三章 Android界面事件处理(一)—— 杰瑞教育原创教材试读

      前  言 JRedu Android应用开发中,除了界面编程外,另一个重要的内容就是组件的事件处理.在Android系统中,存在多种界面事件,比如触摸事件.按键事件.点击事件等.在用户交互过程中, ...

  9. 【Android】事件输入系统-代码层次解读

    本文基于Android-4.0 理论层次解读 请看:www.cnblogs.com/lcw/p/3373214.html 如何管理各种驱动设备 在理论中谈到EventHub,这个一看就是一个做实事的, ...

随机推荐

  1. 让TinyXML保存文件为UTF-8格式

    TinyXML是个好东西,这个不用我多说了,我用它做过好几个项目,但这几个项目都只是从xml文件中获取信息,没有涉及到写文件,最近需要生成xml的配置文件,才注意到这个问题,那就是TinyXML似乎不 ...

  2. PL/SQL基础知识

    Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了 ...

  3. Ubuntu终端查看系统时间,以及日历

    时间:  date 日历: cal https://blog.csdn.net/zhengchaooo/article/details/79500032 修改时区以及时间 查看时区 date -R 修 ...

  4. MySQL - 执行sql报错USING BTREE

    问题与分析 在执行sql文件时发现报错如下: You have an error in your SQL syntax; check the manual that corresponds to yo ...

  5. android webview.goback 问题

    重写 shouldOverrideUrlLoading 不需要实现 view.loadUrl(url);直接return false;即可 如果实现了,则使用window.location.repla ...

  6. A.走方格

    链接:https://ac.nowcoder.com/acm/contest/368/A 题意: 在一个n*n的方格中,你只能斜着走. 你还有一次上下左右走的机会 给你一个起点(sx,sy),和终点( ...

  7. 接口测试02 - 无法绕过的json解析

    概述: 先瞧一下什么是json.JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式. 它基于ECMAScript(w3c定制的js规范)的一个子集 ...

  8. c#学习系列之字段(静态,常量,只读)

    C#静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量.static变量在对象被实例化时创建,通过对象进行访问一个类的所 ...

  9. 51NOD 1202 子序列个数 DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的 ...

  10. 18113 Secret Book of Kungfu 按位DFS

    http://acm.scau.edu.cn:8000/uoj/mainMenu.html 18113 Secret Book of Kungfu 该题有题解 时间限制:1000MS  内存限制:65 ...