计算机视觉
图像处理

OpenCV学习笔记(11)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"?>
<opencv_storage>
<num_frames>40num_frames>
<image_size>
  352 288image_size>
<lfCamMat_tM_1 type_id="opencv-matrix">
  <rows>3rows>
  <cols>3cols>
  <dt>ddt>
  <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>3rows>
  <cols>3cols>
  <dt>ddt>
  <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>1rows>
  <cols>5cols>
  <dt>ddt>
  <data>
    -0.2573650855216149 -1.8434093222735448 -3.0112808382708931e-003
    -6.4644827216197836e-003 6.8034878625006252data>lfDistCoef_tD_1>
<riDistCoef_tD_2 type_id="opencv-matrix">
  <rows>1rows>
  <cols>5cols>
  <dt>ddt>
  <data>
    -0.2243951326136464 0.3568495067121301 0.0165299920785396
    -0.0150102576251246 -11.3185299056116850data>riDistCoef_tD_2>
<Rotation_matrix type_id="opencv-matrix">
  <rows>3rows>
  <cols>3cols>
  <dt>ddt>
  <data>
    0.9995520693887151 1.2173722340566046e-003 0.0299028190239849
    -9.9571078893194204e-004 0.9999719274362870 -7.4264998069014671e-003
    -0.0299110203898538 7.3933986907815975e-003 0.9995252215502303data>Rotation_matrix>
<Transaction_matrix type_id="opencv-matrix">
  <rows>3rows>
  <cols>1cols>
  <dt>ddt>
  <data>
    -62.4046095533341470 2.2541399055670328 4.0660224235033873data>Transaction_matrix>
<Foundation_matrix type_id="opencv-matrix">
  <rows>3rows>
  <cols>3cols>
  <dt>ddt>
  <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>3rows>
  <cols>4cols>
  <dt>ddt>
  <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>3rows>
  <cols>4cols>
  <dt>ddt>
  <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>4rows>
  <cols>4cols>
  <dt>ddt>
  <data>
    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>

转载注明来源:CV视觉网 » OpenCV学习笔记(11)OpenCV+MFC的双目视觉测距与景深实现

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 6超赞 0无聊 0扯淡 0不解 0路过

评论 6

评论前必须登录!

 

  1. #1

    不错哦

    涛琪儿3年前 (2016-05-22)