双目视觉计算三维坐标

一、原理

双目视觉的基本原理,以及公式推导,我参考的b站上的视频,链接如下:

2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Q34y1n7ot/?p=2&spm_id_from=333.880.my_history.page.click&vd_source=3b6cdacf9e8cb3171856fe2c07acf498如果只学习双目视觉,建议阅读前五个视频。视频中有的翻译不太好,但是可以意会出来,哈哈哈~。视频中的讲解浅显易懂,但是我觉得有一处不对,下面写一份我的理解:

如上图所示, (xw,yw,zw)是世界坐标系,(xc,yc,zc)是相机坐标系,(ox,oy)是光心坐标,(u,v)是摄像机内部影像的坐标系。三个坐标系的方向可以随意决定,都可以通过旋转矩阵、平移矩阵进行转换。假设上图中三个坐标系之间相互平行!!!

P是三维空间中的任意一点,在摄像机坐标系下,P点的坐标为(xc,yc,zc),P在摄像机内部的影像坐标是(xi,yi),根据相似三角形原理可知:\frac{x_{i}}{f}=-\frac{x_{c}}{z_{c}}\frac{y_{i}}{f}=-\frac{y_{c}}{z_{c}}。我认为,视频中的推导是错误的,f表示焦距,一定是正值。等式左右两边少了一个正负号。从而可以推出(xi,yi),实现了3d坐标到2d坐标的转换。

以上计算的2d坐标,是以光心原点,经过平移转换,可以转化成(u,v)坐标系。

两个相机就可以确定三维坐标了,以下是原理图。(x,y,z)是在左相机参考系下的坐标,(b,0,0)是右相机在左相机参考系下的坐标。

双目相机可以推导出来2d坐标到3d的反向转换 :

以上公式计算出来的坐标,是以左相机为参考系的三维坐标。经过平移、旋转可以转化成世界坐标系下的坐标。

二、细节问题

  • 将相机三维坐标(xc,yc,zc)转化成世界坐标(xw,yw,zw)时,注意x轴y轴z轴的方向。相机的x轴坐标可能对应的是世界z轴坐标!!!可以通过旋转矩阵进行转化。
  • 上图中,摄像机内部的影像,与实际我们看到的图像,呈正反颠倒的关系!!!

三、实现步骤

智在飞翔综合赛中,双目视觉相机的参数如下:

  1. 计算左右照片中,圆环圆心的2d坐标(xl,yl)、(xr,yr)
  2. 将上述两个坐标转化成(u,v)坐标系。(ul,vl)=(xl,480-yl)、(ur,vr)=(xr,480-yr)。
  3. 通过上述公式,计算出左相机坐标系下的3d坐标(x,y,z)

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中,可以使用计算机视觉工具箱中的双目视觉函数来求解双目图像对应的三维坐标。 首先,需要使用`stereoParameters`函数对双目摄像机的内外参数进行标定,得到双目的内外参数集。 然后,使用`rectifyStereoImages`函数对左右眼图像进行校正,使其在同一平面上。 接下来,使用`disparity`函数计算视差图,该函数接受校正后的双目图像作为输入,计算左右眼图像中每个像素的视差值。 然后,使用`reconstructScene`函数,将视差图和`stereoParameters`作为输入,计算每个像素的三维坐标。 最后,可以使用`pcshow`函数将三维坐标可视化显示出来,以便观察结果。 以下是一个示例代码: ```matlab % 读取左右眼图像 leftImage = imread('left.png'); rightImage = imread('right.png'); % 标定双目摄像机,得到内外参数集 stereoParams = stereoParameters(calibrationData); % 对左右眼图像进行校正 [leftRectImage, rightRectImage] = rectifyStereoImages(leftImage, rightImage, stereoParams); % 计算视差图 disparityMap = disparity(rgb2gray(leftRectImage), rgb2gray(rightRectImage)); % 计算三维坐标 point3D = reconstructScene(disparityMap, stereoParams); % 可视化显示三维坐标 pcshow(point3D); ``` 上述代码中,`left.png`和`right.png`是左右眼图像的文件路径。`calibrationData`是标定得到的双目摄像机内外参数集。代码中使用`rgb2gray`将彩色图像转换为灰度图像,因为`disparity`函数需要输入灰度图像。 这段代码的作用是读取双目图像,根据内外参数集将图像进行校正,然后计算视差图和三维坐标,并将三维坐标可视化显示出来。你可以根据自己的双目图像和内外参数集进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值