2012-08-24 50 views
4

我需要以儘可能高的準確度檢測灰度圖像上的角點。目前我正在使用OpenCV函數:cvFindCornerSubPix()。Opencv FindCornerSubPix precision

予製備的簡單的測試:得到了一個圖像與黑/白邊的一個角:

sample image with detected corner

,然後一系列相同的對象的,移動的每個1/16pixel。我沒有手動檢查像素值,測試圖像很好。

檢測結果令人失望: 即使在TermCrit中將條件設置爲100次迭代或0.005閾值,檢測誤差也會高達0.08像素。

該圖顯示了誤差作爲像素內位置的函數。看起來不隨意。值得注意的另一件事:對於角落的其他角位(當邊緣不是水平/垂直時)結果更好,但仍不完美。

任何想法,如何使這個功能正常工作,爲什麼不這樣做,或者改爲使用什麼?

我將不勝感激任何建議除了像素的10%以下

Error graph

+0

當你移動1/16像素時,你確定它不是縮小的效果嗎? –

+0

@Martin是的,我是。後續圖像邊緣的像素值如下所示:(0,255),(16,239),(32,223)等 – Pietro

+0

您對翻譯圖像使用什麼插值方法?嘗試使用雙線性和雙三次。你可能會這樣引入一些偏見。也可以嘗試使用不是兩個反向冪的轉換值。您可以在翻譯圖像上手動驗證(通過灰度值的線性插值)邊緣處於理論上正確的位置。此外,嘗試使用理論(真實)角落位置初始化後運行迭代,並查看它是否保持穩定。 –

回答

0

真的是不壞的表現在所有。作爲參考,適用於從衛星圖像產生3D模型的相關峯值檢測器將具有相同的誤差數量級。

正如在註釋中指出的那樣,確切的錯誤模式將取決於您用於生成子像素模式的插值方法。爲了避免非單調性由高階內插方法引入(超出順序2),我建議以下協議:

  • 生成在一個高分辨率,大16倍的輸入圖像;
  • 在此HR圖像中一次移動1個像素的目標;
  • 通過縮減採樣生成測試圖像(小心:如果爲了避免aliasing而採用殘留縮減採樣,請首先應用合適的模糊功能,如PSF)以達到正確的尺寸。

最後,往往不希望有一個更小的誤差幅度。子像素角檢測器設計用於檢測到許多點(通常在20和100之間)的圖像。然後將這些點用於健壯的估計過程,該過程應消除異常值並對有效點集上的誤差進行平均。

+0

生成圖像的過程正是我使用的 ,錯誤不在圖案生成 - 它在檢測中 實際上,有噪點的圖像0.1像素也許不會是壞的... 但是在完美無噪聲的圖像中,我認爲它應該僅受顏色深度限制(8bit灰度中的1/256) 真實應用應該是亞像素測量(在非常精確校準的相機上的小位移) - 所以如果我在無噪聲圖像上獲得0.1的準確度,它可能甚至是我但是,我沒有檢查opencv 2.2和更高版本,因爲線程相當老舊 – Pietro