【蜂口 | AI人工智能】使用OpenCV加载和显示图像

目标

在本教程中,您将学习如何:

l 加载图像(使用cv :: imread)

l 创建一个命名的OpenCV窗口(使用cv :: namedWindow)

l 在OpenCV窗口中显示图像(使用cv :: imshow)

源代码
下载源代码(https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp)。

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include
#include
using namespace cv;
using namespace std;
int main( int argc, char
* argv )
{
String imageName( “…/data/HappyFish.jpg” ); // by default
if( argc > 1)
{
imageName = argv[1];
}
Mat image;
image = imread( 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;
}
*

源代码

下载源代码(https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp)

说明

在OpenCV 2中,我们有多个模块。每个人都处理不同的区域或方法来处理图像。您可以在这些教程本身的用户指南的结构中观察到这一点。在使用其中任何一个之前,首先需要包含声明每个模块内容的头文件。

你几乎总是会使用:

l 核心部分,这里定义了库的基本构建块

l highgui模块,因为它包含输入和输出操作的功能

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include
#include

我们还包括iostream以方便控制台线路输出和输入。为避免数据结构和函数名与其他库冲突,OpenCV有自己的命名空间:cv。为了避免需要在每个cv :: keyword 之前附加,你可以使用以下行来导入整个文件中的命名空间:

using namespace cv;

对于STL库也是如此(用于控制台I / O)。现在,让我们分析一下主要功能。我们开始确保从命令行获取有效的图像名称参数。否则默认拍照:“HappyFish.jpg”。

String imageName( "../data/HappyFish.jpg" ); // by default

if( argc > 1)

{

    imageName = argv[1];

}

然后创建一个Mat对象,该对象将存储已加载图像的数据。

   Mat图像;

现在我们调用cv :: imread函数来加载第一个参数(argv [1])指定的图像名称。第二个参数指定了我们想要图像的格式。这可能是:

l IMREAD_UNCHANGED(<0)按原样加载图像(包括alpha通道,如果存在)

l IMREAD_GRAYSCALE(0)将图像加载为强度图像

l IMREAD_COLOR(> 0)以RGB格式加载图像

image = imread( imageName, IMREAD_COLOR ); // Read the file

注意

OpenCV支持图像格式Windows位图(bmp),可移植图像格式(pbm,pgm,ppm)和Sun栅格(sr,ras)。在插件的帮助下(如果您自己构建库,则需要指定使用它们,但是在我们默认提供的包中)您还可以加载图像格式,如JPEG(jpeg,jpg,jpe),JPEG 2000(jp2 - 代号为CMake的Jasper),TIFF文件(tiff,tif)和便携式网络图形(png)。此外,OpenEXR也是一种可能性。

在检查图像数据是否正确加载后,我们想要显示我们的图像,因此我们使用cv :: namedWindow函数创建一个OpenCV窗口。一旦您创建OpenCV,这些将由OpenCV自动管理。为此,您需要指定其名称以及它应如何从大小的角度处理其包含的图像的更改。它可能是:

l 如果您不使用Qt后端,WINDOW_AUTOSIZE是唯一受支持的。在这种情况下,窗口大小将占用它显示的图像的大小。不允许调整大小!

l Qt上的WINDOW_NORMAL你可以使用它来允许窗口调整大小。图像将根据当前窗口大小调整自身大小。通过使用| 运算符您还需要指定是否希望图像保持其纵横比(WINDOW_KEEPRATIO)或不保持(WINDOW_FREERATIO)。

namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.

最后,要使用新的图像更新OpenCV窗口的内容,请使用cv :: imshow函数。指定要更新的OpenCV窗口名称以及在此操作期间要使用的图像:

 imshow( "Display window", image );                // Show our image inside it.

因为我们希望在用户按下一个键之前显示我们的窗口(否则程序会以太快的速度结束),我们使用cv :: waitKey函数,它的唯一参数就是它等待用户输入的时间(在毫秒)。零意味着永远等待。

 waitKey(0); // Wait for a keystroke in the window

结果

l 编译代码然后运行可执行文件,将图像路径作为参数。如果您在Windows上,可执行文件当然也包含exe扩展。当然可以确保图像文件在程序文件附近。

./DisplayImage HappyFish.jpg

l 您应该得到一个漂亮的窗口,如下所示:

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43019117/article/details/85090279