一種定位雷射在攝像頭畫面中位置的方法(附安卓原始碼)

2021-09-26 21:29:38 字數 2720 閱讀 3671

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原始碼

一種定位記憶體洩露的方法(Linux)

本文是 一種定位記憶體洩露的方法 solaris 對應的 linux 版本,偵錯程式使用 gdb。主要介紹例項部分。其他請見 一種定位記憶體洩露的方法 solaris 模擬 new失敗的程式 include class abc int i int j void f throw std bad all...

一種定位記憶體洩露的簡易方法

在這篇文章中,將介紹一種定位記憶體洩露的方法。主要原理是通過記憶體洩露時分配的序號以及大小,配合dbgheap.c檔案來定位。在vs開發過程中,開啟crt內部的記憶體洩露檢測函式,當程式退出時,在除錯視窗會輸出未釋放的記憶體資訊,例如下圖所示 從上面截圖可以得知,該次記憶體分配序號為1789698,...

Apollo學習之定位(一) 雷射雷達定位

在apollo的多感測器定位資料夾裡 modules localization msf 的這些檔案 記錄了apollo進行雷射雷達定位的方式 檔案如下 首先來看看localization lidar.cc localizationlidar localizationlidar localizatio...