欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

加载显示一张图片

程序员文章站 2022-05-30 09:12:54
...

目标

在本教程里你将会学到:
1.加载一张图片(使用imread
2.创建一个名字叫OpenCV的窗口(使用namedWindow
3.在OpenCV窗口显示一张图片(使用 imshow)

源码

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;//--opencv命名空间
using namespace std; //--c++命名空间

int main( int argc, char** argv )
{ 
    if( argc != 2) 
    {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }
    
    Mat image;
    image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // 读取文件

    if(! image.data )                              // 检查是否是无效的输入
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }

    namedWindow( "Display window", CV_WINDOW_AUTOSIZE );//创建一个窗口用于显示
    imshow( "Display window", image );                   // 在窗口里面显示图片.

    waitKey(0);                                          // 等待键盘按键按下
    return 0;
}

说明

在OpenCV2中,我们有多个模块。每一个模块都是一种图像处理方法。您可以在这些教程本身的用户指南的结构中观察到这一点。在使用其中任何一个模块之前,首先需要包含声明每个模块内容的头文件。
你们几乎总是使用:
1.core部分,这里定义了库的基本构建块
2.highgui模块,因为它包含输入和输出操作的功能

// Video Image PSNR and SSIM
#include <iostream> // for standard I/O
#include <string>   // for strings

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

using namespace cv;
using namespace std; 

这对于stl库也是如此(用于控制台I/O)。现在,让我们分析一下主要的功能。我们开始确保我们从命令行获得一个有效的图像名称参数。

    if( argc != 2) 
    {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }

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

    Mat image;

现在我们调用加载由第一个参数(argv[1])指定的图像名称的imread函数。第二个参数指定了我们想要图像的格式。这可能是:
1.CV_LOAD_IMAGE_UNCHANGED (<0) 按原样加载图像(如果存在,则包括alpha通道)
2.CV_LOAD_IMAGE_GRAYSCALE ( 0) 将图像加载为强度图像
3.CV_LOAD_IMAGE_COLOR (>0) 以rgb格式加载图像

Image=imread(argv[1],cv_load_image_color);/读取文件

注意:OpenCV支持图像格式Windows位图(BMP)、便携式图像格式(PBM、PGM、ppm)和太阳光栅(Sr,ras)。在插件的帮助下(如果您构建了自己的库,您需要指定使用它们,但是在默认情况下,我们提供的包中),您也可以加载像jpeg(jpeg,j pg,jpe),jpeg2000(jp2-在cmake中以jasper命名),tiff文件(tiff,tif)和便携式网络图形(Png)这样的图像格式。此外,OpenExr也是一种可能性。

在检查图像数据是否正确加载后,我们希望显示我们的图像,因此我们使用namedWindow函数创建一个opencv窗口。一旦您创建了窗口,opencv会自动管理。为此,您需要指定它的名称,以及它的大小和角度。可能是:
1.如果不使用qt后端,则只支持CV_WINDOW_AUTOSIZE 。在这种情况下,窗口大小将占用它显示的图像的大小。不允许调整大小!
2.在qt上CV_WINDOW_NORMAL ,您可以使用它来允许窗口调整大小。图像将根据当前窗口大小调整自己的大小。通过使用|运算符,您还需要指定是否希望图像保持其纵横比(cv_window_keepratio)或不(cv_window_freeratio)。

namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// 创建一个用于显示的窗口.

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

imshow( "Display window", image );                   // 在窗口里面显示图片

因为我们希望我们的窗口被显示,直到用户按下一个键(否则程序会结束得太快),所以我们使用Waitkey函数,它的唯一参数是它应该等待多长时间的用户输入(以毫秒计)。零意味着永远等待。

waitKey(0);                                          //等待键盘按键

结果

编译代码,然后运行可执行文件,给出一个图像路径作为参数。如果您在windows上,可执行遗嘱当然也包含一个exe扩展。当然,确保图像文件靠近您的程序文件。

./DisplayImage HappyFish.jpg

你应该得到一个很好的窗口,如下所示:
加载显示一张图片