基于opencv下的双目视觉三维重建与重投影残差计算

一、重投影残差

1.1基本概念

重投影残差,按照字面意思解释就是在第二次重新投影的二维像素点与第一次投影得到的像素点之间的残差(欧式距离)大小,残差的大小反映的就是测量仪器的精度以及外界因素对测量结果的干扰,即测量误差的大小。

如下图所示:

假设P是世界坐标系中的一个三维点(真实物点),第一次投影指的就是双目相机C1、C2拍摄时,P点投影到二维像平面上所捕获到的图像点,即图中的P1和P2点;然后利用双目视觉原理,针对P1、P2这对匹配点以及标定求出的内外、畸变参数等等,可以求出一个三维点(理论值);然后利用求出来的三维点与相机的位姿关系进行第二次投影得到P’2点;一般用重投影点P’2与获取的二维像点P2的欧式距离e值的大小反映的就是重投影误差的大小。
在这里插入图片描述

二、关键坐标系之间的转换

2.1 像素坐标系与图像坐标系

在这里插入图片描述
(u , v)表示的是像素坐标,单位Pixel;
(x , y)表示的是图像坐标,单位mm;
(u0 , v0)表示的是光心位置,有时候表示为(Cx,Cy);
dx , dy分别表示的是每个像素在横纵坐标的实际物理尺寸,单位mm;

2.2 图像坐标系与相机坐标系

在这里插入图片描述
在这里插入图片描述
以上公式最后的f,根据标定数据,在x和y方向分别以fx和fy代入,注意这里的fx和fy表示的是实际物理长度,单位mm,转换过程(三维坐标->像素坐标)如下图所示,不过有的情况标定得到得是实际长度(mm),则最后得fx和fy还需要除去dx、dy:
在这里插入图片描述

2.3 统一坐标重投影计算

如果世界坐标系与相机坐标系不统一的话,在进行透视投影之前需要把世界坐标系下的三维点云通过外方位参数[R|T]统一到相机坐标系下,在转换为像平面像素坐标,具体公式如下:
在这里插入图片描述
在这里插入图片描述
拆分:
在这里插入图片描述
R、t:世界坐标系相对于相机坐标系的外方位参数;
(X,Y,Z):世界坐标系下的坐标;
(x,y,z):转换的相机坐标系下的坐标;
(u,v):像素坐标。

2.4 残差计算

(u1,v1)记为获取的二维图像的匹配点,通过畸变矫正(undistortPoints())之后的结果,还要进行立体矫正(stereoRectify())
结果记为(x,y)(图像坐标),设(u,v)为矫正之后的像素坐标:
u = x/dx + Cx
v = y/dy + Cy
最后将得到的(u,v)和上式中的(u’,v’)做欧式计算,结果为残差值的大小

code: https://download.csdn.net/download/qq_39707351/11201279
Results:

在这里插入图片描述
按顺序依次为,三维点坐标,重投影像素坐标,匹配点像素坐标,残差大小(pixel)

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然可以!下面是一个基本的C++代码示例,演示了如何使用OpenCV进行基于双目视觉三维重建: ```cpp #include <iostream> #include <opencv2/opencv.hpp> int main() { // 打开左右相机图像 cv::Mat leftImage = cv::imread("left.png", cv::IMREAD_GRAYSCALE); cv::Mat rightImage = cv::imread("right.png", cv::IMREAD_GRAYSCALE); // 定义双目立体匹配的参数 int numDisparities = 16; // 视差范围 int blockSize = 15; // 匹配块的大小 // 创建立体匹配对象 cv::Ptr<cv::StereoBM> stereo = cv::StereoBM::create(numDisparities, blockSize); // 计算视差图 cv::Mat disparity; stereo->compute(leftImage, rightImage, disparity); // 根据视差图计算深度图 double baseline = 0.1; // 基线长度(单位:米) double focalLength = 500; // 焦距(单位:像素) cv::Mat depthMap = baseline * focalLength / disparity; // 显示深度图 cv::imshow("Depth Map", depthMap); cv::waitKey(0); return 0; } ``` 请确保在编译和运行之前,将左右相机图像的路径替换为实际图像的路径。此代码使用了OpenCV的`StereoBM`类进行立体匹配,并根据视差图计算深度图。深度图最终通过`imshow`函数显示出来。 请注意,这只是一个基本的示例代码,实际的双目视觉系统可能需要更复杂的处理步骤和参数调整。此外,还可以使用其他立体匹配算法,如`StereoSGBM`或`StereoVar`。希望这能对你有所帮助!如果你有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值