2013-07-05 129 views
0

我想識別等,其是在screen.My主要目的繪製的圓形,三角形和矩形的形狀是一個用戶繪製在屏幕上的形狀,並且我需要一個代碼來識別此shape.How應該怎麼解決這個問題?的Android形狀識別在屏幕上

+0

歡迎使用stackoverflow。你有什麼試圖解決你的問題?請閱讀以下內容並改進您的問題:http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist –

回答

1

你正在嘗試實現可以​​說是相當棘手,但我碰巧來實現類似的東西在不久前,這裏是我使用的方法:

  • 棒黑色&白色圖紙
  • 有一個固定分辨率的小型數據庫(黑色&白色)圖形(50左右),比如說256x256(如果您願意,可以將它們作爲二進制斑點存儲在sqlite中)。確保你爲這些圖畫使用了粗線條(10px應該沒問題,或者是用戶輸入圖紙厚度的兩倍)。此外,圖紙應該正常化,這意味着它們的尺寸至少必須與圖像本身一樣大。
  • 提取由用戶和進程繪製的形狀它:

一個),如果它具有的縱橫比接近於正方形,然後簡單地裁剪它周圍的空白和放大,使得其具有相同的大小作爲你的數據庫圖像

b)否則,它將最有可能有一個尺寸大約兩倍大於另一個,在這種情況下,你裁剪白色空間,旋轉它有高度,因爲它是最大的尺寸,放大它到256x128,然後在兩側添加64像素的空白。

  • 您必須將您的圖形與每個數據庫圖像進行逐像素比較,並確定每個數據庫圖像重疊的黑色像素數量。然後你排序這些數字,你會得到最好的匹配。即使最佳匹配重疊像素少於20%,結果通常也不錯。
  • 由於某些形狀可以被認爲是相同的,即使它們是旋轉的(想象在圖像中放置三角形的各種方式:一個尖端向上,向下或朝向一側等),您可能想要將輸入圖形旋轉12到24次(每步15到30度),並將每次旋轉與數據庫中的每幅圖像進行比較。鑑於此步驟很可能需要大量處理能力,因此您可能會考慮將初始數據庫圖形的所有旋轉存儲在數據庫中,作爲不同的圖片,從而使數據庫更大,但可以節省旋轉輸入圖像的工作量,這是昂貴的。

鑑於上述算法有點資源不足,您可以考慮在某個地方安裝一臺服務器,可以進行實際比較,特別是如果要將許多映像添加到數據庫時。由於我已經爲演示應用程序實現了這個算法,因此我可以告訴你,你將不得不做很多像素操作。此外,使用Android SDK旋轉圖像可能很煩人,因爲它會改變圖像尺寸...

如果您覺得冒險,下面是一些論文,描述了用於解決此問題的最新算法:「Shape contexts enable efficient retrieval of similar shapes 「由Greg Mori,Serge Belongie和Jitendra Malik(2001)以及Remco C. Veltkamp(2001)的」Shape Matching: Similarity Measures and Algorithms「。數學可能有點沉重,但。