利用鼠标回调函数来在图像上画矩形

本文介绍了一个使用OpenCV和C++实现的图像矩形标注程序。通过鼠标操作,在图像上绘制并调整矩形区域,适用于图像处理和目标检测任务的初步标注。代码详细展示了从创建图像窗口到响应鼠标事件,再到绘制矩形的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

Mat image;
Rect xx;
bool draw_or_not=0;
RNG g_rng(12345);

//利用鼠标回调函数来在图像上画矩形。
void mouse_on(int event,int x,int y,int ,void*);
void draw_rect(Mat & im,Rect &rec);
int main()
{
	//1.创建图像,或者读取一副图像。
	image = imread("女神.jpg");
	
	//2.初始化一个矩形。
	xx = Rect(-1,-1,0,0);
	//3.创建回调函数。
	namedWindow("效果窗口");
	setMouseCallback("效果窗口",mouse_on);
	//4.回调函数调用的画图函数。
	
	while (1)
	{
		
			
		imshow("效果窗口",image);

		int c = waitKey(20);
		if (c == 27)
			break;

	}
	
	
	

	

	

	
	waitKey(0);
	return 1;
	
}

void mouse_on(int event, int x, int y, int, void*)
{
	//1.判断鼠标动作,动作有移动,左键按下,左键松开。在松开时候画矩形。
	//1.左键按下,取rect的起始坐标。
	if (event == EVENT_LBUTTONDOWN)
	{
		draw_or_not = 1;
		xx.x = x;
		xx.y = y;


	}
	//2.移动的时候,计算rect的长和宽。
	if (draw_or_not==1&&event == EVENT_MOUSEMOVE)
	{
		
		xx.width = x - xx.x;
		xx.height = y - xx.y;

	}
	//3.左键松开时候,判断长和宽相对于开始点的方向,找出rect的左上点。
	if (draw_or_not == 1 && event == CV_EVENT_LBUTTONUP)
	{
		

		draw_or_not = 0;
		if (xx.width < 0)
		{
			xx.x = xx.x + xx.width;
			xx.width = -xx.width;
		}
		if (xx.height < 0)
		{
			xx.y = xx.y + xx.height;
			xx.height *= -1;
		}

		draw_rect(image, xx);
		

	}
	
	


}


//4.根据得到的rect参数,来在image上画矩形。

void draw_rect(Mat& im, Rect& rec)
{
	rectangle(im,rec,Scalar(g_rng.uniform(0,255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));


}

在这里插入图片描述

### OpenCV 中鼠标回调函数的使用方法 OpenCV 提供了一个灵活的方法 `cv2.setMouseCallback()` 来捕获鼠标的交互事件并执行相应的操作。以下是关于该函数的具体说明以及示例代码。 #### 函数定义 `cv2.setMouseCallback(window_name, on_mouse, param=None)` - **window_name**: 调用窗口的名字,必须与之前创建的窗口名称一致。 - **on_mouse**: 定义的一个回调函数,用于响应鼠标事件。 - **param**: 可选参数,默认为 None,可以传递额外的数据给回调函数。 #### 常见鼠标事件 常见的鼠标事件包括但限于以下几种: - 左键按下 (`cv.EVENT_LBUTTONDOWN`) - 左键释放 (`cv.EVENT_LBUTTONUP`) - 鼠标移动 (`cv.EVENT_MOUSEMOVE`) 这些事件可以通过回调函数中的 `event` 参数获取[^1]。 #### 示例代码:绘制圆圈和矩形 下面是一个简单的例子,演示如何通过鼠标事件在图像上绘制圆圈和矩形: ```python import cv2 import numpy as np drawing = False # 如果鼠标按下则变为True mode = True # 如果为真,则矩形;按m切换成圆 ix,iy = -1,-1 # 创建回调函数 def draw_circle(event,x,y,flags,param): global ix,iy,drawing, mode if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix,iy = x,y elif event == cv2.EVENT_MOUSEMOVE: if drawing == True: if mode == True: cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv2.circle(img,(x,y),5,(0,0,255),-1) elif event == cv2.EVENT_LBUTTONUP: drawing = False if mode == True: cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv2.circle(img,(x,y),5,(0,0,255),-1) img = np.zeros((512,512,3), np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle) while(1): cv2.imshow('image',img) k = cv2.waitKey(1) & 0xFF if k == ord('m'): mode = not mode elif k == 27: # ESC 键退出 break cv2.destroyAllWindows() ``` 此代码展示了如何利用鼠标事件实现在图片上的绘图功能[^2]。 #### Qt 下的应用扩展 如果希望将这种绘图功能集成到更复杂的 GUI 应用中,比如基于 Qt 的界面开发环境,也可以借助 OpenCV 的鼠标回调机制完成类似的图形绘制工作,并进一步将其嵌入到 QLabel 控件中显示出来[^3]。 #### 处理多个区域的选择 对于需要选择多个感兴趣区域 (ROI) 的场景,可通过记录每次鼠标拖拽形成的边界框坐标来实现。具体逻辑涉及检测鼠标按键状态变化及相应位置更新[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值