Opencv3学习笔记之鼠标操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38784454/article/details/81636491

鼠标操作的消息映射方式:中介函数(SetMouseCallback)+回调函数。

鼠标操作:1)鼠标移动(EVENT_MOUSEMOVE)

                    2)  左键按下(EVENT_LMOUSEDOWN)

                    3)  左键拿起(EVENT_LMOUSEUP)

                    4)  右键按下(EVENT_RMOUSEDOWN)

                    5)  右键拿起(EVENT_RMOUSEUP)

如果出现这个错误:错误    1    error C2664: “void cv::setMouseCallback(const std::string &,cv::MouseCallback,void *)”: 无法将参数 2 从“void (__cdecl *)(int,int,int,void *)”转换为“cv::MouseCallback”    E:\学习资料\VS2013程序\imageblur\imageblur\imagefusion.cpp    54    1    imageblur
注意观察有没有声明全局函数MouseCallback,以及MouseCallback声明的是否正确。

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
using namespace cv;
using namespace std;



#define WINDOW_NAME "【程序窗口】"
// 全局函数声明
void on_MouseHandle(int event,int x,int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);


//全局变量声明
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和tempImage
	srcImage.copyTo(tempImage);
	g_rectangle=Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(255); //设置元素的初始值,即srcImage 里面全为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;
}
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;
	}
}
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
	cv::rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), 
		g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

猜你喜欢

转载自blog.csdn.net/qq_38784454/article/details/81636491