opencv利用滑鼠滑動畫出多彩的形狀
阿新 • • 發佈:2020-07-21
今天沒有繼續學習新知識點,畫出了一個隨滑鼠畫出的圖形,知識點全都是之前學的,話不多說,先上圖:
程式碼部分:
// opencvMouse.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; #define WINDOW_NAME "【視窗程式】" void on_MouseHandle(int event,int x,int y,int flages,void * param); void DrawRectangle(cv::Mat & img,cv::Rect box); //全域性變數 Rect g_rectangle; bool g_bDrawingBox = false; //是否進行繪製 RNG rng(12345); int main() { //【1】準備引數 Mat srcImage(600,800,CV_8UC3),tempImage; srcImage.copyTo(tempImage); g_rectangle = Rect(-1,-1,0); srcImage = Scalar::all(0); //【2】設定滑鼠操作做回撥函式 namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage); //【3】程式主迴圈,當程序繪製的識別符號為真時,進行繪製 while (true) { srcImage.copyTo(tempImage); //複製源圖到臨時變數 if (g_bDrawingBox) { DrawRectangle(tempImage,g_rectangle); } imshow(WINDOW_NAME,tempImage); if (waitKey(10) == 27) //按下ESC建,程式退出 { break; } } return 0; } void on_MouseHandle(int event,void * param) { Mat & image = *(cv::Mat*)param; 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); //記錄起始點 } break; case EVENT_LBUTTONUP: //左鍵鬆開訊息 { g_bDrawingBox = 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; } } void DrawRectangle(cv::Mat & img,cv::Rect box) { rectangle(img,box.tl(),box.br(),Scalar(rng.uniform(0,255),rng.uniform(0,255))); //隨機顏色 }
裡面就使用通過:
setMouseCallback(WINDOW_NAME,(void*)&srcImage);
滑鼠的操作來實現繪圖.
第一個引數: const string& 型別為winname,視窗的名字
第二個引數:MouseCallBack型別的onMouse,指定窗口裡每次滑鼠時間發生的時候呼叫的函式指標
第三個引數: void* 使用者定義的傳遞到回撥函式的引數,預設為0
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。