基础入门
OpenCV提供的功能非常多,图像显示是最基础也是最直观的一部分。它让我们能够直观地看到算法处理后的效果,对于调试和验证都至关重要。在OpenCV中,图像显示主要依赖于以下四个关键的数据结构和函数。
1、Mat类。这是OpenCV中最基本的数据结构,代表了一个多维的数组,通常用于存储图像数据。cv::Mat对象可以用来存储灰度图像、彩色图像,以及其他类型的矩阵数据。
2、imshow函数。用于在指定窗口显示图像,函数原型为imshow(winname, mat)。其中,winname是窗口的名称,mat是要显示的图像矩阵,通常为cv::Mat对象。
3、namedWindow函数。创建一个窗口,并为它分配一个名称。这一步虽然不是必须的,但在实际应用中通常会先创建窗口再显示图像,以确保窗口大小和位置符合预期。函数原型为namedWindow(winname, flags),其中,flags可以用来指定窗口的一些属性,比如:是否可调整大小等。
4、waitKey函数。用于等待键盘事件发生,即等待用户按下某个键。这对于图像显示至关重要,因为如果没有它,图像窗口会立即关闭。函数原型为waitKey(delay),参数delay指定了等待的时间,以毫秒为单位。如果设置为0,则表示无限期等待。
实战解析
下面的实战代码读取一张图片并显示在屏幕上,直到用户按下任意键后关闭窗口。
第一行和第二行引入了OpenCV库的主要头文件,并声明使用cv命名空间,这样就不必在每次调用OpenCV函数时都加上cv::前缀。
在main函数中,我们使用imread函数尝试从指定路径(这里是"OpenCV.png",实际使用时,应替换为真实图片路径)读取图像,并将其存储在一个名为image的Mat对象中。接下来,判断image是否为空,即检查图像是否被成功读取。如果不为空,则输出错误信息并返回-1,结束程序执行。
然后,我们使用namedWindow函数创建一个名为"Image Show"的窗口,并设置了标志WINDOW_NORMAL,以允许用户调整窗口的大小。通过imshow函数,在刚刚创建的窗口中显示image图像。
最后,调用waitKey(0)函数,使程序暂停并等待用户按下任何键盘按键。参数0意味着程序将无限制地等待,直到接收到键盘输入。当用户按键后,调用destroyAllWindows()函数来关闭所有由OpenCV创建的窗口。
#include <opencv2/opencv.hpp>
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
// 读取图像,请替换为你自己的图片路径
Mat image = imread("OpenCV.png");
// 检查图像是否被正确读取
if(image.empty())
{
cout << "Can not open or find the image" << endl;
return -1;
}
// 创建一个名为"Image Show"的窗口,WINDOW_NORMAL允许调整窗口大小
namedWindow("Image Show", WINDOW_NORMAL);
// 在窗口中显示图像
imshow("Image Show", image);
// 等待用户按键,然后关闭窗口;0表示无限等待,直到用户按键
waitKey(0);
// 关闭所有窗口
destroyAllWindows();
return 0;
}
窗口自适应
在某些场景下,我们希望窗口能自动适应图像的尺寸。此时,可以使用resizeWindow函数,并传入图像的宽度和高度。
namedWindow("Image Show", WINDOW_NORMAL);
// image.cols代表图像的宽度, image.rows代表图像的高度
resizeWindow("Image Show", image.cols, image.rows);
imshow("Image Show", image);
执行上面的示例代码,运行效果可参考下图。