一种定位激光在摄像头画面中位置的方法(附安卓源码)
1.1、方案討論
定位激光在攝像頭畫面中的位置,最容易想到的方法是通過圖像處理找到激光點。因為激光點圖像與一般環境圖像不一樣,通過圖像處理可以辨別激光與環境的差異,從而定位激光。首先,這是從人的視角出發的,攝像頭看到的并不是這樣。攝像頭中的感光片可能因為差異看到的是形形色色的畫面,可能你看見的激光是一個紅色的亮點,而在攝像頭畫面中它就是一個白色的亮點。
激光照射在不同顏色背景下,所呈的顏色也是不一樣的,感光片是通過感知光來儲存顏色信息的,然后通過處理把這些光信息反映在屏幕上。在一個背景顏色單一,且深色(比如黑色),那么很容易通過圖像處理來找到激光點,在這種環境下,圖像處理通過二值化,灰度取閾值,找特征值(白色255等)就可以找到激光點,還有HSV顏色空間來確定激光點,這種方式適應較復雜的環境,因為采用這種方式一定比用RGB方式更準確。上面說的兩種方式只要參數調的好,是能達到一定準確度的,但是用在可能出現不同環境下,各顏色,光線,背景等在不斷變化的情況下參數也要變,用圖像處理精度定位難度是很高的。
當然并不是說圖像處理不能實現精準定位,想一想,圖像處理如果真能實現完美定位,如果幾個相同的激光點同時打在攝像頭畫面中,那么它應該取識別誰呢?
上面所講的是基于激光測距應用上的,而不是單純的進行激光定位的。既然應用在測距應用上,那么在結構固定了的情況下可不可以通過物理的方式來定位激光點呢?
1.2、方案論證
激光測距應用上,我們假設攝像頭與激光的位置如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.1 模擬激光測距儀的結構
我們知道了激光距離攝像頭的相對位置,我們就知道了攝像頭與激光之間的角度(a=arctan(y/x)),無論攝像頭畫面看多遠或者激光打到多遠,攝像頭與激光之間的相對位置是不會改變的,那么從攝像頭畫面上來看,激光點將沿著a角度進入攝像頭畫面,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.2 激光進入攝像頭畫面角度
?
首先我們需要知道,攝像頭和激光是平行的,那么為什么在攝像頭畫面中激光越遠,激光點里攝像頭中心就越近呢?攝像頭和激光的距離是固定的,只是越遠,攝像頭拍攝越廣,還是同樣大小的屏幕顯示畫面,就相當于激光點在攝像頭畫面中被壓縮了,被往中心擠了。如下圖,d為攝像頭與激光實際距離,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.3 激光在不同距離下畫面中的呈現方式
如圖1.3,隨著激光距離越遠,攝像頭畫面越廣,而兩者之間的實際距離不變,同樣顯示器顯示的情況下,激光點就無限靠近攝像頭中心。在攝像頭畫面中,在激光點打點較近時,如果此時將測距儀器移動,會看到激光在攝像頭畫面中移動的很明顯,當到了一定的距離,激光點就無限靠近畫面中心,就是到了某個距離,激光點就和攝像頭中心重合了。那么這樣的話,就可以知道激光在攝像頭中的坐標和激光距離存在這樣一個關系:斜率逐漸減小,最后無限趨近于一點的減函數(類似倒函數)。如下圖所示:
????????????????????????????????????????? 圖1.4 激光在畫面中坐標于激光距離的關系
?
上面所講的是理論論證,下面我們嘗試得到圖1.4中的函數。攝像頭內部有焦距,所有采集到的光信息通過這一點發散再經過物距鏡(調整這個可使成像變得清晰,比如相機的自動對焦AF就是調整這個距離)打到感光傳感器上,然后成像。那在感光片上成像的物體正是實際物像的縮小版,所以兩者具有對應關系。我們取最小關系,假設感光片和屏幕尺寸大小對應。感光傳感器上尺寸之比就等于實際物像之比就等于屏幕上的坐標之比。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.4 激光在畫面中坐標于激光距離的關系
上圖只討論在x方向的成像,y方向相同(垂直視場角)綜上所述,有:
?????? dx / (L+f)*tan(a)? = px / sx/2
?????? dy / (L+f)*tan(b)? = py / sy/2?????????????????????????????????????????
注:dx,dy為激光距離攝像頭中心x方向上的實際距離和y方向的實際距離;
?????? L為測出來的距離
?????? f為攝像頭焦距
?????? a為攝像頭水平視場角
?????? b為攝像頭垂直視場角
?????? px,py為激光在屏幕中的x,y坐標
?????? sx,sy為屏幕的像素大小
從上述公式上可以看出,
?????? Px = dx*sx/((L+f)*tana*2)
其中f,a,b,px,py為基本屬性,為固定的,所以px和L成倒函數關系,恰好驗證了圖1.4所示。
?????? 需要注意兩點:
1.坐標系是從攝像頭中心建立的,不是底角建立的,所以在結構設計時要考慮激光在攝像頭的哪一方。還有兩者之間的角度決定了激光點從什么方向進入攝像頭畫面,如1.2所示,這會影響對最小測距距離的影響。
?????? 2.最小測距的確定:首先一般測距模塊會給出激光的最小測距距離。還有一種是攝像頭剛進入畫面時,我們可以把此時的距離當作測距最小距離。當dx/(L+f)*tana等于1時,激光正好進入攝像頭畫面。如果dx>激光最小測距距離,那么dx為最小測距距離;反之,則最小測距距離為激光最小測距距離。
? ? ? ?講的比較粗糙,主要是用來備忘,不過很簡單,很好理解。嘿嘿~
? ? ? ?源碼提供測試方法,要根據實際參數更改和調整。源碼中使用的是myantenna L1激光測距模塊!!!
? ? ? github源碼
? ? ??
總結
以上是生活随笔為你收集整理的一种定位激光在摄像头画面中位置的方法(附安卓源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js alert追加html,利用JQ来
- 下一篇: 频率超出范围黑屏Linux,显示器超出频