双目视觉测量中视差图与深度信息的应用

学习笔记:

经过一段时间双目视觉的学习,做到stereo_match,达到较好双目极线矫正的效果,其中RMS=0.21,得到视差图与pointcloud.txt文件,但不知道txt文件的含义,用matlab处理后得到锥形三维图像。

双目视觉测量中视差图与深度信息的应用

双目视觉测量中视差图与深度信息的应用

明显不是物体正常的三维世界坐标,但问题只有reprojectimageTo3D()这一个函数控制从视差图到三维世界坐标的转换,因此学习该函数:

函数名称:reprojectImageTo3D

函数原型:void reprojectImageTo3D(InputArray disparity,OutputArray _3dImage,InputArray Q, bool handleMissingValues=false, int ddepth=-1 )

函数作用:根据一组差异图像构建3D空间

参数说明:disparity 视差图像。可以是8位无符号,16位有符号或者32位有符号的浮点图像。

               _3dImage 和视差图同样大小的3通道浮点图像。_3dImage (x,y)位置(也是视差图的(x,y))包含3D坐标点。

               Q  透视变换矩阵。 可以通过stereoRectify()获得。

               handleMissingValues  是否处理缺失值(即点差距不计算)。如果handleMissingValues​​=true,则具有最小视差对应的异常值(见StereoBM::operator符()),                否则,具有非常大的Z值​​(目前设置为10000)转化为三维点的像素。

               ddepth 可选的输出数组的深度。如果是-1,输出图像将有深度CV_32F。也可以设置ddepth的CV_16S,的CV_32S或CV_32F。

函数说明:函数变换一个单通道代表三维表面的三通道图像的视差图。也就是说,对于每个像素(的x,y)相应的disparity=disparity(的x,y),计算:

               双目视觉测量中视差图与深度信息的应用

总结:

若三维世界坐标中出现z值过大,考虑handlemissingvalues设置true or false问题,具体不详。

要求真实世界中两点之间的距离,应该考虑利用视差图,得到某两点之间的像素坐标对应的d--视差值,并结合重投影矩阵Q得到最终每点的三维世界坐标信息,进而利用三维空间两点间的距离公式求得两点距离。


后期难点:*)我不会的*

1、鼠标选取图片某点的像素坐标,要求:可多次选取;返回该点的像素坐标并完成计算三维世界坐标;

2、解决世界坐标问题,Z值过大且不符合实际的问题。