使用鼠標(biāo)圖像上畫(huà)出矩形
opencv中常用的除了TrackBar滑動(dòng)條事件,還有豐富的鼠標(biāo)事件,與TrackBar類(lèi)似,鼠標(biāo)事件也是使用回調(diào)函數(shù)判斷動(dòng)作的發(fā)生,并執(zhí)行相關(guān)的操作。整個(gè)行為與QT的信號(hào)與槽類(lèi)似。
在圖像中畫(huà)出矩形,需要使用setMouseCallback()和MouseCallback()函數(shù)。
本文使用的頭文件及命名空間:
#pragma once
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
設(shè)置鼠標(biāo)回調(diào)函數(shù):
winname :顯示圖像的窗口名
onMouse : 自定義的鼠標(biāo)回調(diào)函數(shù)
userdata : 輸入的無(wú)類(lèi)型指針參數(shù),即Mat圖像的地址
鼠標(biāo)回調(diào)函數(shù):取名可以不同,但是參數(shù)類(lèi)型與數(shù)目需要一致
event : 鼠標(biāo)事件中的某一種
x : 當(dāng)前鼠標(biāo)的位置的橫坐標(biāo)
y :當(dāng)前鼠標(biāo)的位置的縱坐標(biāo)
flags : 鼠標(biāo)事件標(biāo)志的某一種
userdata : 傳入的無(wú)類(lèi)型指針參數(shù)
鼠標(biāo)事件類(lèi)型:
測(cè)試代碼:
使用鼠標(biāo)在圖像上畫(huà)出矩形,需要記錄鼠標(biāo)按下的起始位置作為矩形的左上角。
//--------------------------【Opencv中的鼠標(biāo)點(diǎn)擊事件】----------------------------
//全局變量
//保存鼠標(biāo)按下的起始點(diǎn)
Point2i startP;
//聲明回調(diào)函數(shù)
void myMouseevent(int event, int x, int y, int flags, void* userdata) {
//imshow("image show", *(Mat*)userdata);
Mat dst= (*(Mat*)userdata).clone();
//判斷左鍵按下,記錄起始點(diǎn)坐標(biāo)
if (event == EVENT_LBUTTONDOWN) {
startP.x = x;
startP.y = y;
}
//鼠標(biāo)左鍵為按下?tīng)顟B(tài),顯示需要畫(huà)的矩形,只能畫(huà)出鼠標(biāo)左下角移動(dòng)的矩形
if ( flags == EVENT_FLAG_LBUTTON) {
//計(jì)算需畫(huà)的矩形
Rect rect(startP.x, startP.y, x - startP.x, y - startP.y);
//在圖像上畫(huà)出矩形
rectangle(dst, rect, Scalar(0, 0, 250), 2,4);
imshow("image show", dst);
}
//左鍵松開(kāi),在原圖像畫(huà)出矩形
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);
}
}
//鼠標(biāo)事件測(cè)試,在圖像上畫(huà)矩形。
void mouseEventTest() {
Mat src = imread(path, 1);
namedWindow("image show", WINDOW_AUTOSIZE);
imshow("image show", src);
setMouseCallback("image show", myMouseevent, &src);
waitKey(0);
}
測(cè)試結(jié)果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-510130.html
上述代碼,沒(méi)有做鼠標(biāo)移動(dòng)前后坐標(biāo)相對(duì)位置的判斷,即只有當(dāng)移動(dòng)后的位置的橫縱坐標(biāo)均大于等于移動(dòng)前時(shí),才可以畫(huà)出矩形。如果需要任意方向畫(huà)出矩形,則需在畫(huà)矩形部分添加判斷相對(duì)位置代碼。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-510130.html
到了這里,關(guān)于C++ opencv鼠標(biāo)事件,在圖像上畫(huà)矩形的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!