2010-01-14 32 views
12

我試圖使用OpenCV從iPhone遊戲Blocked「解析」屏幕截圖。截圖被裁剪成這樣:使用OpenCV查找圖像中矩形的位置

Blocked screenshot

我想對於現在我只是想找到每個4分組成每個矩形的座標。我看到OpenCV附帶的樣本文件square.c,但是當我在這張圖片上運行該算法時,它會出現72個矩形,包括空白的矩形區域,我顯然不想將它們算作我的一個矩形。什麼是更好的方法來解決這個問題?我嘗試了一些Google的研究,但是對於所有的搜索結果,只有很少的相關可用信息。

+1

只需扔掉顏色錯誤的矩形。 – 2010-01-14 22:30:16

回答

13

類似的問題已經討論: How to recognize rectangles in this image?

至於你的數據,你的矩形正在努力尋找是唯一的黑色物體。所以你可以嘗試做一個閾值二值化:黑色像素是那些所有三個RGB值小於40(我發現它是憑經驗)。這個簡單的操作讓你的照片看起來就像這樣:

binarized picture http://img691.imageshack.us/img691/975/rectk.png

後,你可以申請Hough變換找到線(我所指的主題中討論),或者你可以做到這一點更容易。計算黑色像素對X和Y軸的積分投影。 (對X的投影是x_i的向量 - 黑色像素的數量,使得它的第一個座標等於x_i)。所以,你可以得到可能的x和y值作爲投影的峯值。然後查看通過找到的x和y限制的所有可能的分段(如果(x_i,y_j)和(x_i,y_k)之間有很多黑色像素,則可能有一行)。最後,將線段組合成矩形!

+0

我打算選擇這個答案作爲答案,因爲它非常有幫助,並且是解決問題的有趣方法。但是因爲我需要說出灰色和藍色矩形之間的區別,所以無論如何我都需要進行色彩分析,即使我使用了你的方法,所以我決定只是建立在我原來的方法上。 – dancavallaro 2010-01-15 22:30:15

0

嘗試像哈里斯角檢測器一樣的許多角落檢測器之一。在多個分辨率下嘗試這種方法通常也是一個好主意:所以對不同的放大倍數進行一些預處理。 看來,你想要某種顏色占主導地位的正方形,那麼你可以通過首先使用像cvsplit .....這樣的顏色來限制其他顏色,然後對顏色進行閾值...所以只有該區域保持....與裁剪操作...我認爲這可以工作以及...

+0

Harris角點檢測完全沒有用處,因爲所有角落都已知,遊戲處於完美的網格狀態。 – 2011-10-28 17:46:47

2

由於您的問題是小矩形,我會開始刪除它們。 由於這些線條比矩形的邊框要細得多,所以我會先在圖像上應用morphological operations

使用看起來像這樣的結構元件:

element = [ 1 1 
      1 1 ] 

應該刪除小於兩個像素寬的線。在刪除小行後,OpenCV的矩形查找算法很可能會爲您完成剩下的工作。 侵蝕可通過OpenCV的功能cvErode

3

塊看起來像位圖來完成 - 你爲什麼不使用簡單的對每個塊大小/顏色/取向不同的模板,模板匹配?

5

我完全按照我原來的方法建立起來,按照羅伯特在他對我的問題的評論中所說的那樣做。當我得到我的矩形列表之後,我會穿過並計算每個矩形的平均顏色。我檢查平均顏色的紅色,綠色和藍色分量是否都在灰色和藍色矩形顏色的10%以內,如果它們是我保存矩形,如果它們不是我放棄它。這個過程給了我這樣的事情:

screenshot

由此看來,是微不足道的獲得我需要的信息(每個矩形的方向,起點和長度,考慮到遊戲窗口爲6×6格)。