OpenCV笔记(三)加载、显示图像

来源:互联网 发布:steam mac dota2 编辑:程序博客网 时间:2024/05/16 23:54

目标

本篇教程中你将学会:

  • 加载图像(使用cv::imread)
  • 创建一个命名的OpenCV窗口(使用cv::namedWindow)
  • 在OpenCV窗口里显示图像(使用cv::imshow)

源代码

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <iostream>#include <string>using namespace cv;using namespace std;int main( int argc, char** argv ){    String imageName( "../data/HappyFish.jpg" ); // 默认路径    if( argc > 1)    {        imageName = argv[1];    }    Mat image;    image = imread( imageName, IMREAD_COLOR ); // 读取图像    if( image.empty() )                 // 检查图像可用否    {        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;}

解释

在OpenCV中,我们有多个模块。每个模块处理图像不同方面或者使用不同方法。观察教程中的用户指南结构便可略知一二。在使用它们之前,首先需要包含声明了独立模块内容的头文件。

以下两个头文件你几乎都要用到:

  • core,定义了库的基本构建模块
  • highgui,包含了输入输出操作函数
#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <iostream>#include <string>

我们还include了iostream以增加控制台的输入输出。为了避免数据结构和函数名与其他库冲突,OpenCV有自己的命名空间:cv.为了避免在每个关键词前面使用cv::,可以在整个文件前面如下导入命名空间:

using namespace cv;

这也适用于STL库(用于控制台I/O)。现在让我们分析main函数。我们要确保从命令行获得有效的图像名参数。这样我们能获得一个默认图像“Happy Fish.ipg”。

String imageName( "../data/HappyFish.jpg" ); // 默认路径    if( argc > 1)    {        imageName = argv[1];    }

创建一个Mat对象用于存储加载的图像。

Mat image;

现在我们使用cv::imread函数加载图像,第一个参数(argv[1])指定加载图像名。第二个参数指定我们需要的图像格式。如下:

  • IMREAD_UNCHANGED(<0)加载原图像(如果有alpha通道也会包含进来)
  • IMREAD_GRAYSCALE(0)加载图像的亮度图
  • IMREAD_COLOR(>0)以RGB格式加载图像
image = imread( imageName, IMREAD_COLOR ); // 读取图像

OpenCV提供支持:
Windows位图图像格式(bmp)
便携式图像格式(pbm、pgm、ppm)
在插件的帮助下你也可以加载如JPEG格式(jpeg,jpg,jpe)(如果你要构建自己的库你需要指定使用他们,否则使用默认的包)
JPEG2000(jp2-在CMake中称为jasper)
TIFF文件(tiff,tif)
便携式网络图形格式(png)
此外还支持OpenEXR.

当图像数据加载正确后,我们要把图像显示出来,所以我们使用cv::namedWindow函数创建OpenCV窗口。一旦你创建好他们,OpenCV将自动管理他们。你只需要指定它的名字以及以及如何处理图像尺寸的视觉变化。有以下可能:

  • WINDOW_AUTOSIZE 这是唯一一个支持你不用Qt后端的。这种情况下,窗口将显示图像本身大小,并且不允许调整大小。
  • WINDOW_NORMAL 支持Qt你可以使用这个来允许窗口调整大小。图像会根据当前窗口大小改变自己的大小。使用|操作符,你可以指定图像是否保持宽高比
    (WINDOW_KEEPRATIO)或者(WINDOW_FREERATIO).
namedWindow( "Display window", WINDOW_AUTOSIZE ); // 创建一个窗口供图像显示.

最后,使用cv::imshow函数将新的图像更新在OpenCV窗口中。指定要更新的OpenCV窗口的名字以及要更新的图像,如下操作

imshow( "Display window", image );                // 在窗口中显示图像

因为我们希望我们的窗口在用户按下一个键之前一直显示(否则程序会很快的结束,你很难看到图像),我们使用cv::waitKey函数,它只有一个参数,代表我们等待用户输入的时长(以毫秒为单位)。零意味着永远等待。

waitKey(0); //  在窗口中等待一个按键

结果

  • 编译你的代码,然后运行可执行文件,其提供了一个图像的路径作为参数。Windows下的可执行文件的可扩展名是exe.当然要保证你的图像
    和你的程序在同一个目录下。
./DisplayImage HappyFish.jpg
  • 一切没有问题的时候,你将看到一个含有图像的窗口。
    END
原创粉丝点击