OpenCV 鼠标事件 注意事项

本文深入探讨了OpenCV库中的鼠标事件处理机制,包括如何注册鼠标回调函数、处理不同类型的鼠标事件(点击、拖动、释放等),以及在图像处理和计算机视觉应用中如何巧妙利用鼠标事件进行交互式操作。通过实例代码,读者将掌握在OpenCV中实现鼠标事件的技巧和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*用鼠标在图像上画一个矩形*/
#include "stdafx.h"
#include "highgui.h"
 
using namespace cv;
 
void rect_mousecallback( int event, int x, int y, int flags, void* param);  //画矩形的回调函数原型


CvRect box; // 被rect_mousecallback 用来确定鼠标图画框大小的的全局变量


bool drawing_box = false; //绘图标志


void draw_box(IplImage* img, CvRect rect)  //教程中没有使用rect参数,用的全局变量box
{
cvRectangle(img,
cvPoint(rect.x,rect.y), 
cvPoint(rect.x + rect.width, rect.y + rect.height), 
CV_RGB(0,0xff,0));  //cvScalar的宏
// cvScalar(0,0,0xff));  //red
}


int _tmain(int argc, _TCHAR* argv[])
{
 //初始化
 char* winname="box example";  //窗口名
 char* filename="E:\\iVew\\AB\\01.jpg";
 IplImage* img = cvLoadImage(filename);
 box = cvRect(-1,-1,0,0);
 IplImage* temp = cvCloneImage(img);  //创建临时图像,初始化用cvCloneImage,此函数会分配空间,运行中用cvCopy,此函数不分配新的空间


 cvNamedWindow(winname); //注册回调函数之前要先声明window
 cvSetMouseCallback(winname,   //***安装回调函数
rect_mousecallback, 
(void*) img); // 函数原型要求最后一个参数必须是void*,所以不管传入的参数是什么指针类型,都要强制转换.
 while(1)
 {
cvCopy(img,temp); //cvCopy只复制值,不会分配新空间给temp,所以指针位置不变. 教程中有错误,cvCopyImage()函数未定义
//reference http://blog.youkuaiyun.com/jajen/article/details/5711678
if(drawing_box) draw_box(temp,box);
 cvShowImage(winname,temp);
if(cvWaitKey(15) == 27) break;
 }


  cvReleaseImage(&img);
  cvReleaseImage(&temp);
  cvDestroyWindow(winname);
  exit(0);
}


//鼠标回调函数实现
void rect_mousecallback( int event, int x, int y, int flags, void* param)
{
IplImage* img = (IplImage*) param;  //将setMouseCallback传入的param参数指针转化为原来的类型
switch(event)

case CV_EVENT_MOUSEMOVE:
{
if(drawing_box)
{
box.width = x - box.x;
box.height = y- box.height;
}
}
break;
      case CV_EVENT_LBUTTONDOWN:
{
drawing_box = true;
box = cvRect(x,y,0,0);
}
break;
case CV_EVENT_LBUTTONUP:
{
drawing_box = false;
if(box.width<0)
{
box.x += box.width;
box.width *= -1;
}
if(box.height<0)
{
box.y +=box.height;
box.height *= -1;
}
draw_box(img,box);
}
break;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值