目錄
- 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 的深度
);
引數詳解:
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
引數中指定。