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(与硬件系统指标相关)。
新闻热点
疑难解答