• 创建一个窗口使用鼠标点击进行画矩形,函数:namedWindow,setMouseCallback


    c++中的namedWindow

    C++中的namedWindowOpenCV库中的一个函数,用于创建一个窗口,用于显示图像。OpenCV是一个广泛用于计算机视觉和图像处理的开源库,它提供了一组用于处理图像和视频的函数和工具。

    namedWindow函数的主要作用是为图像显示创建一个窗口,并为这个窗口指定一个名称。一旦窗口被创建,你可以使用其他OpenCV函数将图像显示在这个窗口中,以便进行图像处理、分析和可视化。

    以下是namedWindow函数的基本语法:

    void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
    
    • 1
    • winname:窗口的名称,通常是一个字符串。
    • flags:窗口的标志,可以是以下之一:
      • WINDOW_NORMAL:窗口大小可以调整。
      • WINDOW_AUTOSIZE:窗口大小自动调整以适应图像大小(默认值)。

    示例用法:

    #include 
    
    int main() {
        // 读取图像
        cv::Mat image = cv::imread("image.jpg");
    
        // 创建一个名为"MyWindow"的窗口
        cv::namedWindow("MyWindow", cv::WINDOW_NORMAL);
    
        // 将图像显示在窗口中
        cv::imshow("MyWindow", image);
    
        // 等待用户按下键盘上的任意键
        cv::waitKey(0);
    
        // 关闭窗口
        cv::destroyWindow("MyWindow");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这个示例中,我们首先读取一张图像,然后使用namedWindow创建了一个名为"MyWindow"的窗口,并将图像显示在窗口中。最后,我们使用waitKey等待用户按下键盘上的任意键来关闭窗口,并使用destroyWindow来销毁窗口。

    namedWindow函数通常在图像显示和交互式图像处理应用中使用,以方便用户查看和操作图像。

    c++中的setMouseCallback

    setMouseCallback是OpenCV库中的一个函数,用于设置鼠标事件回调函数,以便在用户与图像窗口交互时触发特定的鼠标事件。通过使用setMouseCallback,你可以捕获鼠标的各种动作,如单击、双击、拖动等,并根据这些动作执行相应的操作。

    以下是setMouseCallback函数的基本语法:

    void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0);
    
    • 1
    • winname:要设置鼠标事件回调函数的窗口名称。
    • onMouse:鼠标事件回调函数,它是一个用户定义的函数,用于处理鼠标事件。这个函数通常带有以下参数:
      • int event:触发的鼠标事件类型,如CV_EVENT_MOUSEMOVE(鼠标移动)、CV_EVENT_LBUTTONDOWN(左键按下)等。
      • int x:鼠标事件发生的x坐标。
      • int y:鼠标事件发生的y坐标。
      • int flags:鼠标事件的标志,可以包含额外信息。
      • void* userdata:用户数据指针,允许你将自定义数据传递给回调函数。

    下面是一个示例,演示如何使用setMouseCallback来捕获鼠标事件:

    #include 
    
    using namespace cv;
    
    void onMouse(int event, int x, int y, int flags, void* userdata) {
        if (event == EVENT_LBUTTONDOWN) {
            std::cout << "Left button clicked at (" << x << ", " << y << ")" << std::endl;
        }
    }
    
    int main() {
        Mat image = imread("image.jpg");
        namedWindow("MyWindow");
        setMouseCallback("MyWindow", onMouse);
    
        imshow("MyWindow", image);
        waitKey(0);
        destroyWindow("MyWindow");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这个示例中,我们首先创建一个窗口并显示一张图像。然后,我们使用setMouseCallback函数将onMouse函数注册为鼠标事件的回调函数。当用户在窗口上单击鼠标左键时,onMouse函数将被调用,并显示鼠标点击的坐标。其他鼠标事件也可以通过类似的方式捕获和处理。

    创建一个窗口使用鼠标点击进行画矩形

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    using namespace cv; //包含cv命名空间
    
    
    //----------------------【头文件、命名空间包含部分】----------------------
    // 描述: 包含程序所使用的头文件和命名空间
    
    
    #define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏
    //--------------------------【全局函数声明部分】------------------------
    // 描述: 全局函数的声明
    //-------------------
    void on_MouseHandle(int event, int x, int y, int flags, void* param);
    void DrawRectangle(cv::Mat& img, cv::Rect box);
    void ShowHelpText();
    //--------------------------【全局变量声明部分】------------------------
    // 描述:全局变量的声明
    //-------------------
    Rect g_rectangle;
    bool g_bDrawingBox = false;//是否进行绘制
    RNG g_rng(12345);
    //---------------------------【main()函数】-------------------------
    // 描述: 控制台应用程序的入口函数,我们的程序从这里开始执行
    //
    int main(int argc, char** argv)
    {
    	//【1】准备参数
    	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);
    	//【2】设置鼠标操作回调函数
    	//namedWindow:用于创建一个窗口,用于显示图像,用于处理图像和视频的函数和工具,一旦窗口被创建,你可以使用其他OpenCV函数将图像显示在这个窗口中,以便进行图像处理、分析和可视化。
    	namedWindow(WINDOW_NAME);
    	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//设置鼠标事件回调函数,以便在用户与图像窗口交互时触发特定的鼠标事件,捕获鼠标的各种动作,如单击、双击、拖动
    	//【3】程序主循环,当进行绘制的标识符为真时, 进行绘制
    	while (1)
    	{
    		srcImage.copyTo(tempImage);//函数会将源矩阵的数据复制到目标矩阵中,如果需要,还会执行数据类型的转换
    		if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//当进行绘制的标识符为真, 则进行绘制
    		imshow(WINDOW_NAME, tempImage);
    		if (waitKey(10) == 27) break;//按下ESC键,程序退出
    	}
    	return 0;
    }
    //----------------------【on_MouseHandle()函数】---------------------
    // 描述: 鼠标回调函数, 根据不同的鼠标事件进行不同的操作
    //int event:触发的鼠标事件类型
    //鼠标事件发生的x坐标。
    //鼠标事件发生的y坐标。
    //int flags:鼠标事件的标志,可以包含额外信息。
    //void* userdata:用户数据指针,允许你将自定义数据传递给回调函数。
    void on_MouseHandle(int event, int x, int y, int flags, 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, 0);//记录起始点
    	}
    	break;
    	//左键抬起消息
    	case EVENT_LBUTTONUP:
    	{
    		g_bDrawingBox = false;//置标识符为 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;
    	}
    }
    //【DrawRectangle()函数】----------------------
    // 描述: 自定义的矩形绘制函数
    void DrawRectangle(cv::Mat & img, cv::Rect box)
    {
    	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109

    在这里插入图片描述

  • 相关阅读:
    FreeRTOS简介
    Maven 国内源的配置方式(以阿里云为例)
    ChatGPT提示词工程师&AI大神吴恩达2023年视频课程学习实践
    腾讯云部署DevOps
    智慧金融-数据可视化
    bep003-Torrent文件解析.md
    Gopsutil/Process常用进程监控资源信息
    基于Java的中缀表达式转后缀表达式设计
    面向谓词/规则编程(二)
    docker容器管理-实操命令
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133377527