OpenCV图像文件读写(5)从文件系统中读取图像的标准函数imread()的使用

发布于:2024-10-12 ⋅ 阅读:(4) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

从文件加载图像。

imread 函数从指定的文件加载图像并返回它。如果图像无法读取(因为文件缺失、权限不当、格式不受支持或无效),函数返回一个空矩阵 (Mat::data == NULL)。

目前支持的文件格式如下:

  • Windows 位图 - *.bmp, *.dib (始终支持)
  • JPEG 文件 - *.jpeg, *.jpg, *.jpe (参见注意事项部分)
  • JPEG 2000 文件 - *.jp2 (参见注意事项部分)
  • 便携式网络图形 - *.png (参见注意事项部分)
  • WebP - *.webp (参见注意事项部分)
  • AVIF - *.avif (参见注意事项部分)
  • 便携式图像格式 - *.pbm, *.pgm, *.ppm, *.pxm, *.pnm (始终支持)
  • PFM 文件 - *.pfm (参见注意事项部分)
  • Sun 位图 - *.sr, *.ras (始终支持)
  • TIFF 文件 - *.tiff, *.tif (参见注意事项部分)
  • OpenEXR 图像文件 - *.exr (参见注意事项部分)
  • Radiance HDR - *.hdr, *.pic (始终支持)
  • 由 GDAL 支持的栅格和矢量地理空间数据 (参见注意事项部分)

注意事项
函数根据内容而不是文件扩展名确定图像类型。
在处理彩色图像的情况下,解码后的图像将以 B G R 顺序存储通道。
当使用 IMREAD_GRAYSCALE 时,如果可用,将使用编解码器内部的灰度转换。结果可能与 cvtColor() 的输出不同。
在 Microsoft Windows* 操作系统和 MacOSX* 上,默认使用随 OpenCV 图像一起发布的编解码器(libjpeg, libpng, libtiff 和 libjasper)。因此,OpenCV 始终可以读取 JPEG、PNG 和 TIFF 文件。在 MacOSX 上,还有一个选项可以使用原生 MacOSX 图像阅读器。但是请注意,目前这些原生图像加载器由于嵌入到 MacOSX 中的颜色管理而导致像素值不同。
在 Linux*、BSD 风味及其他类 Unix 开源操作系统上,OpenCV 查找随操作系统图像提供的编解码器。安装相关的包(别忘了开发文件,例如 Debian* 和 Ubuntu* 中的 “libjpeg-dev”)以获取编解码器支持或将 CMake 中的 OPENCV_BUILD_3RDPARTY_LIBS 标志设为开启。
如果你在 CMake 中将 WITH_GDAL 标志设为 true 并使用 IMREAD_LOAD_GDAL 加载图像,则会使用 GDAL 驱动程序解码图像,支持的格式包括:栅格、矢量。
如果图像文件中嵌入了 EXIF 信息,那么 EXIF 方向信息将被考虑,并相应地旋转图像,除非传递了 IMREAD_IGNORE_ORIENTATIONIMREAD_UNCHANGED 标志。
使用 IMREAD_UNCHANGED 标志以保持 PFM 图像中的浮点值。
默认情况下,像素数量必须少于 (2^{30})。限制可以通过系统变量 OPENCV_IO_MAX_IMAGE_PIXELS 设置。

cv::imread 函数是 OpenCV 中用于从文件系统中读取图像的标准函数。这个函数可以读取各种格式的图像文件,并返回一个 cv::Mat 对象,其中包含了图像数据。

函数原型


Mat cv::imread	
(
	const String & 	filename,
	int 	flags = IMREAD_COLOR 
)		

参数

  • 参数 filename 要加载的文件的名称。
  • 参数flags 可以取 cv::ImreadModes 值的标志。

返回值

cv::Mat:读取的图像数据。如果读取失败,则返回一个空的 cv::Mat 对象。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    // 图像文件路径
    std::string filename = "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg";

    // 使用 cv::imread 读取图像
    cv::Mat img = cv::imread( filename, cv::IMREAD_COLOR );

    if ( img.empty() )
    {
        std::cout << "Failed to load image." << std::endl;
        return -1;
    }

    // 显示图像
    cv::namedWindow( "Loaded Image", cv::WINDOW_NORMAL );
    cv::imshow( "Loaded Image", img );
    cv::waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述