2016-07-22 43 views
0

我試圖在this文章後的C++中實現SIFTRoot。OpenCV:描述符矩陣的L1歸一化

特別是:

# apply the Hellinger kernel by first L1-normalizing and taking the 
    # square-root 
    descs /= (descs.sum(axis=1, keepdims=True) + eps) 
    descs = np.sqrt(descs) 

我的問題是:

  1. 是否有任何內置的C++函數OpenCV中做到這一點?
  2. 所有的描述符都是正值嗎?否則,L1範數應該使用每個元素的絕對值。
  3. 第一行意味着「對於每個行向量,計算其所有元素的總和,然後添加eps(以避免被0除)並最終將每個向量元素除以該和值」。

回答

1

SIFT描述符基本上是一個直方圖,所以它不應該有負值。我不認爲在OpenCV中存在一個可以實現你想要的功能。但它不是太難拿出,沒有工作

// For each row 
for (int i = 0; i < descs.rows; ++i) { 
    // Perform L1 normalization 
    cv::normalize(descs.row(i), descs.row(i), 1.0, 0.0, cv::NORM_L1); 
} 
// Perform sqrt on the whole descriptor matrix 
cv::sqrt(descs, descs); 

我不知道的OpenCV與L1正常化零和究竟是如何交易的幾行。如果上面的代碼生成NaN,則可以用descs.rows(i) /= (cv::norm(descs.rows(i), cv::NORM_L1) + eps)代替cv::normalize

+0

謝謝,我只是想了解'cv :: normalize'是如何工作的,但我被文檔中的'alpha'弄糊塗了。謝謝! – justHelloWorld