#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
#define WinDow "程序窗口"
void MouseHandle(int event, int x, int y, int flags, void* param);//鼠標回調函數(shù)
void Drawrectangle(cv::Mat& img, cv::Rect box);//矩形繪制函數(shù)
bool DrawingBox = false;//是否就行矩形繪制
Rect y_rectangle;//繪制的圖形參數(shù)(位置,大小)
RNG rng(12345);//random number generator隨機數(shù)生成器
int main()
{
y_rectangle = Rect(-1, -1, 0, 0);//初始化參數(shù)
Mat srcimage(600, 800, CV_8UC3), tempimage;//初始化對象600*800,3通道
srcimage = Scalar::all(255);//初始化srcimage背景顏色
namedWindow(WinDow);
setMouseCallback(WinDow, MouseHandle, (void*)&srcimage);//鼠標操作回調函數(shù),邊顯示,邊畫圖
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;//繪制開關關閉
//如果鼠標往左上兩個方向移動,那么有一個值為負數(shù)
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.回調函數(shù)可以簡單理解為一邊做一件事的同時做另一件事,優(yōu)化之前的實現(xiàn)完一個函數(shù)后才實現(xiàn)另一個的問題。
鼠標回調函數(shù)就是一邊鼠標操作畫圖,一邊顯示畫出的圖像。
2.實現(xiàn)一個矩形rec只需要知道一個左上角的坐標和寬高即可實例化對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-622128.html
文章來源:http://www.zghlxwxcb.cn/news/detail-622128.html
到了這里,關于【opencv學習】鼠標回調函數(shù)、鼠標控制畫矩形的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!