OpenCV(cv::dnn::blobFromImage())



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 的深度
);

参数详解:

  1. image:输入图像(cv::Mat 类型),通常为 BGR 格式。如果是多张图像组成的 batch,则输入为包含多张图像的向量。
  2. scalefactor:缩放因子,所有像素值将乘以该因子。通常用于将像素值标准化为模型所需的范围。例如,如果像素值范围为 [0, 255],并希望将其缩放到 [0, 1],则 scalefactor 应设置为 1/255.0
  3. size:目标尺寸,即将图像调整到指定的宽高。多数深度学习模型要求输入图像具有特定的尺寸(如 224x224),因此该参数用于调整输入图像大小。
  4. mean:均值,用于去均值化。每个通道的像素值减去对应的均值。例如,某些模型使用 (mean_R, mean_G, mean_B) = (104, 117, 123) 来去均值化,使图像更加符合训练时的统计分布。
  5. swapRB:交换红蓝通道,默认值为 false。OpenCV 使用 BGR 格式读取图像,而大部分深度学习模型使用 RGB 格式,因此此参数设为 true 可以交换通道,使图像符合 RGB 顺序。
  6. crop:是否裁剪图像。设为 true 时,将按中心裁剪图像,确保宽高比不变,并符合 size 指定的尺寸。
  7. ddepth:输出 blob 的深度,默认值为 CV_32F(单精度浮点数)。可以根据模型需要选择不同的深度。

返回值:

cv::dnn::blobFromImage() 返回一个 cv::Mat 类型的四维张量,称为 “blob”。返回的张量具有以下形状:

  • 形状:(N, C, H, W)
    • N:样本数(batch size),通常为 1
    • C:通道数(color channels),通常为 3BGR)。
    • 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. 应用场景

  1. 图像标准化:通过去均值和缩放,将图像归一化为模型所需的分布。
  2. 通道交换:在使用 OpenCV 读取的 BGR 格式图像时,转换为 RGB 顺序以兼容大多数模型。
  3. 批量输入:支持多个图像的批量转换,将多个图像一次性转换为模型输入格式。


4. 注意事项

  • 尺寸匹配:确保 size 与模型的输入尺寸一致,否则可能导致推理错误。
  • 通道顺序:默认 swapRB=false,适用于 BGR 格式图像。如果模型需要 RGB 格式输入,请将 swapRB=true
  • 输出数据类型blob 默认使用浮点格式(CV_32F),如果模型需要其他类型的数据,需在 ddepth 参数中指定。


posted @ 2024-10-30 10:44  做梦当财神  阅读(206)  评论(0编辑  收藏  举报