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

Posted 朱铭德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
	


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


提前祝春节愉快呀~



以上是关于Opencv鼠标响应(框选以及取点)的主要内容,如果未能解决你的问题,请参考以下文章

opencv-鼠标框选矩形区域并输出尺寸

opencv-鼠标框选矩形区域并输出尺寸

opencv-鼠标框选矩形区域并输出尺寸

opencv 实现 ROI 框选功能

OpenCV-PyQT项目实战项目案例03:鼠标框选

OpenCV-PyQT项目实战项目案例03:鼠标框选