銘傳資傳-專題研究開會紀錄20180301

3/2 To-do List:
    1.找出grid的交點
    2.求同方向直線的交點(vanish points)
    3.建立XR' , YR'
    4.求ZR' = XR' x YR'
    5.推得R = [XR', YR', ZR']3x3

寒假時老師已經大致講解過作業流程,並開始交給我們寒假的額外工作,但是......實在是太多了,所以最後只弄出一點點來。
在上週我花了些時間寫出尋找棋盤格的範圍,原理是先設定紅色矩形的RGB門檻值(R>=180,G<=100,B<=100)作為判斷依據,得到下面這樣的結果:

但是這是第一階段實驗,因為可以發現紅色矩形區域內的棋盤格不見了,原因是我並沒有保留棋盤格的資訊。
現在有了RGB門檻值,接著要根據抓到的紅色矩形範圍來保留裡面的棋盤格。
方法是:
1.宣告4個變數用來存上、下、左、右四個邊界的平均位置
2.宣告4個empty array存放待會掃描紅色邊界的結果
3.用兩個迴圈分別做四次掃描(由上至下、由左至右、由下至上、由右至左),只要有像素的RGB範圍觸及紅色矩形的門檻值,就將該像素位置append到對應的陣列,並將最後該陣列內的值做平均(假如100個值就除以100),將對應平均後的值存到1.對應的變數內,如此重複做四次。

4.由3.的計算所獲得的參數,已經可以知道上、下、左、右大致的邊界在哪裡。故我們再將邊界內的像素取出來做保留(也就是棋盤格的資訊),最後輸出得到下列結果:
但是下邊界可能沒做好,有一些部分被吃掉了,以後有時間再來改...

好啦~以上是寒假完成的部分
=====================================================================

這週討論棋盤格擷取下來後,接下來要探討及統整的部分。
左邊座標是攝影機座標,原點是cop的位置,由Zcamera方向投射出去先經過影像平面,對應的是右邊我們自製的棋盤格板板。


Step1:找出grid的交點
老師的指示是將擷取下來的圖去掉棋盤格周圍紅色的線條(它很細,要放大看才會清楚。其實那個線條是我用來判斷紅色矩形的標記,同時也是平均值的參考點xD)


接著套用OpenCV的兩個函數:
1. findChessboardCorners


2. drawChessboardCorners

最後將黑白相間的點標起來,像下圖這樣(借一下Stack Overflow討論串的圖片...):

Step2:求同方向直線的交點(vanish points)
下一步是根據這些點的連線,包含橫向及縱向,照理說直線彼此不會平行,最後一定會交於某一點,可能在「很右邊的某個位置」等等。像是我輸出的那個圖片,很明顯看得出來是倒矩形,所以在圖像下面某個位置一定會有交點,而這個交點我們稱作「消逝點( vanish point )」。


Step3:建立XR' , YR'
由於棋盤格中每一個圈圈相連都會呈一直線,但是我們不知道直線方程式,所以我們先做XR'方向(也就是縱向直線),令方程式a1x+b1y = 1,利用矩陣相乘將各點位置代入,最後再解矩陣即可求得。
XR'求完後,同理也可求得YR'

Step4:求ZR' = XRx YR'
XR' 及 YR',兩個求外積可得ZR'

Step5:推得R = [XR', YR', ZR']3x3
三個3x1的矩陣合併,最後可以得到一個3x3的方陣

至於cop和實際上的棋盤格位置有一個3x1的T向量,還有座標轉換的問題(下圖),這個等到下次或之後開會有講解再說吧哈哈哈!

留言

這個網誌中的熱門文章

Windows 10 64bits安裝Spyder (Anaconda)

在Spyder IDE 使用Python + OpenCV

Raspberry Pi - 利用AnyDesk遠端到樹莓派,並保持螢幕解析度不縮放