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(與硬件系統指標相關)。
新聞熱點
疑難解答