一.简介

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)
{ // 获取选择区域的ROI
roiRect.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;
}

三.键盘事件

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. 基于thinkphp5的Excel上传

    涉及知识点: thinkphp5.0: excel上传: mysql建立新表(基本的create语句): mysql ignore(避免重复插入): 主要功能: 通过在视图中上传excel文件,在my ...

  2. 2018全球十大测试工具Top2 Katalon

    引言 由Capgemini,Sogeti和Micro Focus发布的2017-2018年世界质量报告中,Katalon超越老牌测试工具UFT(源自QTP)成为黑马新秀,在全球十大自动化测试工具中排名 ...

  3. Pycharm2019.1.2永久激活

    五月八日Pycharm更新至2019.1.2,小伙们是否也及时更新了呢?值得注意的是以前的激活方式已不适用于本次更新,这里分享最新的激活方法,有需要的同学请扫码关注我的公众号获取 重申:如果经济条件允 ...

  4. Spring security + oauth2.0 + redis + mybatis plus 搭建微服务

    上个星期一个朋友请求帮忙,让我搭建一个分布式授权中心的微服务,之前我也没搭建过,在网上撸了几天前辈们写的技术博客,搞出个模型,分享给大家: 前辈们博客地址: OAuth2.0 原理:https://b ...

  5. [题解](组合数/二位前缀和)luogu_P2822组合数问题

    首先要知道C(n,m)=C(n-1,m)+C(n-1,m-1),这样显然是一个杨辉三角,这样大部分的问题就解决了, 那么判能否整除只需要杨辉三角对k取模即可, 而对于多组数据的k都是一样的,所以用前缀 ...

  6. 118 Pascal's Triangle 帕斯卡三角形 杨辉三角形

    给定 numRows, 生成帕斯卡三角形的前 numRows 行.例如, 给定 numRows = 5,返回[     [1],    [1,1],   [1,2,1],  [1,3,3,1], [1 ...

  7. Windows如何利用输入法简单的打出 ‘↑’ ‘↓’ ‘↖’等箭头

    ‘↑’  shang ‘↓’ xia ‘←’ zuo ‘→’ you ‘↖’ zuoshang ‘↙’  zuoxia ‘↗’  youshang ‘↘’  youxia

  8. freertos之资源管理学习

    OS下在对硬件外设资源操作.多任务的共享变量.任务和中断的共享变量操作时需要考虑资源的完整性和安全性. FREERTOS提供了临界区.调度器上锁.互斥量.优先级自动继承.创建守护任务的方法来改变最小优 ...

  9. The Weakest Sith

    http://codeforces.com/gym/101149/problem/F 题目要输出最丑陋的衣服.所以每件衣服都要和其他衣服比一次. 但是注意到,能赢一件衣服的衣服,就算是好衣服了. 那么 ...

  10. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...