今夜喜雨 | 直线线性三角化理论

雨夜,用了两个小时的时间终于推导了直线三角化的公式。直线三角化?  

是的,即通过两帧的匹配直线得到空间直线的端点,如果端点严格匹配那么就是点的三角化,你可以从《SLAM十四讲》一书或者其他的博客很容易知道怎么做。但是直线的端点往往不是严格对齐的,那么怎么办?  也不难办,只要你能明白下面两个铺垫。所涉基本理论这里我直接引用。

关于这个内容,在多视图几何一书中暂时没有找到,因此参考点的三角化理论(参见我的另一篇博客),本文对直线的线性三角化方法做了阐述。  


第一 特征点三角化 

来自: https://www.cnblogs.com/yepeichu/p/10792899.html


第二 直线参数化初认识之普吕克参数化 

这一部分关系不大,学习一下就好。 

作者:robot
链接:https://zhuanlan.zhihu.com/p/65674067
来源:知乎
 

图1 线特征的Plücker坐标 (a)Plücker线坐标系 (b)新观测到的线的初始化

 


第三  直线的线性三角化推导!

 

 

 


第四 如何写代码 

/**
 * @brief 给定投影矩阵P1,P2和图像上的点kp1,kp2,从而恢复3D坐标
 *
 * @param kp1 特征点, in reference frame
 * @param kp2 特征点, in current frame
 * @param P1  投影矩阵P1
 * @param P2  投影矩阵P2
 * @param x3D 三维点
 * @see       Multiple View Geometry in Computer Vision - 12.2 Linear triangulation methods p312
 */
void Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D)
{
    // 在DecomposeE函数和ReconstructH函数中对t有归一化
    // 这里三角化过程中恢复的3D点深度取决于 t 的尺度,
    // 但是这里恢复的3D点并没有决定单目整个SLAM过程的尺度
    // 因为CreateInitialMapMonocular函数对3D点深度会缩放,然后反过来对 t 有改变
 
    cv::Mat A(4,4,CV_32F);
 
    A.row(0) = kp1.pt.x*P1.row(2)-P1.row(0);
    A.row(1) = kp1.pt.y*P1.row(2)-P1.row(1);
    A.row(2) = kp2.pt.x*P2.row(2)-P2.row(0);
    A.row(3) = kp2.pt.y*P2.row(2)-P2.row(1);
 
    cv::Mat u,w,vt;
    cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);
    x3D = vt.row(3).t();
    x3D = x3D.rowRange(0,3)/x3D.at<float>(3);
}

照着上面改就行。

 


云山苍苍,江水泱泱。                                                                                                                                          2019.7.12  午夜

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值