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

做梦当财神發表於2024-10-30

目錄
  • 1. 函式定義
  • 2. 示例程式碼
  • 3. 應用場景
  • 4. 注意事項



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 引數中指定。


相關文章