江寒想了想,又補充說:“口味隨便,紅燒、清蒸無所謂……哦,對了,讓他們把點餐的錢加到我賬單里。”
靳雪雯一擺手:“不用,你教我改程序,我還不知道怎么感謝呢!
再說咱們戰隊剛剛成立,本隊長請吃個宵夜,也是應該的吧?”
江寒呵呵一笑:“小蚊子啊,你可能不太清楚,這種地方,一條紅極參只怕得7、8百塊。”
靳雪雯嘻嘻一笑:“沒事,讓爸爸買單就行了,他賺錢就是給我和媽媽花的嘛。”
江寒:“……”
有點無言以對的感覺。
眼前這一只,莫非就是傳說中的富蘿莉?
畢竟有句話說得好,十個蘿莉九個富,還有一個……
靳雪雯很快安排完宵夜,然后繼續看江寒編程。
江寒接下來就開始編寫目標測算模塊。
靳雪雯原本使用的辦法,是直接用像素坐標來計算旋轉角度。
這樣做倒也不是一定不行,但比較麻煩,而且效果也不會太好。
這是因為像素坐標差與角度之間,并不是線性關系,必須根據像素的坐標,隨時矯正換算比例,才能得到一個不很精確的近似值。
江寒思考了一下,根據“小孔成像”的原理,設計了一個簡單而又巧妙的算法,通過像素坐標算出了正確的轉角。
想要從圖像數據中得到物理世界的坐標,需要先標定攝像頭,從而得到攝像頭的內參。
這一步可以使用OpenCV中的標定工具來做。
標定完攝像頭后,就能得到攝像頭的內參矩陣和畸變參數。
根據這兩組參數,對像素值的坐標進行矯正,然后就可以通過反三角函數,來計算出需要的角度了。
寫完算法之后,江寒又設計了一個小實驗,對其進行了驗證。
實驗結果表明,這個算法完全OK,準確率和速度都優于靳雪雯原來的算法。
但這種算法也有一個相當明顯的缺陷,由于缺失了深度信息,因此無法對坐標系進行變換操作。
這樣一來,就只能得到相對于攝像頭中心的轉角……
那么如何解決深度的問題,得到三維坐標呢?
江寒又設計了一種算法,通過求解PNP問題,來得到敵我雙方在真實空間中的坐標偏移。
PNP問題,就是PerspectiveN-PointProblem。
江寒對這個算法不是十分熟悉,只知道可以用來處理空間定位問題。
所以,他先去網上找了幾篇文獻,仔細瀏覽,理解了原理之后,才開始編寫自己的代碼。
首先標定攝像頭,得到相機的內參矩陣和畸變參數,然后測量物體的尺寸,得到物體在世界坐標系中的坐標。
接下來,從圖像中得到機體的像素坐標,然后通過SolvePnP函數計算出平移向量,對坐標進行平移操作。
最后再修正一下y軸和z軸的坐標,就可以通過反三角函數,計算出所需要的角度值了。
這種算法可以得到物體在三維空間中的坐標,缺點是需要計算四個點,而第一種算法,利用小孔成像的原理,只需要計算一個點就夠了。
兩種辦法各有優缺點,可以分情況,靈活運用。
當目標距離十分遙遠時,就用“小孔成像法”計算角度;距離合適的時候,則不妨切換成PNP法……
這樣一來,就能兼顧效率與精準了。
破費!
最后還有一件事,那就是目標動作預測。
這是一個相當困難的問題,但也是一個非常重要的問題。
預測做得好不好,直接決定了子彈的命中率。
如果不做預測,當敵方車輛不斷移動時,瞄準點將總是滯后于敵機的實際位置。
這當然是不可接受的。
所以必須做,而且還要盡可能地做到完美!