从基线和单摄像机校准的2个图像进行3D重建

时间:2014-07-20 15:44:05

标签: c++ qt opencv stereo-3d 3d-reconstruction

我的学期项目是用一个很大的基线(~2米)来校准立体相机。 所以我的方法是在没有像棋盘那样精确定义的校准模式的情况下运行,因为它必须很大并且很难处理。

我的问题与此类似:3d reconstruction from 2 images without info about the camera

计划到现在:

  • 角点检测左图像goodFeaturesToTrack
  • 精致的角落cornerSubPix
  • 在右侧图片calcOpticalFlowPyrLK
  • 中查找角落位置
  • 计算基本矩阵F findFundamentalMat
  • 计算H1,H2精馏单应矩阵stereoRectifyUncalibrated
  • 整理图片warpPerspective
  • 计算视差图sgbm

到目前为止一切顺利,但如果我改变了角落的数量,整理过的图像会“跳跃”。

不知道这是不是因为没有已知的相机参数或没有镜头失真补偿(或者也发生在Tsukuba照片上)而形成不精确或错误我疯了 欢迎提出建议:)

但不是我的主要问题,现在我想重建3D点。

但是reprojectImageTo3D需要Q矩阵,到目前为止我还没有。所以我的问题是如何计算它?我有基线,两个相机之间的距离。我的感觉说,如果我将des disparity地图转换为3d点云,我唯一缺少的是规模对吗?所以,如果我设置在基线,我得到了3D重建吗?那怎么样? 我也计划补偿镜头失真作为每个相机与棋盘分开的第一步(一次小而靠近一个相机所以我不必在10-15米之外,在两个重叠区域都有一个大图案。 。)所以如果这有帮助我也可以使用相机参数..

除了http://docs.opencv.org之外还有文档吗?我可以看到并理解Q矩阵的计算方式和方法,或者我可以打开源代码(可能很难理解我^^)如果我在Qt中按F2我只看到带有传输参数类型的函数..(对不起,我真的很新了这一切)

http://i.stack.imgur.com/A1Wjc.jpg

  • left:输入找到的角落
  • top h1,h2:矫正图像(这个角落计数看起来很好^^)
  • SGBM:视差图

1 个答案:

答案 0 :(得分:0)

所以我发现Q矩阵约束在这里: Using OpenCV to generate 3d points (assuming frontal parallel configuration)

所有这些参数均由单摄像机校准给出: c_x,c_y,f

基线是我测量的: T_x

所以这个现在有效,只有单位对我来说不是那么清楚,我用它们形成单个相机校准,它们在px中并以米为单位设置基线,将视差图除以16,但它接缝不是正确的规模..

顺便说一下上面的差异图是错误的^^现在它看起来更好。你必须做一个反剪切变换因为stereoRectifyUncalibrated是剪切你的图像(没有记录?)。 本文在Charles Loop Zhengyou Zhang的“7 Shearing Transform”中描述: http://research.microsoft.com/en-us/um/people/Zhang/Papers/TR99-21.pdf

结果: http://i.stack.imgur.com/UkuJi.jpg