文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

目标

在这篇教程中您将会学习如何:

  • 加载一张图片(利用 imread函数)
  • 创造一个OpenCV命名窗口(利用namedWindow函数)
  • 在OpenCV命名窗口中显示一张图片(利用imshow函数)

源代码

下载源代码

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

using namespace cv;
using namespace std;

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", WINDOW_AUTOSIZE );// 创建一个用于显示的窗口.
    imshow( "Display window", image );                   // 在窗口中显示图片.

    waitKey(0);                                          // 等待窗口中键盘输入
    return 0;
}

 

第 1 段(可获 2 积分)

解释

OpenCV2有多个模块。每一个模块对应图像处理中的不同领域或者方法。您可能已经在用户指南的部分中已经看过这篇教程。在您使用任意一个模块前您首先需要引入头文件,其中包含了所有被声明的独立模块。

您很有可能总是会用:

  • core库,核心类库,定义了OpenCV基本功能的编译块
  • highgui模块,它包含了输入输出操作的函数
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

 

第 2 段(可获 2 积分)

我们也使用了iostream头文件用于控制台的输入和输出。为了防止数据结构体和函数命名与其他库冲突。OpenCV有它自己的命名空间: cv。为了避免添加之前的 cv关键字,你在整个文件中可以输入以下的命名空间。

using namespace cv;
using namespace std;

这也对STL库有效(用于I/O控制)。现在来分析一个main函数。一开始我们要保证从命令行获得一个有效的图像名称参数。

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

 

第 3 段(可获 2 积分)

然后创建一个Mat数据结构用于存储加载的图片数据。

 Mat image;

现在我们利用imread函数,它能够加载由第一个参数指定名称的图片(argv[1])。第二个参数指定了我们想要的图像格式。它是:

  • CV_LOAD_IMAGE_UNCHANGED (<0)加载图像(如果包含有alpha通道)
  • CV_LOAD_IMAGE_GRAYSCALE ( 0)以强度形式加载
  • CV_LOAD_IMAGE_COLOR (>0)以RGB形式加载图像
image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // 读取文件

如果没有指定第二个参数,它隐含是CV_LOAD_IMAGE_COLOR

第 4 段(可获 2 积分)

OpenCV提供多种图像格式支持,如:Windows位图(bmp),便携式图像格式 (pbm, pgm, ppm)和SUN公司的光栅格式(sr, ras)。利用各类插件(如果您编译自己库,您需要指定使用它们。但是我们在默认情况下封装好了它)你也可以加载类似JPEG (jpeg, jpg, jpe),JPEG 2000(jp2在CMake称为Jasper),TIFF 文件(tiff, tif)和便携式网络图形(png)等格式的图像。此外,OpenEXR也可用。

在检查了图像数据加载正确后,我们想要显示我们的图像,所以我们利用 namedWindow函数创建一个OpenCV窗口。一旦您创建了它们,它们就会被OpenCV自动管理。对此,你需要指定它的名称以及它应该如何处理它所包含的图像在大小上的变化。它应该是:

第 5 段(可获 2 积分)
  • WINDOW_AUTOSIZE 如果您不使用Qt后台,它将是唯一支持的量。在这种情况下窗口尺寸将和图像原本尺寸相同。不允许重新调整!
  • WINDOW_NORMAL 在Qt平台上你可以使用它来重新调整窗口。图像将根据现在窗口的尺寸重新调整。您还可以利用“|”操作来指定是否想要保持长宽比,是(WINDOW_KEEPRATIO) ,否 (WINDOW_FREERATIO)。
 namedWindow( "Display window", WINDOW_AUTOSIZE );// 创建一个用于显示的窗口

如果第二个参数没有被指定,它将默认为WINDOW_AUTOSIZE,这将意味着你不能改变图像的尺寸。

第 6 段(可获 2 积分)

最后,使用 imshow 函数来更新OpenCV窗口。指定OpenCV窗口名和在此操作期间使用的图像用以更新。

imshow( "Display window", image );                   // 在其中显示我们的图像.

因为我们将要实现当用户输入某一个键后停止显示(否则改程序将很快的运行结束),所以我们使用waitKey函数来实现,它的唯一变量是应该等待多长时间用户输入(以毫秒为单位)。0意味着永远等待。

waitKey(0);                                          // 等待按键的窗口
第 7 段(可获 2 积分)

结论

  • 编译你的代码然后运行以可执行的给定的图像路径作为参数。当然如果你是Windows系统,这个可执行文件将包含一个exe扩展。当然,保证图像文件是在您的程序文件里
    ./DisplayImage HappyFish.jpg
  • 你应该得到一个窗口如下所示:

    Display Image Tutorial - Final Result

第 8 段(可获 2 积分)

文章评论