基於OpenCV的三維空間VR單點與多點跟蹤方法

System Status: stereo infrared cameras - 2 OmniVision9281 + 1 OmniVision580(bridge processor)

_________________________________________________________________

OV9281:

Resolution: 1 megapixel(MP) 

Frame Rate: 720P(1280*720)@120 fps & VGA@180fps

Pixel Size: 3.0 µm

Output Format: 8-/10-bit RAW

Chroma: Black & White

_________________________________________________________________

Tracking Object: Infrared Led light

一般來說,涉及到相機精度方面的應用,都應進行相機標定(camera calibration),相機標定相當重要。

方法步驟:

1. 基於OpenCV的立體相機標定,需離線標定好。

關於立體相機標定,見之前寫過的兩篇博客內容:

基於OpenCV的立體相機標定StereoCalibration與目標三維座標定位

OpenCV立體相機標定Stereo Calibration與校準檢驗Rectification詳述

2. OV580可時間同步兩路OV9281數據輸出,輸出數據爲raw8格式,數據量大小爲_height*_width,需要對輸入buffer進行預處理,轉換成左、右Mat(_height, _width/2)格式,便於OpenCV處理。

for (int i = 0; i < _height; i ++)
{
    memcpy(left_buffer + i*_width/2, (unsigned char *)_buffer + i * _width + _width/2, _width/2);
    memcpy(right_buffer + i*_width/2, (unsigned char *)_buffer + i * _width, _width/2);
}
*matL = Mat(_height, _width/2, CV_8U, left_buffer);
*matR = Mat(_height, _width/2, CV_8U, right_buffer);


3. 根據歷史信息預測當前幀Led目標所在圖像位置:kalman預測,運動曲線擬合預測。

4. 幀差法確定前一幀中心,並與存儲的上一幀中心進行比較,若偏差較大,則更新當前預測中心。

問:步驟3已經根據上幀所在位置計算出了當前幀的預測中心。此處爲何還要選取幀差法計算上一幀中心呢?

答:上一幀目標中心確已獲取並存儲,若目標中心準確,則應與幀差法所求的上一幀目標相同,此時預測結果可信;若兩中心座標不同,信任幀差法計算的上一幀中心,將不以步驟3計算的預測中心爲準,更新預測中心。

幀差法算法步驟:
step1. 獲取當前三幀圖像數據,並二值化處理後得到:當前幀-F0, 前一幀- F1, 前二幀- F2 ;
step2. 提取前一幀 F1 中的運動信息,T = (F0 - F1) ∩ (F2 - F1) ;
step3. 形態學開運算處理運動信息 T,去掉相鄰幀之間背景微小差異產生的干擾;
step4. 尋找目標信息 T 中連通域,若個數爲1,則可認爲其爲真實目標,計算目標中心信息C
step5. 若幀差法計算的前一幀中心 C 與已經保存的前一幀中心 C0 偏差大於閾值 thresh,
         則更新預測框,在 C 附近置ROI,尋找當前幀目標;若小於閾值 thresh,則根據預測信息置 ROI 。


5. 根據當前預測中心置ROI,步驟7只需在ROI中檢測當前幀Led目標,相比整圖檢測節約時耗。

6. 對當前ROI區域進行校準,相比整圖校準節約時耗。 

remap(_imgLeft,  img1r, map11(ROIrect), map12(ROIrect), INTER_LINEAR);
remap(_imgRight, img2r, map21(ROIrect), map22(ROIrect), INTER_LINEAR);

7. 檢測當前ROI區域紅外Led目標 -- Blob Detection。

blobParams.thresholdStep = 25;
blobParams.minThreshold = 150;
blobParams.maxThreshold = 250;
blobParams.minRepeatability = 1;
blobParams.minDistBetweenBlobs = 2;

blobParams.filterByColor = true;
blobParams.blobColor = 255;

blobParams.filterByArea = true;
blobParams.minArea = 10;
blobParams.maxArea = 1000;

blobParams.filterByCircularity = false;
blobParams.filterByInertia = false;
blobParams.filterByConvexity = false;

8. 去掉ROI中的僞目標,構造blob(Area, radius, height, width)特徵向量;若目標靜止不動,則與上幀目標最近者爲當前幀真實目標。

由於系統能夠達到實時,即720p@60fps,所以當目標運動時,相鄰兩幀之間的目標運動不會太大,且同一目標形狀、大小等變化也不會太大,構造高維特徵向量,尋找前一幀目標在當前幀中最相似的匹配,則可視其爲當前幀的真實目標;若物體靜止時,則可不用特徵篩選僞目標,可搜索當前幀最近的目標即可視爲真實目標。

9. 對目標點進行勻速kalman濾波,可有效消除目標靜止放置時的抖動。

當前系統檢測精度高,即使目標放置靜止,但實時檢測時,由於Led目標光源的功率不穩定性以及Blob檢測方法的複雜性,會帶來目標在圖像上產生亞像素精度級別的波動,在計算3D座標時帶來mm級別的擾動,故利用防抖算法可以有效降低結果的跳動,帶來視覺上面的改善。

10. 最終,得到水平線對齊的左右圖目標座標,利用三角測距原理可獲得單點目標準確3D座標,精度可以很高 3m/ 2mm-error(與硬件系統指標相關)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章