2013-05-25 37 views
1

我是圖像處理新手。現在我有一個問題。我正在寫一個簡單的程序在C#上,它必須通過一些樣本定義圖像上的一些對象。在圖像上獲取對象的旋轉角度

例如這裏的樣品:它的對象,我覺得一個可加載圖像

sample http://i051.radikal.ru/1305/0f/17f925103f0e.png

後來我有比較。 對象和樣本的大小總是相等的。圖像被二值化。我們總是知道旋轉點(它是圖像的中心)。樣本總是標準化的,但我們永遠不會知道對象相對於法線的旋轉角度。

這裏有一些對象,我覺得可加載圖像:

sample1 http://s017.radikal.ru/i411/1305/46/544727c201c8.png sample2 http://s09.radikal.ru/i182/1305/6d/0f20fc2cc2b8.png

的問題是如何找到角度#1。 對不起,我的英語和謝謝。

回答

1

如果你正在使用aforge庫,你可以利用他的分機也命名Accord.Net。

Accord.Net與Aforge類似,您可以安裝它,在您的項目中添加參考文件並完成。

之後,你可以通過將目標圖像使用簡單的RawMoments,以後你可以用它們來計算CentralMoments

在這一點上,你可以用CentralMoments GetOrientation()的方法讓您的圖像的角度和你得到了角度。

我在手勢識別項目中使用它,並像魅力一樣工作。

更新: 我剛剛檢查過,GetOrientation只獲取角度而不是方向。 因此,倒置的圖像與原始圖像具有相同的角度。 一個修復,可以是像素計數,但是這次你只能得到2個(最壞情況)的樣本來檢查而不是360(最壞的情況下)樣本。

UPDATE2

如果你有很多的樣品,我建議你向他們旋轉圖像的大小進行篩選。 例如: 我得到的圖像,我看到它是在一個水平位置(90°)我旋轉它的90°,現在我有原始的寬度和高度,我可以利用跳過不相似的樣本,如:

If (Founded.Width != Sample.Width) //You can add a range too if in case during 
Continue;       //the rotation are added some pixels 
+0

非常感謝,但是我已經實現了一個基於像素計數的algorythm我自己:) – Mervin

0

回顧一下,你有一個樣本圖像和同一源圖像的旋轉圖像。對於像素,您還有兩個值0,1

一個簡單的僞代碼,可以得到適度的成功可以使用二進制搜索來實現:

  1. 開始與旋轉的值是180個輩分 - 順時針和逆時針
  2. 旋轉圖像爲兩個值。
  3. XOR旋轉的原始圖像。
  4. 計算像素數0並檢查它是否小於您定義的誤差範圍。
  5. 繼續搜索一半的旋轉角度。
+0

這不是壞主意,但我有很多對象的樣本,必須將每個對象與每個樣本進行比較。例如,如果我有1000或2000個樣本,它將不會工作得很快。 – Mervin

+0

的確如此。我可以根據機器學習和神經網絡的思路來思考一些問題,並將每個區域的像素數量作爲特徵。這是一個整體領域,雖然 – kobigurk

+0

另外我看了這篇文章。 http://felix.abecassis.me/2011/09/opencv-detect-skew-angle/ 這是有道理的,但我也無法實現這一點。 – Mervin