OpenCV鼠標畫圖例程,鼠標繪製矩形

效果圖
這裏寫圖片描述

#include <opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "程序窗口"

Rect g_rectangle;
bool g_DrawingBox;
RNG g_rng(12345);

//矩形繪製函數
void DrawRectangle(Mat& img, Rect box)
{
    rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),
        g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//隨機顏色
}
//鼠標回調函數
void on_MouseHandle(int event, int x, int y, int flags, void *param)
{
    Mat &image = *(Mat*)param;
    switch (event)
    {
    case EVENT_MOUSEMOVE:
    {
        if (g_DrawingBox)
        {
            g_rectangle.width = x - g_rectangle.x;
            g_rectangle.height = y - g_rectangle.y;
        }
    }break;
    case EVENT_LBUTTONDOWN:
    {
        g_DrawingBox = true;
        g_rectangle = Rect(x, y, 0, 0);
    }break;
    case EVENT_LBUTTONUP:
    {
        g_DrawingBox = false;
        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;
    }
}

int main(int argc, char**argv)
{
    //準備參數
    g_rectangle = Rect(-1, -1, 0, 0);
    Mat srcImage(600, 800, CV_8UC3), tempImage;
    srcImage.copyTo(tempImage);
    g_rectangle = Rect(-1, -1, 0, 0);
    srcImage = Scalar::all(0);
    namedWindow(WINDOW_NAME);
    setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);
    //主程序循環
    while (1)
    {
        srcImage.copyTo(tempImage);//複製原圖像臨時變量
        if (g_DrawingBox)DrawRectangle(tempImage, g_rectangle);//繪製
        imshow(WINDOW_NAME, tempImage);
        if (waitKey(10) == 27)break;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章