在SFM的过程中,由于相机是没有进行标定的,因此我们通常通过图片的exif信息(一般相机拍出来的原始图像都会有这个信息)来读取相机的焦距信息。本文不讲述如何读取exif信息,只说明如何通过已得到的exif信息计算我们小孔成像模型的初始焦距。

如上图,在windows中右键图片查看属性就能看到这些信息,这些信息就记录在图片文件exif里,对于我们来说,有用的参数有两个,分别是焦距fFocalLength和35mm焦距f35mm,二者的单位都是毫米,在上图中分别等于4和26。接下来我们分别通过这两个参数来获取我们在投影模型中所指的焦距:
1.通过焦距fFocalLength

这是相机的小孔成像模型,上图中的物理成像平面就是真实相机中镜头后的感光元件,由CCD或CMOS组成,上图中的f就是exif文件中的焦距fFocalLength,我们不妨设这块感光元件的宽为w,高为h,单位为毫米。同时设水平方向wp个像素,垂直方向hp个像素。由于像素通常是正方形,所以有:
wpw=hph
假设三维空间中一点(X,Y,Z),投影到感光片上的一点(X′,Y′),这里感光片上的坐标单位为毫米。则由投影模型有:
X′=fZX
记对应像素坐标为(u,v),且像素坐标系原点和成像平面的原点重合,则有:
u=wwpX′=wwpfZXv=hhpY′=hhpfZY=wwpfZY
我们在投影模型中所说的焦距fx=fy=wwpf,wp是水平方向像素个数是已知的,f就是fFocalLength可以从exif中读取,唯一不知道的就是感光元件的宽度w。可惜的是exif中没有这个参数,只有去网上查对应相机型号参数才会有这个值,所以一般我们会将常用的相机型号参数存储在一个文件中备用,而图片的exif信息中是包括相机型号的,这样通过查找我们的备用文件中有没有对应的相机型号就可以找到该相机的w参数了。
2.通过等效35mm焦距f35mm
注:这一节的内容是自己结合mve代码理解的,不一定十分准确。
那么如果我们的备用文件里没有相应型号怎么办呢?这时就可以通过等效35mm焦距f35mm来近似求取fx了。下面介绍一下什么是等效35mm焦距:

这里的35mm是指感光元件的尺寸(使用感光元件对角线长度表示)。如上图我们认为感光元件A是35mm感光元件其尺寸为SA,对应焦距为fA(图中画作LA ),感光元件B是尺寸为SB,对应焦距为fB。由图可知虽然A与B的尺寸不同,焦距不同,但是其成像效果是一样的,且由相似有:
SAfA=SBfB
其中 fA就是35mm焦距f35mm是已知的,SA就等于35mm,由1中的内容知道,我们要求的是感光元件B的焦距与其宽度的比值,这里我们近似认为SB=w,样通过计算SAfA就可以近似求出wfB了,那么焦距fx=fy=wpwfB=wpSAfA。
参考:https://blog.csdn.net/brilliantyoho/article/details/17752031