要想利用“人工神經網絡”處理圖像識別問題,需要事先收集到大量的數據。
可是倉促之間,上哪去弄數據?
倒是可以給“戰神一號”拍一些“寫真”,來充當訓練集,反正所有的參賽機器人,外形都差不多。
這樣做倒也不是不行,但時間太倉促了,數據的量級達不到要求,訓練效果應該不會太好。
而且,就算拼着一夜不睡,東拼西湊出一點訓練數據,也很可能來不及訓練了。
訓練“人工神經網絡”,畢竟是一件比較消耗時間的事情。
而現在最大的問題,就是缺少時間,明天就要正式上場了的說……
何況,“人工神經網絡”的優勢在於通用性和準確率,在特定問題上的識別速度,還真不見得能比得上精心優化過的“笨辦法”。
所以江寒仔細思考了一番之後,還是決定採用“幾何形狀匹配”的思路來做圖像識別。
這種辦法的優點是識別速度比較快,更容易獲得高幀率。
編程的複雜度可能稍微高了一點,但這對江寒來說,並不是什麼太大的問題。
他先新建一個.CPP文件,以及對應的.h頭文件,然後創建一個新的類,用於容納自己的圖像識別算法。
接下來就可以正式編碼了。
江寒一邊思考,一邊編寫代碼,靳雪雯在一邊安靜地看着。
兩人偶爾也交流一兩句,討論一下編程思路、函數的功能之類的問題。
“江寒哥哥,這幾個語句是做什麼用的啊?”
“這個是圖像預處理,按照自定義的閾值,將每個像素二值化……”
“那江寒哥哥,這個函數呢?我有點看不懂……”
“哦,這個叫膨脹處理,可以讓圖像的輪廓更加明顯……”
……
二十多分鐘後,江寒搞定了圖像預處理的相關代碼。
這部分要做的事情很簡單,就是將攝像頭拍到的圖像,先處理成灰度圖,然後二值化,只留下LED燈部分。
接下來,要在圖像中遍歷像素、尋找LED燈的輪廓。
這是整個算法中計算量最大的部分。
好在江寒對圖片的預處理,做得相當到位,將這一步所消耗的時間,基本上壓縮到了極限。
找到LED燈後,下面的事情就簡單了,遍歷輪廓、提取LED燈,再匹配篩選、找到機體輪廓,然後就可以鎖定目標攻擊了。
在做機體輪廓分析時,江寒考慮了一下,使用了模板匹配技術。
這樣一來,就進一步減少了運算量,節省了時間。
到了這裡,目標識別就基本完成了。
接下來,就可以測算目標的方位和距離了。
這一步涉及到圖片座標系與大地座標系之間的換算,算法複雜度相當高。
但江寒豈是欺軟怕硬的人呢?
只要捨得腦力全開,肯定是搞得定的。
wωω. тTk ān. C 〇
然而,這樣又有一個新問題,可別不等完成編碼,大腦的能量就消耗殆盡了。
那種空虛乏味的感覺,可是相當難受的……
所以江寒想了想,就笑眯眯地說:“小蚊子,可以拜託你一件事嗎?”
靳雪雯精神一振,摩拳擦掌地說:“江寒哥哥,快說、快說,是什麼事?”
自己閒了這麼久,總算可以派上點兒用場了……
江寒微微一笑,說:“幫我打個電話給前臺,要點宵夜。”
“沒問題!”靳雪雯脆生生地答應了一聲。
然後拿出手機,喜滋滋地問:“江寒哥哥,你想吃什麼呀?”
“冰島紅極參,問問哪裡有,然後讓前臺幫忙訂做兩盤,送到大廳來。”
“好的。”靳雪雯立即撥號。
江寒想了想,又補充說:“口味隨便,紅燒、清蒸無所謂……哦,對了,讓他們把點餐的錢加到我賬單裡。”
靳雪雯一擺手:“不用,你教我改程序,我還不知道怎麼感謝呢!
再說咱們戰隊剛剛成立,本隊長請吃個宵夜,也是應該的吧?”
江寒呵呵一笑:“小蚊子啊,你可能不太清楚,這種地方,一條紅極參只怕得7、8百塊。”
靳雪雯嘻嘻一笑:“沒事,讓爸爸買單就行了,他賺錢就是給我和媽媽花的嘛。”
江寒:“……”
有點無言以對的感覺。
眼前這一隻,莫非就是傳說中的富蘿莉?
畢竟有句話說得好,十個蘿莉九個富,還有一個……
靳雪雯很快安排完宵夜,然後繼續看江寒編程。
江寒接下來就開始編寫目標測算模塊。
靳雪雯原本使用的辦法,是直接用像素座標來計算旋轉角度。
這樣做倒也不是一定不行,但比較麻煩,而且效果也不會太好。
這是因爲像素座標差與角度之間,並不是線性關係,必須根據像素的座標,隨時矯正換算比例,才能得到一個不很精確的近似值。
江寒思考了一下,根據“小孔成像”的原理,設計了一個簡單而又巧妙的算法,通過像素座標算出了正確的轉角。
想要從圖像數據中得到物理世界的座標,需要先標定攝像頭,從而得到攝像頭的內參。
這一步可以使用OpenCV中的標定工具來做。
標定完攝像頭後,就能得到攝像頭的內參矩陣和畸變參數。
根據這兩組參數,對像素值的座標進行矯正,然後就可以通過反三角函數,來計算出需要的角度了。
寫完算法之後,江寒又設計了一個小實驗,對其進行了驗證。
實驗結果表明,這個算法完全OK,準確率和速度都優於靳雪雯原來的算法。
但這種算法也有一個相當明顯的缺陷,由於缺失了深度信息,因此無法對座標系進行變換操作。
這樣一來,就只能得到相對於攝像頭中心的轉角……
那麼如何解決深度的問題,得到三維座標呢?
江寒又設計了一種算法,通過求解PNP問題,來得到敵我雙方在真實空間中的座標偏移。
PNP問題,就是 Perspective N-Point Problem 。
江寒對這個算法不是十分熟悉,只知道可以用來處理空間定位問題。
所以,他先去網上找了幾篇文獻,仔細瀏覽,理解了原理之後,纔開始編寫自己的代碼。
首先標定攝像頭,得到相機的內參矩陣和畸變參數,然後測量物體的尺寸,得到物體在世界座標系中的座標。
接下來,從圖像中得到機體的像素座標,然後通過SolvePnP函數計算出平移向量,對座標進行平移操作。
最後再修正一下y軸和z軸的座標,就可以通過反三角函數,計算出所需要的角度值了。
這種算法可以得到物體在三維空間中的座標,缺點是需要計算四個點,而第一種算法,利用小孔成像的原理,只需要計算一個點就夠了。
兩種辦法各有優缺點,可以分情況,靈活運用。
當目標距離十分遙遠時,就用“小孔成像法”計算角度;距離合適的時候,則不妨切換成PNP法……
這樣一來,就能兼顧效率與精準了。
破費!
最後還有一件事,那就是目標動作預測。