Opencv中文网

打开图像imread()函数(源代码)

这次我们打开Visual Studio,创建一个C++的控制台项目,并配置好OpenCV的库引入,具体操作过程参考C++配置OpenCV教程。

在创建好的C++控制台项目的源文件夹中添加一个main.cpp文件,并在其中键入下面的代码

#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    Mat girl = imread("images/girl.jpg");//加载图像
    if (!girl.empty()) {
        imshow("window", girl);//显示图像
        cout << "宽:" << girl.cols << endl;
        cout << "高:" << girl.rows << endl;
        cout << "大小:" << girl.size << endl;
        waitKey(0);//等待按键
    }
    return 0;
}

在上面的代码中,imread()函数是用于读取图像文件的核心函数,支持多种文件格式,如JPGE,PNG,TIFF,BMP等。另外,它还提供了多种读取模式。它的函数原型如下

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

其中,filename表示图像文件的相对或绝对路径。本示例中就是采用的相对路径。flags表示读取模式,其实它是一个ImreadModes枚举,其读取模式如下表所示。

枚举常量说明
IMREAD_UNCHANGED-1保留原始数据:加载图像的所有通道(包括 Alpha 透明度通道),不进行任何转换。例如:PNG 的 4 通道(RGBA)会完整保留。
IMREAD_GRAYSCALE0强制转为灰度:单通道 8 位灰度图(即使原图是彩色)。
IMREAD_COLOR1默认模式:转为 3 通道 BGR 彩色图(丢弃 Alpha 通道)。
IMREAD_ANYDEPTH2保留原始位深:如果图像是 16/32 位(如医学影像 TIFF),不转为 8 位;否则自动转为 8 位。
IMREAD_ANYCOLOR4尝试保留颜色格式:与 IMREAD_ANYDEPTH 结合使用,尽可能保留原始颜色空间(不强制转 BGR 或灰度)。
IMREAD_LOAD_GDAL8使用 GDAL 驱动:通过 GDAL 库读取图像(支持更多地理空间图像格式,如 GeoTIFF)。
IMREAD_REDUCED_GRAYSCALE_216转为灰度图,并将尺寸缩小为 1/2(宽高各减半)。
IMREAD_REDUCED_COLOR_217转为 BGR 彩色图,尺寸缩小为 1/2。
IMREAD_REDUCED_GRAYSCALE_432转为灰度图,尺寸缩小为 1/4。
IMREAD_REDUCED_COLOR_433转为 BGR 彩色图,尺寸缩小为 1/4。
IMREAD_REDUCED_GRAYSCALE_864转为灰度图,尺寸缩小为 1/8。
IMREAD_REDUCED_COLOR_865转为 BGR 彩色图,尺寸缩小为 1/8。
IMREAD_IGNORE_ORIENTATION128忽略 EXIF 方向标记:某些相机拍摄的图像会通过 EXIF 标记旋转方向,设置此标志后不自动旋转。

常用的读取模式是IMREAD_GRAYSCALE和IMREAD_COLOR。IMREAD_COLOR还是默认的读取模式,所以本例中就是以BGR彩色图的模式读取一张jpg图。那怕原图是单通道,也会转换成3通道。

关于ImreadModes的定义

enum ImreadModes {
       IMREAD_UNCHANGED            = -1, //完全保留原始数据:加载图像的所有通道(包括Alpha透明度通道),不进行任何转换。例如:PNG的4通道(RGBA)会完整保留,且忽略EXIF方向标记。
       IMREAD_GRAYSCALE            = 0,  //强制转为单通道灰度图:无论原图格式如何,均转换为8位灰度图像(1通道)。
       IMREAD_COLOR                = 1,  //默认模式:转换为3通道BGR彩色图像(丢弃Alpha通道)。
       IMREAD_ANYDEPTH             = 2,  //保留原始位深:如果图像是16位/32位(如医学影像TIFF),保持其位深;否则转为8位。
       IMREAD_ANYCOLOR             = 4,  //尝试保留原始颜色格式:不强制转换为BGR或灰度,尽可能保留原色彩空间(需与IMREAD_ANYDEPTH结合使用)。
       IMREAD_LOAD_GDAL            = 8,  //使用GDAL驱动加载:通过GDAL库读取图像(支持地理空间格式如GeoTIFF)。
       IMREAD_REDUCED_GRAYSCALE_2  = 16, //转为单通道灰度图,并将尺寸缩小为 1/2(宽高各减半)。
       IMREAD_REDUCED_COLOR_2      = 17, //转为3通道BGR彩色图,尺寸缩小为 1/2。
       IMREAD_REDUCED_GRAYSCALE_4  = 32, //转为单通道灰度图,尺寸缩小为 1/4。
       IMREAD_REDUCED_COLOR_4      = 33, //转为3通道BGR彩色图,尺寸缩小为 1/4。
       IMREAD_REDUCED_GRAYSCALE_8  = 64, //转为单通道灰度图,尺寸缩小为 1/8。
       IMREAD_REDUCED_COLOR_8      = 65, //转为3通道BGR彩色图,尺寸缩小为 1/8。
       IMREAD_IGNORE_ORIENTATION   = 128 //忽略EXIF方向标记:某些相机拍摄的图像会通过EXIF标记旋转方向,此标志禁止自动旋转。
     };

下面是一些组合使用示例

cv::Mat img = cv::imread("CT.tif", cv::IMREAD_ANYDEPTH | cv::IMREAD_GRAYSCALE);//加载高深度医学图像(保留原始位深)
cv::Mat thumbnail = cv::imread("large.jpg", cv::IMREAD_REDUCED_COLOR_4);//快速预览大图(缩小尺寸)
cv::Mat logo = cv::imread("logo.png", cv::IMREAD_UNCHANGED);//保留透明通道的PNG
cv::Mat img = cv::imread("unknown.tif", cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);//兼容格式的灵活读取

//这些标志通过按位或(|)组合,可灵活控制图像加载方式。例如:

// 加载高深度图像,忽略EXIF方向,并缩小为1/2
cv::Mat img = cv::imread("image.tif", 
    cv::IMREAD_ANYDEPTH | 
    cv::IMREAD_IGNORE_ORIENTATION | 
    cv::IMREAD_REDUCED_COLOR_2);

本例中还使用了imshow()函数,表示将Mat图像数据显示到独立的窗体中,其函数原型如下

void cv::imshow(
    const String& winname,      // 窗口名称(标识符)
    InputArray mat             // 要显示的图像(cv::Mat 类型)
);

imshow()函数支持单通道(灰度图)、3通道(BGR彩色图)和4通道(BGRA带透明度)图像的显示。请注意,该函数需配合waitKey()函数使用。waitKey()表示控制窗体的显示时长,例如waitKey(0)表示无限等待,直到用户按下任意键,waitKey(1000)表示窗体显示1秒后自动关闭。

关于参数winname,表示窗体的名称,同一名称的窗口重复调用imshow()会更新内容,不同名称则创建多个窗体。

在本例中,还调用了Mat类的empty()函数,该函数检查Mat对象是否为空。最后,cout表示std命名空间中的输出结果。其图像显示和输出结果如下:

宽:604
高:436
大小:436 x 604

本节源代码下载地址:通过网盘分享的文件:OpenCV课堂.zip
链接: https://pan.baidu.com/s/1ZLkEgTDC0Zv8gm-i6A58mw 提取码: b6ue

——重庆教主 2025年5月7日

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1