使用鼠标图像上画出矩形
opencv中常用的除了TrackBar滑动条事件,还有丰富的鼠标事件,与TrackBar类似,鼠标事件也是使用回调函数判断动作的发生,并执行相关的操作。整个行为与QT的信号与槽类似。
在图像中画出矩形,需要使用setMouseCallback()和MouseCallback()函数。
本文使用的头文件及命名空间:
#pragma once
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
设置鼠标回调函数:
winname :显示图像的窗口名
onMouse : 自定义的鼠标回调函数
userdata : 输入的无类型指针参数,即Mat图像的地址
鼠标回调函数:取名可以不同,但是参数类型与数目需要一致
event : 鼠标事件中的某一种
x : 当前鼠标的位置的横坐标
y :当前鼠标的位置的纵坐标
flags : 鼠标事件标志的某一种
userdata : 传入的无类型指针参数
鼠标事件类型:
测试代码:
使用鼠标在图像上画出矩形,需要记录鼠标按下的起始位置作为矩形的左上角。
//--------------------------【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);
}
测试结果:
文章来源:https://www.toymoban.com/news/detail-510130.html
上述代码,没有做鼠标移动前后坐标相对位置的判断,即只有当移动后的位置的横纵坐标均大于等于移动前时,才可以画出矩形。如果需要任意方向画出矩形,则需在画矩形部分添加判断相对位置代码。文章来源地址https://www.toymoban.com/news/detail-510130.html
到了这里,关于C++ opencv鼠标事件,在图像上画矩形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!