OpenCV学习笔记(11)OpenCV+MFC的双目视觉测距与景深实现 之 问题探讨

OpenCV学习笔记(11)OpenCV+MFC的双目视觉测距与景深实现 之 问题探讨_第1张图片

学习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。这样设置应该没问题吧?

OpenCV学习笔记(11)OpenCV+MFC的双目视觉测距与景深实现 之 问题探讨_第2张图片

(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"?> <opencv_storage> <num_frames>40 num_frames> <image_size> 352 288 image_size> <lfCamMat_tM_1 type_id="opencv-matrix"> <rows>3 rows> <cols>3 cols> <dt>d dt> <data> 466.1152304250040900 0. 175.5000000000000000 0. 466.1152304250040900 143.5000000000000000 0. 0. 1. data> lfCamMat_tM_1> <riCamMat_tM_2 type_id="opencv-matrix"> <rows>3 rows> <cols>3 cols> <dt>d dt> <data> 466.1152304250040900 0. 175.5000000000000000 0. 466.1152304250040900 143.5000000000000000 0. 0. 1. data> riCamMat_tM_2> <lfDistCoef_tD_1 type_id="opencv-matrix"> <rows>1 rows> <cols>5 cols> <dt>d dt> <data> -0.2573650855216149 -1.8434093222735448 -3.0112808382708931e-003 -6.4644827216197836e-003 6.8034878625006252 data> lfDistCoef_tD_1> <riDistCoef_tD_2 type_id="opencv-matrix"> <rows>1 rows> <cols>5 cols> <dt>d dt> <data> -0.2243951326136464 0.3568495067121301 0.0165299920785396 -0.0150102576251246 -11.3185299056116850 data> riDistCoef_tD_2> <Rotation_matrix type_id="opencv-matrix"> <rows>3 rows> <cols>3 cols> <dt>d dt> <data> 0.9995520693887151 1.2173722340566046e-003 0.0299028190239849 -9.9571078893194204e-004 0.9999719274362870 -7.4264998069014671e-003 -0.0299110203898538 7.3933986907815975e-003 0.9995252215502303 data> Rotation_matrix> <Transaction_matrix type_id="opencv-matrix"> <rows>3 rows> <cols>1 cols> <dt>d dt> <data> -62.4046095533341470 2.2541399055670328 4.0660224235033873 data> Transaction_matrix> <Foundation_matrix type_id="opencv-matrix"> <rows>3 rows> <cols>3 cols> <dt>d dt> <data> -1.8956412948785254e-006 -1.2111883584794274e-004 0.0495469807761968 6.5733933919231557e-005 1.3948680821461410e-005 0.8578014591819361 -0.0396473926165904 -0.8508164298132787 1. data> Foundation_matrix> <Rectif_LfCamMat type_id="opencv-matrix"> <rows>3 rows> <cols>4 cols> <dt>d dt> <data> 437.5624983240625700 0. 191.6575660705566400 0. 0. 437.5624983240625700 145.4007148742675800 0. 0. 0. 1. 0. data> Calib_LfCamMat> <Rectif_RiCamMat type_id="opencv-matrix"> <rows>3 rows> <cols>4 cols> <dt>d dt> <data> 437.5624983240625700 0. 205.8338241577148400 -2.7329986601713106e+004 0. 437.5624983240625700 145.4007148742675800 0. 0. 0. 1. 0. data> Calib_RiCamMat> <Q_matrix type_id="opencv-matrix"> <rows>4 rows> <cols>4 cols> <dt>d dt> <data> 1. 0. 0. -191.6575660705566400 0. 1. 0. -145.4007148742675800 0. 0. 0. 437.5624983240625700 0. 0. -0.0160103444140231 0.2269667744774826 data> Q_matrix>  opencv_storage>

你可能感兴趣的:(xml,image,存储,mfc,Parameters,Matrix)