c++中的namedWindow
C++中的namedWindow
是OpenCV库中的一个函数,用于创建一个窗口,用于显示图像。OpenCV是一个广泛用于计算机视觉和图像处理的开源库,它提供了一组用于处理图像和视频的函数和工具。
namedWindow
函数的主要作用是为图像显示创建一个窗口,并为这个窗口指定一个名称。一旦窗口被创建,你可以使用其他OpenCV函数将图像显示在这个窗口中,以便进行图像处理、分析和可视化。
以下是namedWindow
函数的基本语法:
cpp
void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
winname
:窗口的名称,通常是一个字符串。flags
:窗口的标志,可以是以下之一:WINDOW_NORMAL
:窗口大小可以调整。WINDOW_AUTOSIZE
:窗口大小自动调整以适应图像大小(默认值)。
示例用法:
cpp
#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
函数的基本语法:
cpp
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
来捕获鼠标事件:
cpp
#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
函数将被调用,并显示鼠标点击的坐标。其他鼠标事件也可以通过类似的方式捕获和处理。
创建一个窗口使用鼠标点击进行画矩形
cpp
#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)));//随机颜色
}