2017-07-07 19 views
0

與一羣朋友一起,我們試圖完成Raspberry Pi上的計算機視覺任務,使用OpenCV庫使用C++進行編碼。使用OpenCV 3查找對象的順序

讓我先解釋一下任務。 有一個由16個獨立正方形組成的圖案,每個正方形都是紅色,黃色或藍色。我們正在使用相機模塊在四軸飛行器上安裝rasperry pi並收集圖案的視頻輸入。

我們必須檢測很容易完成的方塊的顏色,並在網上進行一些研究。棘手的部分是我們必須檢測正方形的順序,以便按順序保存數組中的顏色。

到目前爲止,我們已經完成了過濾所需的顏色(紅色,黃色,藍色)以確定正方形。

example pattern to recognize and our process so far

在第二圖像,我們知道每個方塊的顏色和中心點。我們需要的是按照文件或屏幕順序編寫它們的方法。

爲了找到順序,我們嘗試了幾種可以找到角點的OpenCV方法。利用角點,我們比較了每個點和確定的端點,以便繪製一個邊界矩形並克服一點扭曲。

但是由於quadcopter獲取視頻流,總會有高失真的機會。這弄亂了我們的角落理論,導致錯誤的顏色順序。例如,它可以捕捉圖像是這樣的:

highly distorted image

這是不正確的,通過比較它們的中心點找到這些正方形的順序。它也無法找到端點在它們周圍畫一個更大的矩形來平坦化圖案。然後訂購...

我要求的是算法的建議。我們是否完全朝錯誤的方向努力尋找角落?是否可以在不考慮失真的情況下確定訂單?

在此先感謝。

+0

使用cv :: minAreaRect在你的所有盒子周圍獲得一個旋轉的邊界矩形。然後選擇一個角落作爲網格的左上角(對於失真> = 45度不明確)並計算相對於旋轉的邊界矩的中心點內容(例如,通過旋轉所有中心點)。 – Micka

+0

使用旋轉的邊界矩陣作爲基礎,您甚至可以猜測網格(如果知道網格大小),並選擇最適合每個猜測網格位置的分段顏色框。 – Micka

回答

0

取兩個最遠的中心並將它們編號爲1和16.然後找到距離1-16行最遠的兩個中心,即左邊(數字4)和右邊(數字13) )。現在你有四個角落。

計算將角點1,4和13的座標映射到(0,0),(3,0)和(0,3)的仿射變換。將這個變換應用到16箇中心,並將其轉到最近的整數。如果一切順利,您將在[0,3] x [0,3]範圍內獲得正方形的「邏輯」座標。映射到單元索引是立即的。

請注意,由於對稱性,四重不確定性將保留,您可以通過檢查顏色模式來提升。

enter image description here

這個過程將是非常穩健的變形。如果有極端的觀點,你甚至可以利用這四個角來確定一個同形變換而不是仿射。在你的情況下,我懷疑這會有用。您可以通過檢查所有預期指標已分配來評估正常工作。