1. 程式人生 > 程式設計 >opencv利用滑鼠滑動畫出多彩的形狀

opencv利用滑鼠滑動畫出多彩的形狀

今天沒有繼續學習新知識點,畫出了一個隨滑鼠畫出的圖形,知識點全都是之前學的,話不多說,先上圖:

opencv利用滑鼠滑動畫出多彩的形狀

程式碼部分:

// 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。