Opencv鼠标响应(框选以及取点)


寒假在家闲来无事做点小Demo


效果如下:



鼠标调用关键函数为:

	setMouseCallback("img", on_mouse, 0);//调用回调函数    


只需要重写void on_mouse(int event, int x, int y, int flags, void *ustc)函数即可。

其中event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号 


event对应如下几种:

    CV_EVENT_MOUSEMOVE      =0,
    CV_EVENT_LBUTTONDOWN    =1,
    CV_EVENT_RBUTTONDOWN    =2,
    CV_EVENT_MBUTTONDOWN    =3,
    CV_EVENT_LBUTTONUP      =4,
    CV_EVENT_RBUTTONUP      =5,
    CV_EVENT_MBUTTONUP      =6,
    CV_EVENT_LBUTTONDBLCLK  =7,
    CV_EVENT_RBUTTONDBLCLK  =8,
    CV_EVENT_MBUTTONDBLCLK  =9,
    CV_EVENT_MOUSEWHEEL     =10,
    CV_EVENT_MOUSEHWHEEL    =11


完整可运行程序如下://需要配置下Opencv环境2.41及以上

#include <opencv2/opencv.hpp>
#include<string>
using namespace cv;
RNG g_rng(12345);//毛大大的博客里看到的生成随机数,用于生成随机颜色
bool 是否画矩形 = false;//不可避免地还是要定义几个全局变量,伤心
Point 左击顶点=Point(-1,-1);
Point 鼠标位置= Point(-1, -1);

void on_mouse(int event, int x, int y, int flags, void *ustc)
//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号    
{
	Mat& image = *(cv::Mat*) ustc;//这样就可以传递Mat信息了,很机智
	char temp[16];
	switch (event) {
	case CV_EVENT_LBUTTONDOWN://按下左键
	{
		sprintf(temp, "(%d,%d)", x, y);
		putText(image, temp, Point(x, y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));
		是否画矩形 = true;
		左击顶点= Point(x, y);
	}	break;
	case CV_EVENT_MOUSEMOVE://移动鼠标
	{
		鼠标位置 = Point(x, y);
		if (是否画矩形)
		{ }
	}break;
	case EVENT_LBUTTONUP:
	{
		是否画矩形 = false;
		sprintf(temp, "(%d,%d)", x, y);
		putText(image, temp, Point(x, y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));
		//调用函数进行绘制
		cv::rectangle(image,左击顶点, 鼠标位置, cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色  
	}break;
}
}

int main()
{

system("color 9F");//毛大大程序里的,改变console颜色	
Mat org = imread("2.jpg"),temp1,temp2;
	while (waitKey(30) != 27) {
	org.copyTo(temp1);//用来显示点的坐标以及临时的方框
	namedWindow("img");//定义一个img窗口 
	setMouseCallback("img", on_mouse, (void*)&org);//调用回调函数    
	if(是否画矩形)rectangle(temp1, 左击顶点, 鼠标位置, cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色  
	putText(temp1,"("+std::to_string(鼠标位置.x)+","+std::to_string(鼠标位置.y)+")" , 鼠标位置, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));
	imshow("img",temp1);
	}

}

参考: 毛星云的某篇博客的代码,因为是从别人转载的文章里拷贝代码修改的,故而没有去找源博客地址,先谢过了,毛大大的博客确实非常有帮助。


提前祝春节愉快呀~



  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值