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


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


效果如下:

Opencv鼠标响应(框选以及取点)_第1张图片


鼠标调用关键函数为:

	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 
#include
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鼠标响应(框选以及取点)_第2张图片


你可能感兴趣的:(opencv,-----语言相关-----,-----图像处理-----)