OpenCV+MFC的双目视觉测距与景深实现之问题探讨

robot_vision

学习OpenCV快3个月了,主要是根据课题需要实现双目视觉测距、景深重建和目标(障碍物)检测。目前已经能实现摄像头定标和校正、双目匹配、获取视差图和环境景深图像,但是在测距方面还没有精确实现,主要是还没彻底弄清楚摄像头定标,有几个问题希望能和大家探讨下:

1、进行摄像头定标时,棋盘方格的实际大小 square_size (默认为 1.0f )的设置对定标参数是否有影响?
具体地,假如棋盘方格大小的 3 cm,那么 square_size 就应该设置为 30.0f 吧?
另外,定标所得的摄像头内参数,即焦距和原点坐标,其数值单位都是一致的吗?
怎么把焦距数值换算为实际的物理量?
2、在使用 cvStereoCalibrate 进行双摄像头定标时,flags 的设置怎样才是最优?
我目前的设置是 CV_CALIB_FIX_ASPECT_RATIO +
                      CV_CALIB_FIX_PRINCIPAL_POINT +
                      CV_CALIB_SAME_FOCAL_LENGTH
同样地,怎么把定标得到的两个摄像头之间的平移矩阵参数 Transaction_matrix 转换为实际的物理量?其中的 Tx 值应该是两个摄像头成像原点之间的距离,根据公式 Z = f*Tx/(d-(Cxl-Cxr)) 来测算目标距离。
3、关于 cvStereoRectify 函数
在双目校正(Stereo Rectification)上,我目前使用的是 BOUGUET 方法,即 cvStereoRectify 函数,因为要获取景深图像,所以 cvStereoRectify 函数要输出一个变换矩阵 Q,并且最后的参数 flag 我设置为0,而不是 CV_CALIB_ZERO_DISPARITY。这样设置应该没问题吧?

Q_matrix

(1)校正后得到的变换矩阵Q,Q[0] [3]、Q[1][3]存储的是校正后左摄像头的原点坐标(principal point)cx和cy,Q[2][3]是焦距,Learning OpenCV 书中说是“Here the parameters are from the left image”,但为什么与 cvStereoCalibrate 得到的左摄像头内参数据不同呢?
(2)如上图公式所示,按照 Learning OpenCV P435给出的 Q 矩阵,计算距离 Z 的公式是带负号的,但这与 P436 给出的对应公式刚好是反号了的!
4、关于双目匹配求取视差图
OpenCV提供了两个函数来进行双目匹配、获取视差:cvFindStereoCorrespondenceBM 和 cvFindStereoCorrespondenceGC。
BM 的执行速度快,我用30帧/秒的速度读入352*288的摄像头画面,用 BM 方法不会卡,算是实时了,但 BM 方法得到的视差不精确,所得的视差图只是大致上与实物轮廓相似;而GC 方法则能得到非常好的视差图,但是速度极慢,大概4、5秒才能处理完一帧画面。
我的 BMState 是这样设置的:

      // 创建 CvStereoBMState 类的一个实例 BMState,进行双目匹配
BMState = cvCreateStereoBMState();
assert(BMState != 0);
BMState->preFilterSize=13;
BMState->preFilterCap=13;
BMState->SADWindowSize=13;
BMState->minDisparity=-16;
BMState->numberOfDisparities=64;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;

视差矩阵是 CV_16S 数据类型。目前的问题是,所得的视差数值范围是从 -272 到 800 左右,不明白是怎么算出来的。原理上,对于左视图的一个特征点,应该是从右视图对应的同一行像素点上,在设定的 numberOfDisparities 和 minDisparity 范围内,寻找匹配的特征点、并求出视差值,这样的话,视差数据的数值范围应该是在[minDisparity, numberOfDisparities]内的(例如这里应该是[-16, 64]范围)。

下面是摄像头定标所得的参数,有兴趣的朋友麻烦帮忙看看、分析一下 O(∩_∩)O~

xml version="1.0"?>

40num_frames>

352 288image_size>

3rows>
3cols>
ddt>

466.1152304250040900 0. 175.5000000000000000 0. 466.1152304250040900
143.5000000000000000 0. 0. 1.data>lfCamMat_tM_1>

3rows>
3cols>
ddt>

466.1152304250040900 0. 175.5000000000000000 0. 466.1152304250040900
143.5000000000000000 0. 0. 1.data>riCamMat_tM_2>

1rows>
5cols>
ddt>

-0.2573650855216149 -1.8434093222735448 -3.0112808382708931e-003
-6.4644827216197836e-003 6.8034878625006252data>lfDistCoef_tD_1>

1rows>
5cols>
ddt>

-0.2243951326136464 0.3568495067121301 0.0165299920785396
-0.0150102576251246 -11.3185299056116850data>riDistCoef_tD_2>

3rows>
3cols>
ddt>

0.9995520693887151 1.2173722340566046e-003 0.0299028190239849
-9.9571078893194204e-004 0.9999719274362870 -7.4264998069014671e-003
-0.0299110203898538 7.3933986907815975e-003 0.9995252215502303data>Rotation_matrix>

3rows>
1cols>
ddt>

-62.4046095533341470 2.2541399055670328 4.0660224235033873data>Transaction_matrix>

3rows>
3cols>
ddt>

-1.8956412948785254e-006 -1.2111883584794274e-004 0.0495469807761968
6.5733933919231557e-005 1.3948680821461410e-005 0.8578014591819361
-0.0396473926165904 -0.8508164298132787 1.data>Foundation_matrix>

3rows>
4cols>
ddt>

437.5624983240625700 0. 191.6575660705566400 0. 0.
437.5624983240625700 145.4007148742675800 0. 0. 0. 1. 0.data>Calib_LfCamMat>

3rows>
4cols>
ddt>

437.5624983240625700 0. 205.8338241577148400
-2.7329986601713106e+004 0. 437.5624983240625700
145.4007148742675800 0. 0. 0. 1. 0.data>Calib_RiCamMat>

4rows>
4cols>
ddt>

1. 0. 0. -191.6575660705566400 0. 1. 0. -145.4007148742675800 0. 0.
0. 437.5624983240625700 0. 0. -0.0160103444140231 0.2269667744774826data>Q_matrix>
opencv_storage>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值