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

OpenCV图像的加载、显示

程序员文章站 2022-03-26 13:32:48
...

OpenCV图像的加载、显示

Mat类是OpenCV里使用广泛的一个类,使用它可以轻松的用几行代码实现图像的加载、显示。

先上代码:

// OpenCV_self.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
​
#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
​
int main()
{
    cv::Mat img;
    img = cv::imread("F:/openCV/images/juice.jpg");     // 读取图像
​
    if (img.empty())    // 判断是否读取成功
    {
        std::cout << "导入图像失败!";
        std::cin.get();     // 读取错误时,为了能在控制台dos窗口看到输出的信息,而不是一闪而过
        return -1;
    }
    else
    {
        std::cout << "导入图像成功!";
    }
​
    cv::imshow("result", img);    // 显示图像
    cv::waitKey(0);    // 一直显示图像直到摁下任意键
}

执行结果如下图所示:

OpenCV图像的加载、显示

 

imread函数

      imread函数的主要作用从一个文件加载图像。

       imread函数从一个指定文件读取图像,并返回一个Mat对象,如果图像不能被读取(可能文件路径不对,没有读取权限、不支持的图像格式、错误的图像格式等原因),函数返回一个空的矩阵( Mat::data==NULL )。我们可以用Mat类的empty()函数去判断是否读取到图像。

CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
  • 参数1 filename, 读取的图片文件名。

  • 参数2 flags, 一个读取标记,值从cv::ImreadModes获取,用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关

  • 返回值,Mat 对象, 返回读取的图像,

 

目前OpenCV4.4中支持的图像格式如下:

  • Windows bitmaps - *.bmp, *.dib (一直支持)

  • JPEG files - *.jpeg, *.jpg, *.jpe (详情见下面Note 部分)

  • JPEG 2000 files - *.jp2 (详情见下面Note 部分)

  • Portable Network Graphics - *.png (详情见下面Note 部分)

  • WebP - *.webp (详情见下面Note 部分)

  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (一直支持)

  • PFM files - *.pfm (详情见下面Note 部分)

  • Sun rasters - *.sr, *.ras (一直支持)

  • TIFF files - *.tiff, *.tif (详情见下面Note 部分)

  • OpenEXR Image files - *.exr (详情见下面Note 部分)

  • Radiance HDR - *.hdr, *.pic (一直支持)

  • Raster and Vector geospatial data supported by GDAL (详情见下面Note 部分)

@注意

  • 函数是通过文件内容得到图像的格式,而不是文件的扩展名决定的,也就是说你把JPEG文件改成.png扩展名,读出来的还是JPEG文件类型。所以说修改文件后缀名来改变文件类型是错误的。

  • 彩色图像数据,通道数据是以 B G R顺序存放的。.

  • 使用IMREAD_GRAYSCALE时,其使用的是内建的灰度转换方式,如果可用的话,其输出结果可能与cvtColor()输出的结果不同。

  • 在Microsoft Windows操作系统和苹果的 MacOS操作系统中, OpenCV 图像编解码默认使用(libjpeg,libpng, libtiff, and libjasper),所以在MacOSX中还有一个选择使用本地的MacOSX 图像阅读器,但是注意的是由于MacOSX内置的颜色管理,当前本地的图像加载器给出的是不同的像素值。

     

  • 对于 Linux*, BSD flavors和其他类似于Unix的开源操作系统,OpenCV寻找系统提供的编码器,安装相关的包(开发包,例如, 在Debian*和 Ubuntu 中的"libjpeg-dev")来获得编码支持,或者在CMake中选中OPENCV_BUILD_3RDPARTY_LIBS标志,自己去编译这些开发包。

  • 当你设置WITH_GDAL标志为true,并且使用 IMREAD_LOAD_GDAL去加载图像,GDAL驱动将会被使用去解码图像,支持以下格式:

    Raster, Vector.

  • 如果图像文件包含EXIF信息, EXIF的 orientation (照片的方向)参数将会被考虑在内。图像可以根据这个参数对应的旋转。除非标志 IMREAD_IGNORE_ORIENTATION和 IMREAD_UNCHANGED被传递(大概是不让旋转)。

  • 使用IMREAD_UNCHANGED标志来保持PFM图像的浮点值.

  • 像素数缺省值必须小于OpenCV图像的加载、显示,限制可以通过系统变量OPENCV_IO_MAX_IMAGE_PIXELS来设置。

imshow函数

      imshow函数功能就是在指定的窗口显示一个图像。

 函数原型:

CV_EXPORTS_W void imshow(const String& winname, InputArray mat);
  • 参数1 winname 窗口名字.

  • 参数2 mat 显示图像的Mat对象.

       如果窗口创建时使用了cv::WINDOW_AUTOSIZE 标志,图像以他的原始大小显示, 但是他仍受屏幕分辨率的限制。 否则, 图像将会被按比例缩放去适应窗口。函数可以缩放图像,依赖图像的深度:

  • 如果图像是8位无符号整型,显示的也是8位无符号整型。

  • 如果图像是 16位无符号整型 或32位整型,像素数被256整除. 也就是说取值区间从 [0,255*256] 映射到 [0,255].

  • 如果图像是32位或64位浮点数, 像素值会被乘以255. 也就是说值区间从 [0,1] 映射到 [0,255].

       如果窗口创建时支持OpenGL , cv::imshow 也支持 ogl::Buffer , ogl::Texture2D 和cuda::GpuMat 作为输入。

       如果窗口没有在使用本函数前创建,假定使用标志cv::WINDOW_AUTOSIZE创建窗口.

       如果你需要显示一个图像大于屏幕的分辨率,你需要在imshow之前调用 namedWindow("", WINDOW_NORMAL) .

@注意

       本函数后面应该跟着cv::waitKey 函数来显示指定毫秒数显示时间的图像,否则将不会显示图像,例如, waitKey(0) 将会一直显示显示图像直到摁下键盘任意键,(这个适合显示图像). waitKey(25) 将会显示一帧图像25 毫秒, 然后显示就会自动关闭. (如果你把他放到一个循环里去读视频,他将会一帧一帧的显示视频)。

@注意

[仅限Windows] 摁 Ctrl+C 组合键复制图像到剪切板.

[仅限Windows] 摁Ctrl+S 组合键将会显示一个对话框去保存图像。