opencv —— 鼠标操作

℡╲_俬逩灬. 提交于 2019-12-05 07:39:57
#include<opencv.hpp>
using namespace cv;
RNG rngs{ 12345 };//生成颜色的随机数
Rect rectangles;
bool DrawingBox = false;

//鼠标回调函数,根据不同的鼠标事件进行不同的操作
void on_Mouse(int event, int x, int y, int flags, void* param) {
    Mat& image = *(Mat*)param;
    switch (event){
    //鼠标移动
    case EVENT_MOUSEMOVE: 
        if (DrawingBox) {//“是否绘制”标识符为真,记录矩形长宽
            rectangles.width = x - rectangles.x;
            rectangles.height = y - rectangles.y;
        }
        break;
    //左键按下
    case EVENT_LBUTTONDOWN:
        DrawingBox = true;
        rectangles = Rect(x, y, 0, 0);//记录起始点
        break;
    //左键抬起
    case EVENT_LBUTTONUP:
        DrawingBox = false;
        if (rectangles.width < 0) {
            rectangles.x += rectangles.width;
            rectangles.width *= -1;
        }
        if (rectangles.height < 0) {
            rectangles.y += rectangles.height;
            rectangles.height *= -1;
        }
        rectangle(image, rectangles, Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255)));
        break;
    }
}
int main() {
    //准备参数
    rectangles = Rect(-1, -1, 0, 0);
    Mat srcImage(600,800,CV_8UC3), temImage;
    srcImage.copyTo(temImage);
    srcImage = Scalar::all(0);

    //设置鼠标操作回调函数
    namedWindow("鼠标操作");
    setMouseCallback("鼠标操作", on_Mouse, (void*)&srcImage);

    while (true){
        srcImage.copyTo(temImage);
        if(DrawingBox)
            rectangle(temImage, rectangles, Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255)));
        imshow("鼠标操作", temImage);
        if (waitKey(10) == 27)
            break;
    }
}

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!