Opencv鼠标操作

来源:互联网 发布:垃圾桶 知乎 编辑:程序博客网 时间:2024/06/05 06:46
#include<iostream>#include<opencv2/opencv.hpp>#define WINDOW_NAME "鼠标事件窗口"using namespace std;using namespace cv;Rect g_rectangle;bool g_bDrawingBox = false;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)));}/*注意:不能在毁掉函数中写入未初始化的矩阵类,所以需要用时,需要写一个标志位,然后再在while(1)循环内使用*/void onMouse(int event, int x, int y, int flag, void *param){Mat &img = *(cv::Mat*)param;switch (event){ //移动鼠标的时候case CV_EVENT_MOUSEMOVE:{   if (g_bDrawingBox)   {   g_rectangle.width = x - g_rectangle.x;   g_rectangle.height = y - g_rectangle.y;   }}break;//点击鼠标左键时case CV_EVENT_LBUTTONDOWN:{ g_bDrawingBox = true; g_rectangle = Rect(x, y, 0, 0);}break;//松开鼠标左键时case CV_EVENT_LBUTTONUP:{   g_bDrawingBox = false;   DrawRectangle(img, g_rectangle);}break;}}int main(){Mat srcImage(600, 800, CV_8UC3);Mat tempImage;srcImage.copyTo(tempImage);srcImage = Scalar::all(0);namedWindow(WINDOW_NAME);setMouseCallback(WINDOW_NAME, onMouse, (void *)&srcImage);while (1){srcImage.copyTo(tempImage);if (g_bDrawingBox)DrawRectangle(tempImage, g_rectangle);imshow(WINDOW_NAME, tempImage);if(waitKey(10) == 27)break;/*DrawRectangle(srcImage, g_rectangle);imshow(WINDOW_NAME, srcImage);if (waitKey(10) == 27)break;*/}return 0;}



0 0
原创粉丝点击