天天看點

【OpenCV C++】滑鼠繪制矩形程式說明代碼運作效果

Opencv C++ 滑鼠繪制矩形

  • 程式說明
  • 代碼
  • 運作效果

程式說明

// 程式描述:OpenCV C++滑鼠繪制矩形

// 參 考:毛星雲《OpenCV3程式設計入門》

// 作業系統: Windows 10 64bit

// 開發語言: C++

// IDE 版 本:Visual Studio 2019

// OpenCV版本:4.20

代碼

#include <opencv2/opencv.hpp>
using namespace cv;

//-----------------------------------【宏定義部分】--------------------------------------------
//  描述:定義一些輔助宏 
//------------------------------------------------------------------------------------------------ 
#define WINDOW_NAME "【程式視窗】"        //為視窗标題定義的宏 


//-----------------------------------【全局函數聲明部分】------------------------------------
//		描述:全局函數的聲明
//------------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);
void ShowHelpText();

//-----------------------------------【全局變量聲明部分】-----------------------------------
//		描述:全局變量的聲明
//-----------------------------------------------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否進行繪制
RNG g_rng(12345);



//-----------------------------------【main( )函數】--------------------------------------------
//		描述:控制台應用程式的入口函數,我們的程式從這裡開始執行
//-------------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
	//【0】改變console字型顔色
	system("color 9F");

	//【0】顯示歡迎和幫助文字
	ShowHelpText();

	//【1】準備參數
	g_rectangle = Rect(-1, -1, 0, 0);//Rect_<_Tp>::Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height)
	Mat srcImage(600, 800, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);
	g_rectangle = Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(0);

	//【2】設定滑鼠操作回調函數
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);

	//【3】程式主循環,當進行繪制的辨別符為真時,進行繪制
	while (1)
	{
		srcImage.copyTo(tempImage);//拷貝源圖到臨時變量
		if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//當進行繪制的辨別符為真,則進行繪制
		imshow(WINDOW_NAME, tempImage);
		if (waitKey(10) == 27) break;//按下ESC鍵,程式退出
	}
	return 0;
}



//--------------------------------【on_MouseHandle( )函數】-----------------------------
//		描述:滑鼠回調函數,根據不同的滑鼠事件進行不同的操作
//-----------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

	Mat& image = *(cv::Mat*)param;  //param強制轉換為 Mat型
	switch (event)
	{
		//滑鼠移動消息
	case EVENT_MOUSEMOVE:
	{
		if (g_bDrawingBox)//如果是否進行繪制的辨別符為真,則記錄下長和寬到RECT型變量中
		{
			g_rectangle.width = x - g_rectangle.x;
			g_rectangle.height = y - g_rectangle.y;
		}
	}
	break;

	//左鍵按下消息
	case EVENT_LBUTTONDOWN:
	{
		g_bDrawingBox = true;
		g_rectangle = Rect(x, y, 0, 0);//記錄起始點
	}
	break;

	//左鍵擡起消息
	case EVENT_LBUTTONUP:
	{
		g_bDrawingBox = false;//置辨別符為false
		//對寬和高小于0的處理
		if (g_rectangle.width < 0)
		{
			g_rectangle.x += g_rectangle.width;
			g_rectangle.width *= -1;
		}

		if (g_rectangle.height < 0)
		{
			g_rectangle.y += g_rectangle.height;
			g_rectangle.height *= -1;
		}
		//調用函數進行繪制
		DrawRectangle(image, g_rectangle);
	}
	break;

	}
}



//-----------------------------------【DrawRectangle( )函數】------------------------------
//		描述:自定義的矩形繪制函數
//-----------------------------------------------------------------------------------------------
void DrawRectangle(Mat& img, Rect box)
{
	rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随機顔色
}


//-----------------------------------【ShowHelpText( )函數】-----------------------------
//          描述:輸出一些幫助資訊
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
	//輸出一些幫助資訊
	printf("\n\n\n\t歡迎來到【滑鼠互動示範】示例程式\n");
	printf("\n\n\t請在視窗中點選滑鼠左鍵并拖動以繪制矩形\n");

}
           

運作效果

【OpenCV C++】滑鼠繪制矩形程式說明代碼運作效果

推動滑鼠随意繪制矩形

【OpenCV C++】滑鼠繪制矩形程式說明代碼運作效果

繼續閱讀