OpenCV学习(9)

OpenCV学习(9),第1张

OpenCV学习(9)

HighGUI图形用户界面初步:鼠标 *** 作,示例程序(鼠标交互)

OpenCV中的鼠标 *** 作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的。创建和指定滑动条回调函数的函数为createTrackbar,而指定鼠标 *** 作消息回调函数的函数为SetMouseCallback。下面一起来了解一下它。
SetMousecallback函数的作用是为指定的窗口设置鼠标回调函数,原型如下。
C++ : void setMousecallback (conststring& winname,MouseCallback onMouse,void* userdata=0 )
第一个参数,const string&类型的winname,窗口的名字。
第二个参数,MouseCallback类型的onMouse,指定窗口里每次鼠标时间发生的时候,被调用的函数指针。
第三个参数,void*类型的userdata,用户定义的传递到回调函数的参数,有默认值0。

示例程序:了解函数的用法以及如何在opencv中使用鼠标进行交互

代码如下:

#include
#include//opencv highgui 头文件
#include//opencv 图像处理头文件
#include 
#include
#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)
{
	cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
	//准备参数
	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; //按下ESC键,程序退出
	}
	return 0;
}
//on_MouseHandle函数
//描述:鼠标回调函数,根据不同的鼠标事件进行不同的 *** 作
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)//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中
		{
		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; //置标识符为false//对宽和高小于0的处理
	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;
  }
}
//DrawRectangle()函数
//自定义的矩形绘制函数
 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)));//随机颜色
}


运行截图:

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702828.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存