【opencv学习】鼠标回调函数、鼠标控制画矩形

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
#define WinDow "程序窗口"

void MouseHandle(int event, int x, int y, int flags, void* param);//鼠标回调函数
void Drawrectangle(cv::Mat& img, cv::Rect box);//矩形绘制函数
bool DrawingBox = false;//是否就行矩形绘制
Rect y_rectangle;//绘制的图形参数(位置,大小)
RNG rng(12345);//random number generator随机数生成器

int main()
{
	y_rectangle = Rect(-1, -1, 0, 0);//初始化参数
	Mat srcimage(600, 800, CV_8UC3), tempimage;//初始化对象600*800,3通道
	srcimage = Scalar::all(255);//初始化srcimage背景颜色

	namedWindow(WinDow);
	setMouseCallback(WinDow, MouseHandle, (void*)&srcimage);//鼠标操作回调函数,边显示,边画图
	while (1)
	{
		srcimage.copyTo(tempimage);//将srcimage复制到tempimage
		if (DrawingBox)
			Drawrectangle(tempimage, y_rectangle);
		imshow(WinDow, tempimage);
		if (waitKey(10) == 27)//按esc跳出
			break;
	}
	return 0;
}

void MouseHandle(int event, int x, int y, int flags, void* param)
{
	Mat& image = *(cv::Mat*)param;
	switch (event)
	{
	case EVENT_MOUSEMOVE://鼠标移动
	{
		if (DrawingBox)//绘制矩形,则记录下矩形的长宽
		{
			y_rectangle.width = x - y_rectangle.x;//要绘制的矩形宽度为:当前坐标值减去移动前的坐标值
			y_rectangle.height = y - y_rectangle.y;
		}
	}
	break;
	case EVENT_LBUTTONDOWN://点击鼠标左键
	{
		DrawingBox = true;//绘制开关打开
		y_rectangle = Rect(x, y, 0, 0);//记录矩形左上角起始点
	}
	break;
	case EVENT_LBUTTONUP://鼠标左键抬起
	{
		DrawingBox = false;//绘制开关关闭
		//如果鼠标往左上两个方向移动,那么有一个值为负数
		if (y_rectangle.width < 0)
		{
			y_rectangle.x += y_rectangle.width;//坐标值
			y_rectangle.width *= -1;//宽度值
		}
		if (y_rectangle.height < 0)
		{
			y_rectangle.y += y_rectangle.height;
			y_rectangle.height *= -1;
		}
		Drawrectangle(image, y_rectangle);//动作完成以后要绘制出图形
	}
	break;
	}
}

void Drawrectangle(cv::Mat& img, cv::Rect box)
{
	rectangle(img, box.tl(), box.br(), Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));
}

1.回调函数可以简单理解为一边做一件事的同时做另一件事,优化之前的实现完一个函数后才实现另一个的问题。

鼠标回调函数就是一边鼠标操作画图,一边显示画出的图像。

2.实现一个矩形rec只需要知道一个左上角的坐标和宽高即可实例化对象。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习