博客园排版系统真的比较挫,可以访问我的github.io阅读

关于Unit的概念

在pmvs的源代码中,有一个函数是getUnit ,其函数如下(在PMVS2的windows版本代码,optim.cc文件,1184行):

float Coptim::getUnit(const int index, const Vec4f& coord) const {
const float fz = norm(coord - m_fm.m_pss.m_photos[index].m_center);
const float ftmp = m_ipscales[index];
if (ftmp == 0.0)
return 1.0; return 2.0 * fz * (0x0001 << m_fm.m_level) / ftmp;
}

其中index是图像编号,coord是三维射影空间下的坐标。

这个函数在pmvs代码中几乎所有的和空间几何计算相关的函数中均被调用,最开始看代码时我并没有特别注意,但是随着代码阅读的深入,发现如果不将该函数读懂,就完全无法理解pmvs中所有的几何计算函数究竟是在做什么,于是今天花时间特意钻研了下,把该函数的含义表达清楚。

先说结论:该函数是计算将图片上的一个像素反投影到空间的一个指定的面片(patch)上得到的正方形的大小(以世界坐标系中的距离为量度),这个面片满足如下条件——面片的中心位于coord, 面片的法线与相片的法线平行但方向相反(也就是论文中初始化patch时的法线计算方法)。

这个结论看起来非常复杂,简单说就是如果我在空间的某个坐标处想要画一个正方形,使得该正方形投影到对应的与该正方形平行的相片上的大小恰好是1×1像素大小,那么这个正方形的边长在世界坐标系中的表达究竟是多少。这个函数就是来求解这个边长的。

这样的话这个函数作用其实就相当大了,他直接沟通了像素坐标和空间坐标的比例关系,可以粗略的比较相片对于场景的缩放,简化很多投影和反投影计算。而这个函数用到的计算方法其实也非常简单。就是简单的相似三角形关系,具体解释如下

小孔成像相机的几何关系如下图所示(摘自《 Multiple View Geometry in Computer Vision 》)

从该成像原理上我们可以看出,空间中一个长度为\(D\) 的物体投影到图像上长度\(l\)满足如下关系:

\[\frac{D}{l} = \frac{Z_0}{f}
\]

其中\(f\) 为焦距,\(Z_0\) 为物体到摄影中心的距离。

由上式可以得到:

\[D = \frac{l}{f}Z_0
\]

这样我们已知\(l\) 为1个像素长度,\(Z_0\) 可以直接由coord到相片的摄影中心直接计算得到。那么只要我们知道以像素为单位的\(f\)的数值,就可以直接得到\(D\)。幸运的是,根据一般CCD相机内参数矩阵中各变量的定义:

\[K=\begin{bmatrix}
a_x & s & x_0 \\
0 & a_y & y_0 \\
0 & 0 & 1
\end{bmatrix}
\]

其中\(a_x\)和 \(a_y\)分别是相机在x和y方向上的焦距,且以像素为量纲。另外一般情况下,CCD相机在x和y方向上的比例因此近似相等,即\(a_x \approx a_y\),这样我们可以用下式来近似计算\(f\)

\[f = \frac{a_x + a_y}{2}
\]

综上可得:

\[D=\frac{2}{a_x + a_y} Z_0
\]

这就是pmvs中getUnit的计算方法, 特别解释下,代码中m_ipscales[index]就是提前计算好的\(a_x+a_y\)的数值,而(0x0001 << m_fm.m_level)则是一个比例因子,可以让程序将图像缩放到一半或者四分之一大小进行计算。

PMVS论文随笔(1)的更多相关文章

  1. 多目标跟踪(MOT)论文随笔-POI: Multiple Object Tracking with High Performance Detection and Appearance Feature

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,最大的特点是使用 ...

  2. 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING WITH A DEEP ASSOCIATION METRIC (Deep SORT)

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,在SORT的基础 ...

  3. 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING (SORT)

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是使用 tracking by detection 方法进行多目标跟踪的文章,是后续de ...

  4. 基于ASP.NET的高校辅导员工作管理系统的设计与实现--论文随笔(四)

    一.基本信息 标题:基于ASP.NET的高校辅导员工作管理系统的设计与实现 时间:2017 出版源:南通理工学院 关键词:ASP.NET; SQL Server; 高校; 管理系统; 辅导员; 二.研 ...

  5. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

  6. 随笔之Android平台上的进程调度探讨

    http://blog.csdn.net/innost/article/details/6940136 随笔之Android平台上的进程调度探讨 一由来 最近在翻阅MediaProvider的时候,突 ...

  7. RDMA调研报告&一点随笔

    计算所科研实践随笔 被淹没在论文海里的两个星期. 早上7:10分起床,草草洗漱,7:30出发,开始漫长的1小时通勤.从地铁站的安检口起,队便排的极长,让人看得头皮发麻.下到了轨道旁稍好,但每趟呼啸而来 ...

  8. 思科恶意加密TLS流检测论文记录——由于样本不均衡,其实做得并不好,神马99.9的准确率都是浮云啊,之所以思科使用DNS和http一个重要假设是DGA和HTTP C&C(正常http会有图片等)。一开始思科使用的逻辑回归,后面17年文章是随机森林。

    论文记录:Identifying Encrypted Malware Traffic with Contextual Flow Data from:https://songcoming.github. ...

  9. Towards Accurate Multi-person Pose Estimation in the Wild 论文阅读

    论文概况 论文名:Towards Accurate Multi-person Pose Estimation in the Wild 作者(第一作者)及单位:George Papandreou, 谷歌 ...

随机推荐

  1. linux C判断文件是否存在

    access函数 功能描述: 检查调用进程是否可以对指定的文件执行某种操作.   用法: #include <unistd.h> #include <fcntl.h> int ...

  2. 3d Max 2013安装失败怎样卸载3dsmax?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  3. Mac 系统变量

    vim .bash_profile ========================= MAVEN_HOME = < ... > export MAVEN_HOME =========== ...

  4. PlayMaker Int的两个数进行比较 Int Compare

    Integer 1 和 Integer 2 进行比较,Integer 1 和  Integer 2 相等的时候 执行 ChangeToGreen; Integer 1 比  Integer 2 大的时 ...

  5. Java基础03-类型转换

    1.自动转换 int->double char->String 例:double a=10; 2.强制类型转换 (类型名)表达式 注意:String不能强制转化为char public c ...

  6. python xml dom

    http://www.cnblogs.com/coser/archive/2012/01/10/2318298.html

  7. Kudu安装(官网推荐的步骤)(installing build Kudu from source)

    不多说,直接上干货! Kudu安装前的建议说明(博主推荐) 这是安装Kudu的另一种方法 Kudu安装(官网推荐的步骤)(installing Kudu using parcels or packag ...

  8. pat1068. Find More Coins (30)

    1068. Find More Coins (30) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva l ...

  9. pat1002. A+B for Polynomials (25)

    1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...

  10. Jetty数据同步使用

    1. Jetty简介 Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形 ...