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鼠标响应(框选以及取点)的主要内容,如果未能解决你的问题,请参考以下文章