opencv(12) 鼠标操作

指定鼠标操作消息的回调函数为SetMouseCallBack。

void SetMouseCllBack(conststring& winname,MouseCallBack onMouse,void * userdata=0)
  • 第一个参数:const string&类型的winname,窗口的名字。
  • 第二个参数:MouseCallBack类型的onMouse,指定窗口里每次鼠标时间发生的时候,被调用的函数指针。这个函数的原型大致是void Foo(int event,int x,int y,int flags,void8 param)。
  • 第三个参数:void*类型的userdata,用户定义的传递到hi掉函数的参数,有默认值为0。

举例:

//头文件命名空间包含部分
#include
using namespace cv;
#define WINDOW_NAME "【程序窗口】"

//全局函数的声明
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);
void ShowHelpText();

//全局变量的声明
Rect g_rectangle;
bool g_bDrawingBox = false;
RNG g_rng(12345);

int main(int argc,char** argv){
	//准备参数
	g_rectangle = Rect(-1, -1, 0, 0);
	Mat srcImage(600, 800, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);
	g_rectangle = Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(0);

	//设置鼠标的回调函数
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);

	//程序主循环,当进行绘制的标识为真时,进行绘制
	while (1)
	{
		//复制原图到临时变量
		srcImage.copyTo(tempImage);
		//当绘制标识符为真时进行绘制
		if (g_bDrawingBox)
		{
			DrawRectangle(tempImage, g_rectangle);
		}
		imshow(WINDOW_NAME, tempImage);
		if (waitKey(10) == 27)
		{
			break;
		}
	}
	return 0;
}

//函数1
void on_MouseHandle(int event, int x, int y, int flags, void* param){
	Mat& image = *(cv::Mat*)param;
	switch (event)
	{
		//鼠标移动消息
	case EVENT_MOUSEMOVE:
	{
		if (g_bDrawingBox)
		{
			g_rectangle.width = x - g_rectangle.x;
			g_rectangle.height = y - g_rectangle.y;
		}
	}
		break;
	case EVENT_LBUTTONDOWN:
	{
		g_bDrawingBox = true;
		g_rectangle = Rect(x, y, 0, 0);
	}
		break;
	case EVENT_LBUTTONUP:
	{
		g_bDrawingBox = false;
		if (g_rectangle.width<0)
		{
			g_rectangle.x += g_rectangle.width;
			g_rectangle.width *= -1;
		}
		if (g_rectangle.height<0)
		{
			g_rectangle.y += g_rectangle.height;
			g_rectangle.height *= -1;
		}
		//调用函数进行绘制
		DrawRectangle(image, g_rectangle);
	}
		break;
	default:
		break;
	}
}

//函数2
void DrawRectangle(cv::Mat& img, cv::Rect box){
	//随机颜色
	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

opencv(12) 鼠标操作_第1张图片

你可能感兴趣的:(opencv3编程入门)