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

目标

本篇教程中你将学会:

  • 加载图像(使用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值