opencv-鼠标操作

/指定鼠标操作消息回调函数为SetMouseCallback
void setMouseCallback(const string &winname,MouseCallback onMouse,void
userdata=0);
(1)窗口的名字
(2)指定窗口里每次鼠标时间发生的时候,被调用的函数指针。这个函数的原型的大概形式为void Foo(int event,int x,int y,int flags,voidparam);
event是EVENT_+变量之一,x和y是鼠标在图像坐标系中的坐标值,flags是EVENT_FLAG的组合,param是用户定义的传递到SetMouseCallback函数调用的参数
/

#include “pch.h”
#include
#include <opencv2/opencv.hpp>
using namespace cv;
#define WINNAME “[程序窗口]”
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()
{
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(WINNAME);
setMouseCallback(WINNAME, on_MouseHandle,(void*)&srcImage);//设置鼠标操作回调函数
while (1)//程序主循环,当进行绘制的标识符为真时,进行绘制
{
srcImage.copyTo(tempImage);//复制源图到临时变量
if (g_bDrawingBox)DrawRectangle(tempImage, g_rectangle);//当进行绘制的标识符为真,进行绘制
imshow(WINNAME, 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)//如果是否进行绘制的标识符为真,则记录下长和宽到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
if (g_rectangle.width < 0)//对宽和高小于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)//自定义的矩形绘制函数
{
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/weixin_44270056/article/details/86656579