算法基本思想如下:

1)将每条直线的端点e1,e2,写成齐次坐标的形式e1=(x1_i,y1_i,w),e2=(x1_i,y1_i,w);则点的欧式坐标为(x1_i/w,y1_i/w),(x2_i/w,y2_i/w);常数w通常取1,当取0时,即代表该点处于无穷远处,这在欧式坐标里表示需要无穷远的符号。

2)将直线表示为其两个端点的叉乘的齐次坐标向量(说明白点就是,两个点齐次坐标的叉乘为过这两个点直线的齐次坐标方向向量),即一条直线可由两个点的叉乘表示。即直线

L1=(a_i,b_i,c_i)=e1 X e2;结果向量只是通过两个端点的平面直线的方程a_i x + b_i y + c_i = 0的参数

3)如果只有两条直线,L1和L2,两条直线的交点可由直线向量的叉乘表示,即V=L1 X L2

对V进行缩放,使最后一个坐标为1,即(Vx,Vy,1),Vx和Vy作为图像中的消失点。然而,最好将消失点保留为齐次坐标向量,因为消失点可能离图像很远,甚至在无穷远处(在这种情况下,V的第三个分量是0,当您尝试缩放时,会得到除以0的结果)。

4)但如果有n条直线求交点,L1,L2,...,Ln,按照下面的方法,您可以获得“最佳拟合”消失点。

4-1)形成3×3的“二阶矩”矩阵M为

[a_i*a_i        a_i*b_i        a_i*c_i]

M=sum   [a_i*b_i        b_i*b_i        c_i*b_i]

[a_i*c_i        b_i*c_i        c_i*c_i]

其中取i = 1到n的和。注意,M是对称矩阵。

4-2)对M矩阵进行特征值分解。使用雅可比方法执行M的特征分解。

4-3)与最小特征值相关联的特征向量是消失点的齐次坐标向量。

一个建议:如果你只是直接使用图像像素坐标,数值差异过大时,求解出来精度可能会很差。哈特利有一篇关于这个主题的好论文,题目类似“In defense of the Eight-point algorithm”如果你的线条在整个图像中展开,可以通过下面的操作得到他提到的那种条件良好的方法。

第一步:通过(-imageX/2,-imageY/2)进行平移,使(0,0)位于图像的中心[哈特利论文的方法会以线端点的质心为原点]。

第二步:缩放坐标,使所有像点齐次坐标的大小大致为1 [Hartley在他的论文中详细介绍了如何做到这一点]。我曾经通过设置常数w来近似地做到这一点,在这个算法的第一步中提到,它等于图像大小的一半(以像素为单位)。所以如果你有一个256x256的图像,那么你会有w = 128。如果图像的宽度和高度不一样,就取平均值什么的,然后除以二。

下面为代码实现:

Vec3d RobertColins(vector<Point2d> vecLinePoints,int cols,int rows)
{Vec3d vanishPoint;int size = vecLinePoints.size();//防止坐标点差异过大造成求解精度下降,进行偏移int offset = (cols + rows) / 4;//这里直线端点,以两个点为一组代表一条直线//因此size必为偶数//得出各条直线的方向向量vector <Vec3d> Lines;for (int i = 0; i < size/2; i++){Vec3d startPoint, endPoint;startPoint[0] = (vecLinePoints[2 * i].x-offset)/offset;startPoint[1] = (vecLinePoints[2 * i].y-offset)/offset;startPoint[2] = 1;endPoint[0] = (vecLinePoints[2 * i + 1].x - offset)/offset;endPoint[1] = (vecLinePoints[2 * i + 1].y - offset)/offset;endPoint[2] = 1;//两个点坐标向量的叉乘等于,过该两点的直线齐次坐标向量Lines.push_back(startPoint.cross(endPoint));}/*声明一个Mat M形成3×3的“二阶矩”矩阵M为[a_i*a_i        a_i*b_i        a_i*c_i]M = sum [a_i*b_i        b_i*b_i        c_i*b_i][a_i*c_i        b_i*c_i        c_i*c_i]其中取i = 1到n的和。注意,M是对称矩阵。*/Mat M = (Mat_<double>(3, 3)<<0,0,0,0,0,0,0,0,0);for (int i = 0; i < size / 2; i++){Mat tempM = (Mat_<double>(3, 3));tempM.at<double>(0, 0) = Lines[i][0] * Lines[i][0];tempM.at<double>(0, 1) = Lines[i][0] * Lines[i][1];tempM.at<double>(0, 2) = Lines[i][0] * Lines[i][2];tempM.at<double>(1, 0) = Lines[i][1] * Lines[i][0];tempM.at<double>(1, 1) = Lines[i][1] * Lines[i][1];tempM.at<double>(1, 2) = Lines[i][1] * Lines[i][2];tempM.at<double>(2, 0) = Lines[i][2] * Lines[i][0];tempM.at<double>(2, 1) = Lines[i][2] * Lines[i][1];tempM.at<double>(2, 2) = Lines[i][2] * Lines[i][2];M = M + tempM;}//对M矩阵进行特征值分解Mat eigenvector = (Mat_<double>(3, 3));Mat eigenvalue = (Mat_<double>(3, 1));eigen(M, eigenvalue, eigenvector);vanishPoint[0] = eigenvector.at<double>(0, 2)*(1 / (eigenvector.at<double>(0, 2))) + offset;vanishPoint[1] = eigenvector.at<double>(1, 2)*(1 / (eigenvector.at<double>(0, 2))) + offset;vanishPoint[2] = 1;return vanishPoint;
}

代码算出来的结果,好像还有点问题,后续接着测试,总体思路没有问题。

单视图几何Vanish Point(消失点/灭点)计算方法——Robert_T_Collins(罗伯特·柯林斯)算法相关推荐

  1. 影消点、影消线与相机内参、平面法向量的推导—单视图重构

    影消点计算算法如下: 单视图几何Vanish Point(消失点/灭点)计算方法--Robert_T_Collins(罗伯特·柯林斯)算法https://blog.csdn.net/beyond951 ...

  2. 鲁鹏老师三维重建课程之单视图重建

    配置Json环境        使用Jsoncpp包中的.cpp和 .h文件        解压上面下载的 Jsoncpp 文件,把 jsoncpp-src-0.5.0文件拷贝到工程目录下, 将 js ...

  3. 终于来了,国内首个三维重建系列视频课程,涉及SFM、多视图几何、结构光、单目深度估计等...

    三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取.预处理.点云配准与融合.生成物体表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型. 由于三维重建对图像.光学.成 ...

  4. 国内首个三维重建系列视频课程,涉及SFM、立体匹配、多视图几何、结构光、单目深度估计等...

    原文链接:国内首个三维重建系列视频课程,涉及SFM.立体匹配.多视图几何.结构光.单目深度估计等... 三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取.预处理.点云配准 ...

  5. 多视图几何总结——单应矩阵和基础矩阵的兼容关系

    多视图几何总结--单应矩阵和基础矩阵的兼容关系 多视图几何总结--单应矩阵和基础矩阵的兼容关系 (1)单应矩阵和基础矩阵的兼容性 (2)基础矩阵 -> 单应矩阵 (3)单应矩阵 -> 基础 ...

  6. 多视图几何总结——基础矩阵、本质矩阵和单应矩阵的求解过程

    多视图几何总结--基础矩阵.本质矩阵和单应矩阵的求解过程 多视图几何总结--基础矩阵.本质矩阵和单应矩阵的求解过程 1. 说明--其实求解过程大同小异 2. 单应矩阵求解过程 2.1 基于代数误差的线 ...

  7. 多视图几何总结——基础矩阵、本质矩阵和单应矩阵的自由度分析

    多视图几何总结--基础矩阵.本质矩阵和单应矩阵的自由度分析 多视图几何总结--基础矩阵.本质矩阵和单应矩阵的自由度分析 总结 基础矩阵自由度 (1)几何推导 (2)代数推导 (3)直观理解 本质矩阵自 ...

  8. 重磅!国内首个三维重建系列视频课程,涉及SFM、立体匹配、多视图几何、结构光、单目深度估计等(最新版)...

    写在前面 感谢大家的一路陪伴与支持,这里赠送一张「3D视觉从入门到精通」知识星球优惠券,有效期两天,有需要的可以使用. 三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取. ...

  9. Single View Metrology 单视图度量衡 复现

    本文作为课程作业记录,仅译出原文Single View Metrology中有关3D视觉理论的部分,而没有译出有关不确定性算法校准的部分. Abstract 本文描述如何通过只给出从图像确定的最小几何 ...

最新文章

  1. 安装Oracle Database 11g 找不到文件“WFMLRSVCApp.ear” .
  2. java打印 a b c,创建一个java程序,按顺序给出3个术语作为输入(a,b,c)打印它们的根...
  3. tableview 分组显示返回footerviewt和headerView的高度不能为0的问题
  4. JS-数据属性与访问器属性
  5. android 第三方登录界面,Android App集成第三方登录与换肤指南
  6. windows ad 域下配置L2TP ***服务器 企业防火墙端口配置
  7. JavaScript学习之Object(下)this
  8. 吃瓜笔记 | 旷视研究院:被遮挡人脸区域检测的技术细节(PPT+视频)
  9. js函数传参,如何在JavaScript函数中不传递先前参数的情况下传递第n个可选参数?
  10. linux java keytool_JDK自带的keytool证书工具详解
  11. ubuntu 查找opencv安装路径_ubuntu 查找opencv安装路径_Ubuntu安装opencv详细步骤
  12. @property的使用
  13. 交叉线 or 直通线 ?
  14. 阿里巴巴国际站九月大促直播准备工作及流程
  15. 动物识别系统代码python_人工智能-动物识别专家系统算法Python + Pyqt 实现
  16. 浅谈三极管、运放、MOS管驱动 的常见电路
  17. mysql 基础选择题_MySQL基础之练习题
  18. 父母英语不好,孩子照样行:在家四步轻松搞定英语启蒙 读后感
  19. 中国移动和中国联通无线上网和资费详细
  20. 2018/09/25渡课

热门文章

  1. 2021ccpc网络预选赛部分题解
  2. H266 ISP 帧内子划分
  3. GitCode上手使用体验
  4. 快速解决“多分类不平衡”问题
  5. Linux中断机制(二)
  6. RK3568J edp屏幕点亮 时序调试总结
  7. Composer的基本使用
  8. ps无法完成请求因为程序错误
  9. linux安装软件之./configure、make、make install 命令含义
  10. 计算机vb里代码里的双引号,在VB中使用字符串中的左双引号