目录
cv::dnn::blobFromImage()
是 OpenCV 的 DNN 模块中的一个函数,用于将输入图像转换为深度学习模型可接受的输入格式(称为“blob”)。它通常在使用预训练的深度学习模型进行推理时,用于图像预处理,将图像格式转换为模型所需的四维张量格式。
1. 函数定义
cv::Mat cv::dnn::blobFromImage(
InputArray image, // 输入图像
double scalefactor = 1.0, // 缩放因子
Size size = Size(), // 图像大小
Scalar mean = Scalar(), // 均值,用于去均值化
bool swapRB = false, // 交换红蓝通道
bool crop = false, // 是否裁剪
int ddepth = CV_32F // 输出 blob 的深度
);
参数详解:
image
:输入图像(cv::Mat
类型),通常为BGR
格式。如果是多张图像组成的 batch,则输入为包含多张图像的向量。scalefactor
:缩放因子,所有像素值将乘以该因子。通常用于将像素值标准化为模型所需的范围。例如,如果像素值范围为[0, 255]
,并希望将其缩放到[0, 1]
,则scalefactor
应设置为1/255.0
。size
:目标尺寸,即将图像调整到指定的宽高。多数深度学习模型要求输入图像具有特定的尺寸(如224x224
),因此该参数用于调整输入图像大小。mean
:均值,用于去均值化。每个通道的像素值减去对应的均值。例如,某些模型使用(mean_R, mean_G, mean_B) = (104, 117, 123)
来去均值化,使图像更加符合训练时的统计分布。swapRB
:交换红蓝通道,默认值为false
。OpenCV 使用BGR
格式读取图像,而大部分深度学习模型使用RGB
格式,因此此参数设为true
可以交换通道,使图像符合RGB
顺序。crop
:是否裁剪图像。设为true
时,将按中心裁剪图像,确保宽高比不变,并符合size
指定的尺寸。ddepth
:输出blob
的深度,默认值为CV_32F
(单精度浮点数)。可以根据模型需要选择不同的深度。
返回值:
cv::dnn::blobFromImage()
返回一个 cv::Mat
类型的四维张量,称为 “blob”。返回的张量具有以下形状:
- 形状:
(N, C, H, W)
N
:样本数(batch size),通常为1
。C
:通道数(color channels),通常为3
(BGR
)。H
:高度。W
:宽度。
2. 示例代码
以下示例展示了如何使用 cv::dnn::blobFromImage()
将图像转换为 blob,并将其传递给一个深度学习模型。
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
using namespace cv;
using namespace cv::dnn;
int main() {
// 读取图像
Mat image = imread("image.jpg");
// 转换为 blob
Mat blob = blobFromImage(image, 1.0/255.0, Size(224, 224), Scalar(0, 0, 0), true, false);
// 加载 DNN 模型
Net net = readNetFromONNX("model.onnx");
// 将 blob 设置为网络的输入
net.setInput(blob);
// 推理
Mat output = net.forward();
// 处理推理结果
// ...
return 0;
}
3. 应用场景
- 图像标准化:通过去均值和缩放,将图像归一化为模型所需的分布。
- 通道交换:在使用 OpenCV 读取的 BGR 格式图像时,转换为 RGB 顺序以兼容大多数模型。
- 批量输入:支持多个图像的批量转换,将多个图像一次性转换为模型输入格式。
4. 注意事项
- 尺寸匹配:确保
size
与模型的输入尺寸一致,否则可能导致推理错误。 - 通道顺序:默认
swapRB=false
,适用于 BGR 格式图像。如果模型需要 RGB 格式输入,请将swapRB=true
。 - 输出数据类型:
blob
默认使用浮点格式(CV_32F
),如果模型需要其他类型的数据,需在ddepth
参数中指定。
标签:模型,dnn,OpenCV,blob,图像,格式,cv,输入 From: https://www.cnblogs.com/keye/p/18515346