Opencv step by step - 鼠标事件
鼠标事件有下面几种(没有滚轮事件,比较遗憾):
#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 中键双击
下面用一个例子来学习一下这个事件:
#include <cv.h>
#include <highgui.h> CvRect box;
bool draging; void mouse_callback(int event, int x, int y, int flags, void* param)
{
IplImage *image = (IplImage*)param;
switch(event) {
case CV_EVENT_MOUSEMOVE:
if(draging) {
box.width = x - box.x;
box.height = y - box.y;
//printf("%d,%d,%d,%d\n", box.x,box.y,box.width,box.height);
}
break;
case CV_EVENT_LBUTTONDOWN:
draging = true;
printf("down evt\n");
box.x = x;
box.y = y;
printf("%d,%d,%d,%d\n", box.x,box.y,box.width,box.height);
break;
case CV_EVENT_LBUTTONUP:
draging = false;
printf("%d,%d,%d,%d\n", box.x,box.y,box.width,box.height);
box.x = 0;
box.y = 0;
box.width = 0;
box.height = 0;
printf("up evt\n");
break; } } int main(int argc, char **argv)
{
const char* window_name = "my mouse"; box = cvRect(-1, -1, 0, 0);
IplImage *image = cvCreateImage(cvSize(200,200), 8, 3);
cvZero(image); cvNamedWindow(window_name);
cvSetMouseCallback(window_name, mouse_callback, (void *)image);
cvShowImage(window_name, image); while(1) {
if(draging) {
cvZero(image);
cvRectangle(image,cvPoint(box.x,box.y),
cvPoint(box.x + box.width ,box.y+box.height),
cvScalar(255,255,0));
cvShowImage(window_name, image);
} if(cvWaitKey(10) == 27)
break;
} cvReleaseImage(&image);
cvDestroyWindow(window_name); }
这个例子的效果实际上是在鼠标拖动的时候画矩形。核心点就是回调函数了:
cvSetMouseCallback(window_name, mouse_callback, (void *)image);
cvWaitKey是一个非阻塞的过程,所以拖动的时候下面的代码一直会被调用:
cvZero(image);
cvRectangle(image,cvPoint(box.x,box.y),
cvPoint(box.x + box.width ,box.y+box.height),
cvScalar(255,255,0));
cvShowImage(window_name, image);
这就是刷新的过程了。
下面是效果图:
Opencv step by step - 鼠标事件的更多相关文章
- Opencv下图像对鼠标事件的响应
直接上代码: //////////////////////////////////////////////////////////////////////// // // 该程序从文件中读入一幅图像, ...
- Opencv函数setMouseCallback鼠标事件响应
用户通过鼠标对图像视窗最常见的操作有: 1. 左键单击按下 2. 左键单击抬起 3. 左键按下拖动 4. 鼠标指针位置移动 单次单击操作响应事件及顺序 Opencv中setMouseCallback( ...
- opencv鼠标事件
#include <opencv2\opencv.hpp> using namespace cv; struct mouse_para { cv::Mat org; cv::Mat img ...
- opencv入门系列教学(四)处理鼠标事件
一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...
- Opencv处理鼠标事件-OpenCV步步精深
在图片上双击过的位置绘制一个 圆圈 鼠标事件就是和鼠标有关的,比如左键按下,左键松开,右键按下,右键松开,双击右键等等. 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标.我们通过以下函数来调用查看所 ...
- WPF Step By Step 自定义模板
WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现 ...
- Android查询:模拟键盘鼠标事件(adb shell 实现)
1. 发送键盘事件: 命令格式1:adb shell input keyevent “value” 其中value以及对应的key code如下表所列: KeyEvent Value KEYCODE ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- WPF Step By Step 系列 - 开篇 ·
WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...
随机推荐
- MongoDB学习笔记——聚合操作之group,distinct,count
单独的聚合命令(group,distinct,count) 单独聚合命令 比aggregate性能低,比Map-reduce灵活度低:但是可以节省几行javascript代码,后面那句话我自己加的,哈 ...
- ehcache整合spring注解方式
一.简介 在hibernate中就是用到了ehcache 充当缓存.spring对ehcache也提供了支持,使用也比较简单,只需在spring的配置文件中将ehcache的ehcache.xml文件 ...
- inux下文件权限设置中的数字表示权限,比如777,677等,这个根据什么得来的
chmod ABC file 其中A.B.C各为一个数字,分别表示User.Group.及Other的权限. A.B.C这三个数字如果各自转换成由“0”.“1”组成的二进制数,则二进制数的每一位分别代 ...
- STM32启动文件选择说明
图1. STM32F10xxx标准外设库体系结构先说这个问题,大家都知道,我们在选择使用哪些外围的的时候,是去更改从官方模版中拷贝过来的stm32f10x_conf.h文件的27-48行,把我们要用的 ...
- TCP/IP详解--TCP首部选项中时间戳选项
一.简介 TCP时间戳选项会在TCP包头增加12个字节,以一种比重发超时更精确的方法来启用对RTT 的计算. 二.作用 ) TCP时间戳位于TCP选项中,kind=:lenth=:data由tim ...
- c++ Windows Socket实现最简单的C/S网络通信(TCP)
1.服务器端代码: #include<iostream> #include<WinSock2.h> #pragma comment(lib, "ws2_32.lib& ...
- Sublime Text 2 (for OS X )配置成可以运行基于python3解释器的 .py文件
Mac自带的python 其version是python 2.7 官网下的Sublime Text 2部署好了以后默认也是 为了使ST2 可以在command+B时可以运行基于python3的.py, ...
- Linked List Cycle
Given a linked list, determine if it has a cycle in it. /** * Definition for singly-linked list. * s ...
- Storm calculate pv
本题其实就是storm的wordcout,需要把一个gz压缩的文件读取,并使用storm计算其pv. 样本 数据: 存储为accesslog.gz 我把它加载到我的虚拟机中/mnt/下. 没有使用tr ...
- c++实现排序(简单插入,希尔,选择,快速,冒泡,堆排)
简单插入排序 适用于记录较少且基本有序的记录.算法思想:给定一个存在分界线的序列,分界线左边有序,右边无序,依次将右边的没排序的数与左边序列进行比较,插入相应位置,再对分界线做出相应调整,下面用图来说 ...