官方文档链接:https://docs.opencv.org/4.2.0/db/deb/tutorial_display_image.html
目标 (Goal)
- 加载图像( using cv::imread )
- 创建名为 OpenCV 的窗体( using cv::namedWindow )
- 在 OpenCV 窗体中显示图像( using cv::imshow )
示例代码
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
String imageName( "HappyFish.jpg" ); // by default
if( argc > 1)
{
imageName = argv[1];
}
Mat image;
image = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Read the file
if( image.empty() ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
解释 (Explanation)
在 OpenCV 中包含了很多模块,每个模块都针对图像处理的一个方向或一种方法。在使用它们之前,首先需要包含声明了每个模块内容的头文件。
几乎总是会用到:
- core,定义了 OpenCV 库中的基本功能
- highgui,包含了输入输出的功能函数
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
iostream 包含了命令行的输入输出函数。为了避免数据结构和函数名与其他库中的函数名冲突,OpenCV 有自己的命名空间:cv。为了避免在每个函数名前加“ cv:: ”,可以在编写程序之初,使用如下行来为整个文件导入命名空间。
using namespace cv;
using namespace std;
对于用于控制台输入输出的 STL 库也是一样。现在分析主函数,首先,我们要确保从命令行中获取有效的图像名称参数。否则会使用默认的图像 “HappyFish.jpg” 。
String imageName( "HappyFish.jpg" ); // by default
if( argc > 1 )
{
imageName = argv[1];
}
之后创建一个 Mat 对象来存储导入的图像数据。
Mat image;
然后调用 cv::imread 函数来加载图像,图像名称是通过 cv::imread 的第一个参数 argv[1] 指定的。第二个参数确定加载的图像的格式,有以下几种格式:
- IMREAD_UNCHANGED (<0) 按照原样加载图像 (包括 alpha 通道(如果存在))
- IMREAD_GRAYSCALE (=0) 将图像变为灰度图像在加载
- IMREAD_COLOR (>0) 按照 RGB 格式加载图像
image = cv::imread("HappyFish.jpg", cv::IMREAD_COLOR);
注意
OpenCV 提供了对多种个是图像的支持,包括:Windows 位图 (bmp)、便携式图像格式 (pbm、pgm、ppm) 和太阳光栅 (sr、ras)。同时借助插件你还可以加载其他格式的图像,例如 JPEG (jpeg、jpg、jpe),JPEG 2000 (jp2 - 在 CMake 中编码为 Jasper),TIFF 文件 (tiff、tif) 和便携式网络图形 (png)。此外,OpenEXR 也可以。
图像数据加载成功之后,我们想要在程序中输出图像,所以要通过使用 cv::namedWindow 函数来创建一个 OpenCV 窗口。在创建之后,OpenCV 会自动管理这个窗口。为此,需要给窗口指定名称,以及对于窗口所包含的图像的大小变化,它应该如何变化。可以通过如下方式:
- WINDOW_AUTOSIZE:如果不适用 Qt 后端,则仅支持 WINDOW_AUTOSIZE 。在这种情况下,窗口的大小由显示图像的大小决定。不允许调整窗口大小。
- WINDOW_NORMAL:在 Qt 上使用这个参数将允许调整窗口大小。图像将根据当前窗口大小调整自身大小。通过使用 “|” 运算符,你还需要指定是否希望图像保持其纵横比 (WINDOW_KEEPRATIO) 或者不保持 (WINDO_FREERATIO) 。
cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE); // create a window for display
最后,要使用新图像更新 OpenCV 窗口的内容,使用 cv::imshow 函数。使用这个函数时要指定 OpenCV 窗口的名称和要要使用的图像。
cv::imshow("Display window", image); // show our image inside it
由于程序运行速度很快,直接显示图像则图像可能会一闪而过,为了能让图像一直保持显示,知道用户按下任意键,需要使用 cv::waitKey 函数,这个函数只有一个参数,表示它应该等待用户输入多长时间(以毫秒为单位)。0 意味着永远等待。
cv::waitKey(0); // Wait for a keystroke in the window
结果 (Result)
将显示如下图: