这次我们打开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_GRAYSCALE | 0 | 强制转为灰度:单通道 8 位灰度图(即使原图是彩色)。 |
IMREAD_COLOR | 1 | 默认模式:转为 3 通道 BGR 彩色图(丢弃 Alpha 通道)。 |
IMREAD_ANYDEPTH | 2 | 保留原始位深:如果图像是 16/32 位(如医学影像 TIFF),不转为 8 位;否则自动转为 8 位。 |
IMREAD_ANYCOLOR | 4 | 尝试保留颜色格式:与 IMREAD_ANYDEPTH 结合使用,尽可能保留原始颜色空间(不强制转 BGR 或灰度)。 |
IMREAD_LOAD_GDAL | 8 | 使用 GDAL 驱动:通过 GDAL 库读取图像(支持更多地理空间图像格式,如 GeoTIFF)。 |
IMREAD_REDUCED_GRAYSCALE_2 | 16 | 转为灰度图,并将尺寸缩小为 1/2(宽高各减半)。 |
IMREAD_REDUCED_COLOR_2 | 17 | 转为 BGR 彩色图,尺寸缩小为 1/2。 |
IMREAD_REDUCED_GRAYSCALE_4 | 32 | 转为灰度图,尺寸缩小为 1/4。 |
IMREAD_REDUCED_COLOR_4 | 33 | 转为 BGR 彩色图,尺寸缩小为 1/4。 |
IMREAD_REDUCED_GRAYSCALE_8 | 64 | 转为灰度图,尺寸缩小为 1/8。 |
IMREAD_REDUCED_COLOR_8 | 65 | 转为 BGR 彩色图,尺寸缩小为 1/8。 |
IMREAD_IGNORE_ORIENTATION | 128 | 忽略 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命名空间中的输出结果。其图像显示和输出结果如下:

高:436
大小:436 x 604
本节源代码下载地址:通过网盘分享的文件:OpenCV课堂.zip
链接: https://pan.baidu.com/s/1ZLkEgTDC0Zv8gm-i6A58mw 提取码: b6ue
——重庆教主 2025年5月7日
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
微信 | 支付宝 |
---|---|
![]() |
![]() |