2011-11-24 366 views
5

我剛開始使用OpenCV檢測圖像中的特定曲線。首先,我想驗證是否有曲線,接下來,我想根據垂直或水平凸曲線或凹曲線來確定曲線的類型。 OpenCV中有沒有可用的函數?如果沒有,你可以給我一些想法,我怎麼可能寫這樣的功能?謝謝!順便說一下,我正在使用C++。在OpenCV中檢測曲線

+0

你在處理什麼樣的圖像?他們有什麼背景?如果可能的話,附上一些圖片的照片。 – maximus

回答

6

模板匹配不是解決此問題的可靠方法(它類似於從小針孔看物體),邊緣檢測器不一定會返回圖像中的真實邊緣;由於陰影造成的假邊緣也被返回。此外,您必須處理邊緣不完整和其他問題,這些問題會隨着圖像中場景的複雜程度而擴大。

你提出的問題一般來說是一個非常具有挑戰性的問題,除了玩具的例子,沒有好的解決方案。

粗略的嘗試可能是首先嚐試使用邊緣檢測器(例如建議的Canny邊緣檢測器)來檢測似乎合理的10邊緣。接下來,使用RANSAC嘗試將檢測到的邊緣中的點的子集合到曲線模型中。

例如,假設您正在嘗試檢測以下形式的曲線f(x)= ax^2 + bx + c。 RANSAC基本上會嘗試從檢測到的邊緣中的點中找到最適合該曲線模型的子集。要檢測不同的曲線,請相應地更改f(x)併爲其中的每個運行RANSAC。然後,您可以嘗試確定f(x)所表示的曲線是否真的存在於圖像中,並使用從RANSAC分配給它的點開始的一些啓發式(例如,如果模型中的點太少,曲線不在那裏,但是如何確定點數的好閾值?)。當你需要考慮旋轉等允許的轉換時,你的模型會變得更加複雜。

這種方法的問題在於你基本上試圖將你認爲應該在圖像中應該在點上,甚至有時你所尋找的東西不存在,它會讓你回到「最佳」狀態。對於例如你有一大堆從同心圓檢測到的點。如果您嘗試從這些點檢測直線,RANSAC會爲您返回最合適的線條!事實上,根據它在隨機初始化階段選擇的點,它可以爲您提供來自不同運行的許多不同行。

有關如何在這類問題上使用RANSAC的更多詳細信息,請參閱RANSAC for Dummies作者:Marco Zuliani。他還有一個很好的MATLAB toolbox陪伴這個技術報告,你可以移植到你選擇的語言。除非你知道你的背景是什麼樣的,或者你是在控制它,例如,通過強制乾淨的背景,這是一個非常難以解決的問題。