联系我们
简单又实用的WordPress网站制作教学
当前位置:网站首页 > 程序开发学习 > 正文

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

作者:小教学发布时间:2023-09-29分类:程序开发学习浏览:77


导读:c++中的namedWindowC++中的namedWindow是OpenCV库中的一个函数,用于创建一个窗口,用于显示图像。OpenCV是一个广泛用于计算机视觉和图像处理的开...

c++中的namedWindow

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

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

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

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

示例用法:

#include <opencv2/opencv.hpp>

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;
}

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

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

c++中的setMouseCallback

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

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

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

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

#include <opencv2/opencv.hpp>

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;
}

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

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

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
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)));//随机颜色
}

在这里插入图片描述





程序开发学习排行
最近发表
网站分类
标签列表