立体视觉入门指南(6):对级约束与Fusiello法极线校正

原理+代码实战 | 双目视觉中的极线校正

校正目的:对两幅图像的二维匹配搜索变成一维,节省计算量,排除虚假匹配点,成平行视图。

算法流程:

坐标系:平行视图的极点位于无穷远处,极线水平对准。

  • ​​​轴:与基线平行 。
  • 轴:与X轴正交。在Fusiello法中k为旧的Z轴所表示的单位向量。
  • 轴:
  • 则旋转矩阵:
  • 则左右两个图像新的旋转矩阵:  

  • 新的内参矩阵: ,且把倾斜因子设置为0。
  • 原始的相对位姿:          

  • 新的基线:
// compute relative pose of the given two cameras
template<typename TYPE>
inline void ComputeRelativeRotation(const TMatrix<TYPE,3,3>& Ri, const TMatrix<TYPE,3,3>& Rj, TMatrix<TYPE,3,3>& Rij) {Rij = Rj * Ri.t();
} // ComputeRelativeRotation
template<typename TYPE>
inline void ComputeRelativePose(const TMatrix<TYPE,3,3>& Ri, const TPoint3<TYPE>& Ci, const TMatrix<TYPE,3,3>& Rj, const TPoint3<TYPE>& Cj, TMatrix<TYPE,3,3>& Rij, TPoint3<TYPE>& Cij) {Rij = Rj * Ri.t();Cij = Ri * (Cj - Ci);
} // ComputeRelativePose
// see: "A compact algorithm for rectification of stereo pairs", A. Fusiello, E. Trucco, and A. Verri, 2000
// 极线校正
REAL Camera::StereoRectifyFusiello(const cv::Size& size1, const Camera& camera1, const cv::Size& size2, const Camera& camera2, Matrix3x3& R1, Matrix3x3& R2, Matrix3x3& K1, Matrix3x3& K2)
{// compute relative pose// 计算相对位姿RMatrix poseR;CMatrix poseC;ComputeRelativePose(camera1.R, camera1.C, camera2.R, camera2.C, poseR, poseC);// new x axis (baseline, from C1 to C2)// 新的x轴,基线方向const Point3 v1(camera2.C-camera1.C);// new y axes (orthogonal to old z and new x)// 新的y轴,垂直旧的Z轴(光轴)和新的X轴const Point3 v2(camera1.Direction().cross(v1));// new z axes (no choice, orthogonal to baseline and y)// 新的Z轴,垂直上面两个新轴const Point3 v3(v1.cross(v2));// new extrinsic (translation unchanged)// 新的外参,平移不变RMatrix R;R.SetFromRowVectors(normalized(v1), normalized(v2), normalized(v3));// new intrinsic (arbitrary)// 新的内参K1 = camera1.K; K1(0,1) = 0;K2 = camera2.K; K2(0,1) = 0;K1(1,1) = K2(1,1) = (camera1.K(1,1)+camera2.K(1,1))/2;// new rotations// 新的选择从校正前的相机坐标系转到校正后的相机坐标系R1 = R*camera1.R.t();R2 = R*camera2.R.t();#if 0// new projection matricesPMatrix P1, P2;AssembleProjectionMatrix(K1, R, camera1.C, P1);AssembleProjectionMatrix(K2, R, camera2.C, P2);// rectifying image transformation#if 0const Matrix3x3 H1((PMatrix::EMat(P1).leftCols<3>()*(PMatrix::EMat(camera1.P).leftCols<3>().inverse())).eval());const Matrix3x3 H2((PMatrix::EMat(P2).leftCols<3>()*(PMatrix::EMat(camera2.P).leftCols<3>().inverse())).eval());#elseconst Matrix3x3 H1(K1*R*camera1.R.t()*camera1.GetInvK());const Matrix3x3 H2(K2*R*camera2.R.t()*camera2.GetInvK());#endif#endif// 计算新的基线距离const Point3 t(R2 * (poseR*(-poseC)));ASSERT(ISEQUAL(-t.x, norm(v1)) && ISZERO(t.y) && ISZERO(t.z));return t.x;
} // StereoRectifyFusiello

openMVS:极线校正Fusiello相关推荐

  1. 立体视觉入门指南:对级约束与Fusiello法极线校正

    作者丨李迎松@知乎 来源丨https://zhuanlan.zhihu.com/p/466758105 编辑丨3D视觉工坊 亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知 ...

  2. 立体视觉入门指南(6):对级约束与Fusiello法极线校正

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  3. Fusiello极线校正方法的原理及C++实现

    在三维重建中,极线校正是很重要的一个环节,其作用就是把左右两个图像的进行变换,使其左右图像的极线左右平行.通俗一点说也就是,使左图像中某一行(或列)中的每一个点,都出现在右图像中对应的行(或列)中.这 ...

  4. 原理+代码实战 | 双目视觉中的极线校正

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 为什么要做极线校正? 三维重建是通过 ...

  5. 人工智能AI实战100讲(七)-原理+代码实战 | 双目视觉中的极线校正

    为什么要做极线校正? 三维重建是通过双目立体匹配实现的如图1,通过匹配空间中点在两个图像中的投影点,再根据三角关系得到P的Z值. 我们双目相机拍摄的时候实际情况下如下图a,两个图像做匹配时如我们图中蓝 ...

  6. 畸变校正与极线校正(具体原理+Matlab代码)

    附:相关需要的工具函数源代码(投影函数.校正矩阵计算等)见最下面 1. 畸变校正 1.1 形成原因 图像畸变一般有两种,第一种是透镜本身的形状有问题,使得图像发生径向畸变:第二种是透镜安装时与成像平面 ...

  7. Epipolar Recitification 极线校正/立体校正

    在进行极线搜索时,为了方便,将极点通过射影变换转至无穷远点,则图上的极线都变成了平行线,便于搜索 PAT: 只能在极点位于图像外时使用这种方法,极点在图像内时,极点周围的点也会被变换到无穷远处 变换矩 ...

  8. bouguet算法极线校正出现视野丢失问题(求解答)

    bouguet算法进行极线校正(校正后出现视野丢失) 求大佬解答!!!! 以下是代码,相机参数如下: A1 = [4355.32892609972,0,0; 0,4354.46537146890,0; ...

  9. opencv-python立体匹配(极线校正)

    文章目录 前言 一.立体校正是什么? 二.校准步骤 1.照片准备 2.立体匹配 总结 前言   对照片进行光学畸变矫正后,因为是在研究双目视觉,所以就要进行立体矫正了. 一.立体校正是什么?   标定 ...

最新文章

  1. 推荐8个高质量的小众APP,功能真的惊艳到我了!
  2. codeforces 229C
  3. 【python图像处理】两幅图像的合成一幅图像(blending two images)
  4. linux怎么创建vi脚本,Vim 创建Python脚本时候自动补全解释器和编码方法
  5. mysql binlog2sql_mysql闪回工具binlog2sql安装配置教程详解
  6. Educational Codeforces Round 40 (Rated for Div. 2)
  7. 读书二十二载,信念很简单,把书念下去,然后走出去,不枉活一世。
  8. Swap Letters CodeForces - 1215C(贪心)
  9. DirectX SDK 重大版本变化记录[转]
  10. linux lvs 存储层,LVS集群配置之LVS介绍
  11. servlet学习笔记_2
  12. Chrome中播放时视频编码为.h264和音频编码为acc,采样率为48000,双通道的视频文件时音画不同步
  13. Sobel 边缘检测
  14. 孩子沉迷游戏,家长该怎么办?
  15. bootstrap实现开关切换
  16. SpringMVC配置中遇到的惊(keng)喜
  17. 计算机应用技术题,计算机应用技术复习题.doc
  18. 循环调用scrapy框架出现的问题:twisted.internet.error.ReactorNotRestartable,解决方法
  19. openwrt 透明代理上网
  20. 实现多线程的方法有哪几种?

热门文章

  1. 阿克曼(Ackermann)函数—递归
  2. 软件通用自动更新系统
  3. OpenStack-Storage(6)
  4. Python学习:爬虫示例
  5. PearsonSpearmanKendall相关系数及Python实现
  6. Kendall秩相关系数
  7. [ios学习入门3]--oc中NS的含义
  8. 找一找mini usb 的AD封装
  9. html经典坦克大战,HTML+CSS+JQ试做经典坦克大战(二)
  10. 魅族怎样进入软件测试功能,魅族手机有这些隐藏功能你知道吗?