C++ opencv鼠标事件,在图像上画矩形

这篇具有很好参考价值的文章主要介绍了C++ opencv鼠标事件,在图像上画矩形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用鼠标图像上画出矩形

opencv中常用的除了TrackBar滑动条事件,还有丰富的鼠标事件,与TrackBar类似,鼠标事件也是使用回调函数判断动作的发生,并执行相关的操作。整个行为与QT的信号与槽类似。
在图像中画出矩形,需要使用setMouseCallback()和MouseCallback()函数。

本文使用的头文件及命名空间:

#pragma once
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

设置鼠标回调函数:
C++ opencv鼠标事件,在图像上画矩形

winname :显示图像的窗口名
onMouse : 自定义的鼠标回调函数
userdata : 输入的无类型指针参数,即Mat图像的地址

鼠标回调函数:取名可以不同,但是参数类型与数目需要一致
C++ opencv鼠标事件,在图像上画矩形

event : 鼠标事件中的某一种
x : 当前鼠标的位置的横坐标
y :当前鼠标的位置的纵坐标
flags : 鼠标事件标志的某一种
userdata : 传入的无类型指针参数

鼠标事件类型:
C++ opencv鼠标事件,在图像上画矩形
测试代码:

使用鼠标在图像上画出矩形,需要记录鼠标按下的起始位置作为矩形的左上角。

//--------------------------【Opencv中的鼠标点击事件】----------------------------
//全局变量
//保存鼠标按下的起始点
Point2i startP;

//声明回调函数
void myMouseevent(int event, int x, int y, int flags, void* userdata) {
	
	//imshow("image show", *(Mat*)userdata);
	Mat dst= (*(Mat*)userdata).clone();
	//判断左键按下,记录起始点坐标
	if (event == EVENT_LBUTTONDOWN) {
		startP.x = x;
		startP.y = y;
	}
	//鼠标左键为按下状态,显示需要画的矩形,只能画出鼠标左下角移动的矩形
	if ( flags == EVENT_FLAG_LBUTTON) {
		//计算需画的矩形
		Rect rect(startP.x, startP.y, x - startP.x, y - startP.y);
		//在图像上画出矩形
		rectangle(dst, rect, Scalar(0, 0, 250), 2,4);
		imshow("image show", dst);
	}
	//左键松开,在原图像画出矩形
	if (event == EVENT_LBUTTONUP ) {
		Rect rect(startP.x, startP.y, x - startP.x, y - startP.y);
		rectangle(*(Mat *)userdata, rect, Scalar(0, 0, 250), 2, 4);
		imshow("image show", *(Mat*)userdata);
	}
	
}

//鼠标事件测试,在图像上画矩形。
void mouseEventTest() {
	Mat src = imread(path, 1);
	namedWindow("image show", WINDOW_AUTOSIZE);
	imshow("image show", src);
	setMouseCallback("image show", myMouseevent, &src);
	waitKey(0);
}

测试结果:
C++ opencv鼠标事件,在图像上画矩形
C++ opencv鼠标事件,在图像上画矩形

上述代码,没有做鼠标移动前后坐标相对位置的判断,即只有当移动后的位置的横纵坐标均大于等于移动前时,才可以画出矩形。如果需要任意方向画出矩形,则需在画矩形部分添加判断相对位置代码。文章来源地址https://www.toymoban.com/news/detail-510130.html

到了这里,关于C++ opencv鼠标事件,在图像上画矩形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包