2011-05-26 121 views
10

我想識別手寫體形狀並找出它可能在該組中的形狀。簡單地說,如果我畫一個三角形,應用程序應該將其識別爲三角形。我如何使用C#或Java來做到這一點,任何幫助表示讚賞。識別手寫體形狀

在此先感謝。

這些都是一些我需要找出 enter image description here

+0

你可以張貼形狀的例子(截圖)? – 2011-05-27 08:45:14

+0

我添加了一些屏幕截圖 – 2011-05-30 05:31:01

回答

2

你可以嘗試使用OpenCV了點。 EmguCV是OpenCV for .net的一個很好的包裝。觀看ShapeDetection演示(包含在OpenCV中)

+0

我在哪裏可以獲得此DEMO? – 2011-05-30 07:14:48

+0

下載EmguCV二進制文件/源代碼。演示應用程序(包括二進制文件和源代碼)隨庫一起提供。 – oddy 2011-05-30 09:27:21

+0

非常感謝 – 2011-05-31 12:47:54

1

如果您正在尋找較大圖像內的特定形狀,那麼OpenCV是一個很好的選擇。 Emgu.CV是一個很好的.Net包裝器。請參閱my picture of a SURF implementation。另見other options in OpenCV,它有很多提供。請注意,這種方法需要大量的處理能力。

如果你可以很容易地識別出你想要的BLOB形狀(也就是給算法一張只有這種形狀的圖片),你可以搜索「ANN OCR」(「人工神經網絡」和「光學字符承認」)。許多(大多數?)人工神經網絡實現帶有用於饋送形狀(字母)和識別最接近形狀(手寫字母)的示例代碼。例如Neural Network OCR。我相信這種方法可以解決您的問題。 (旁註:我遇到並測試了很多可以做到這一點的lib庫,它是Neural Networks 101.)

如果你需要BLOB算法的ANN-OCR,OpenCV可以提供這個功能。

這兩種方法都非常容易實現。

2

如果你想「推出自己的」我建議以下步驟:

首先,縮略(薄出的圖像,直到所有的線是一個像素厚)。有很多方法可以做到這一點,這是一個研究得很好的問題。 Google瞭解更多信息。

現在,從一個黑色像素開始,一次一個像素地通過並追蹤圖像的輪廓。將這些段中的每一個添加到概述形狀的段列表中(每個段將是從一個像素到其相鄰像素的簡單線)。現在,您將形狀輪廓描繪爲多邊形多邊形。

現在(在這一點上可能的步驟通過拉動每個頂點接近平均鄰國的平滑輪廓),您可以使用角點檢測算法找到的角落(到這裏看看:HTTP: //visual.ipan.sztaki.hu/corner/node7.html)。

這應該足以識別您列出的形狀。

如果你想變得更聰明,你還可以識別角落之間存在的邊緣類型。如果兩個拐角之間的線段停留在它們之間的直線的某個閾值內,則將其視爲「直線」邊緣。如果不是這樣,你會把它當作彎曲的邊緣。

隨着角落+直線/彎曲邊緣,您可能會發現任何形狀,你正在尋找很好。