2. OpenCV 4.2.0 加载和显示图像(OpenCV 官方文档翻译)

官方文档链接: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)

将显示如下图:
在这里插入图片描述

发布了73 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wangyuankl123/article/details/104856338
今日推荐