zoukankan      html  css  js  c++  java
  • 鼠标操作

    一、鼠标操作SetMouseCallback()

     1 #include<opencv2opencv.hpp>
     2 #include<iostream>
     3 #include<vector>
     4 using namespace cv;
     5 using namespace std;
     6 
     7 #define WINDOW_NAME "【程序窗口】"
     8 
     9 void on_MouseHandle(int event, int x, int y, int flags, void* param);
    10 void DrawRectangle(Mat &img, Rect box);
    11 void ShowHelpText();
    12 
    13 Rect g_rectangle;
    14 bool g_bDrawingBox = false; //是否进行绘制
    15 RNG g_rng(12345);
    16 
    17 int main(int argc,char** argv) {
    18     //Mat image1= imread("C:\Users\Nelsoner\Desktop\Camera Roll\05.jpg");
    19     //Mat image2 = imread("C:\Users\Nelsoner\Desktop\Camera Roll\08.jpg");
    20     
    21     g_rectangle = Rect(-1,-1,0,0);
    22     Mat srcImage(600,800,CV_8UC3),tempImage;
    23     srcImage.copyTo(tempImage);
    24     srcImage = Scalar::all(0);
    25 
    26     //设置鼠标操作回掉函数
    27     namedWindow(WINDOW_NAME);
    28     setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
    29 
    30     //程序主循环,当进行绘制的标识符为真,进行绘制
    31     while (1) {
    32         srcImage.copyTo(tempImage);   //复制源图到临时变量
    33         if (g_bDrawingBox)
    34             DrawRectangle(tempImage,g_rectangle);
    35         imshow(WINDOW_NAME,tempImage);
    36         if (waitKey(10) == 27)   //按下ESC键,程序退出
    37             break;
    38     }
    39     return 0;
    40 }
    41 
    42 void on_MouseHandle(int event, int x, int y, int flags, void* param) {
    43     Mat& image = *(Mat*)param;
    44     switch (event) {
    45         //鼠标移动消息
    46         case EVENT_MOUSEMOVE:
    47         {
    48             if (g_bDrawingBox)  //如果是否进行绘制的标识符为真,则记录下长和宽到Rect型变量中
    49             {
    50                 g_rectangle.width = x - g_rectangle.x;
    51                 g_rectangle.height = y - g_rectangle.y;
    52             }
    53         }
    54         break;
    55 
    56         //左键按下消息
    57         case EVENT_LBUTTONDOWN:
    58         {
    59             g_bDrawingBox = true;
    60             g_rectangle = Rect(x, y, 0, 0);    //记录起始点
    61         }
    62         break;
    63 
    64         //左键抬起消息
    65         case EVENT_LBUTTONUP:
    66         {
    67             g_bDrawingBox = false;   //置标识符为false
    68             //对宽和高小于0的处理
    69             if (g_rectangle.width < 0) {
    70                 g_rectangle.x += g_rectangle.width;
    71                 g_rectangle.width *= -1;
    72             }
    73             if (g_rectangle.height < 0) {
    74                 g_rectangle.y += g_rectangle.height;
    75                 g_rectangle.height *= -1;
    76             }
    77             //调用函数进行绘制
    78             DrawRectangle(image,g_rectangle);
    79         }
    80         break;
    81     }
    82 }
    83 
    84 void DrawRectangle(Mat &img, Rect box)
    85 {
    86     rectangle(img,box.tl(),box.br(),Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255), g_rng.uniform(0, 255)));
    87 }

    效果图:

    学习小总结:

    1.OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话)

    2.使用OpenCV的C++接口时不需要考虑内存释放问题

    3.复制运算和拷贝构造函数只复制信息头

    4.使用函数clone()或者copyTo()来复制一副图像的矩阵

  • 相关阅读:
    《家庭财务总管》升级了(1.0.0.1)
    谁拥有接口?
    VScode调试C++工程
    NVIDIA显卡原生管理查询功能nvidiasmi的部分使用功能
    python版本的两款NVIDIA显卡管理查询工具
    pytorch之网络参数统计 torchstat & torchsummary
    电脑、笔记本、手机维修经验分享网站,专业领域网站
    Python使用pynvml查看GPU信息
    【转载】 Ubuntu下使用VSCode的launch.json及tasks.json编写
    笔记本挑电源适配器吗,是不是电压相同情况下保证功率大于等于原装适配器就可以保证笔记本正常运行???
  • 原文地址:https://www.cnblogs.com/Nelsoner/p/6718957.html
Copyright © 2011-2022 走看看