核心流程
- 輪廓提取:
cv::findContours 獲取目標輪廓點集。
- 複數序列構建:將輪廓點
(x, y) 映射為複數 z = x + iy。
- 離散傅里葉變換 (DFT):
cv::dft 計算頻域係數 F(k)。
- 特徵向量構建:取低頻前
M 個係數的模值 |F(k)|(去除直流分量 F(0)),並歸一化(除以 |F(1)|)實現尺度、旋轉、平移不變性。
- 相似度度量:兩圖像特徵向量
V1, V2 計算**歐氏距離** D = sqrt(sum((V1[i]-V2[i])^2)),距離越小越相似。
OpenCV 關鍵接口
cv::dft(src, dst, cv::DFT_COMPLEX_OUTPUT | cv::DFT_SCALE);
cv::magnitude(planes[0], planes[1], mag); // 計算模值
cv::normalize(mag, mag, 1.0, 0.0, cv::NORM_L2); // 歸一化
工程建議
- 輪廓點數統一重採樣至固定長度(如 256),保證 DFT 輸入維度一致。
- 特徵向量維度
M 取 10~20 平衡精度與速度。
- 大規模檢索引入 KD-Tree / Annoy / Faiss 索引加速最近鄰搜索。