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

如上图,在windows中右键图片查看属性就能看到这些信息,这些信息就记录在图片文件exif里,对于我们来说,有用的参数有两个,分别是焦距 f F o c a l L e n g t h f_{FocalLength} fFocalLength​和35mm焦距 f 35 m m f_{35mm} f35mm​,二者的单位都是毫米,在上图中分别等于4和26。接下来我们分别通过这两个参数来获取我们在投影模型中所指的焦距:

1.通过焦距 f F o c a l L e n g t h f_{FocalLength} fFocalLength​

 这是相机的小孔成像模型,上图中的物理成像平面就是真实相机中镜头后的感光元件,由CCD或CMOS组成,上图中的 f f f就是exif文件中的焦距 f F o c a l L e n g t h f_{FocalLength} fFocalLength​,我们不妨设这块感光元件的宽为 w w w,高为 h h h,单位为毫米。同时设水平方向 w p w_p wp​个像素,垂直方向 h p h_p hp​个像素。由于像素通常是正方形,所以有:
w w p = h h p \displaystyle\frac{w}{w_p}=\frac{h}{h_p} wp​w​=hp​h​
假设三维空间中一点 ( X , Y , Z ) (X,Y,Z) (X,Y,Z),投影到感光片上的一点 ( X ′ , Y ′ ) (X',Y') (X′,Y′),这里感光片上的坐标单位为毫米。则由投影模型有:
X ′ = f X Z X'=f\displaystyle\frac{X}{Z} X′=fZX​
记对应像素坐标为 ( u , v ) (u,v) (u,v),且像素坐标系原点和成像平面的原点重合,则有:
u = w p w X ′ = w p w f X Z v = h p h Y ′ = h p h f Y Z = w p w f Y Z u=\displaystyle\frac{w_p}{w}X'=\displaystyle\frac{w_p}{w}f\displaystyle\frac{X}{Z}\\ v=\displaystyle\frac{h_p}{h}Y'=\displaystyle\frac{h_p}{h}f\displaystyle\frac{Y}{Z}=\displaystyle\frac{w_p}{w}f\displaystyle\frac{Y}{Z} u=wwp​​X′=wwp​​fZX​v=hhp​​Y′=hhp​​fZY​=wwp​​fZY​
我们在投影模型中所说的焦距 f x = f y = w p w f f_x=f_y=\displaystyle\frac{w_p}{w}f fx​=fy​=wwp​​f, w p w_p wp​是水平方向像素个数是已知的, f f f就是 f F o c a l L e n g t h f_{FocalLength} fFocalLength​可以从exif中读取,唯一不知道的就是感光元件的宽度 w w w。可惜的是exif中没有这个参数,只有去网上查对应相机型号参数才会有这个值,所以一般我们会将常用的相机型号参数存储在一个文件中备用,而图片的exif信息中是包括相机型号的,这样通过查找我们的备用文件中有没有对应的相机型号就可以找到该相机的 w w w参数了。

2.通过等效35mm焦距 f 35 m m f_{35mm} f35mm​

注:这一节的内容是自己结合mve代码理解的,不一定十分准确。

 那么如果我们的备用文件里没有相应型号怎么办呢?这时就可以通过等效35mm焦距 f 35 m m f_{35mm} f35mm​来近似求取 f x f_x fx​了。下面介绍一下什么是等效35mm焦距:

这里的35mm是指感光元件的尺寸(使用感光元件对角线长度表示)。如上图我们认为感光元件A是35mm感光元件其尺寸为 S A S_A SA​,对应焦距为 f A f_A fA​(图中画作 L A L_A LA​ ),感光元件B是尺寸为 S B S_B SB​,对应焦距为 f B f_B fB​。由图可知虽然A与B的尺寸不同,焦距不同,但是其成像效果是一样的,且由相似有:
f A S A = f B S B \displaystyle\frac{f_A}{S_A}=\displaystyle\frac{f_B}{S_B} SA​fA​​=SB​fB​​
其中 f A f_A fA​就是35mm焦距 f 35 m m f_{35mm} f35mm​是已知的, S A S_A SA​就等于35mm,由1中的内容知道,我们要求的是感光元件B的焦距与其宽度的比值,这里我们近似认为 S B = w S_B=w SB​=w,样通过计算 f A S A \displaystyle\frac{f_A}{S_A} SA​fA​​就可以近似求出 f B w \displaystyle\frac{f_B}{w} wfB​​了,那么焦距 f x = f y = w p f B w = w p f A S A f_x=f_y=w_p\displaystyle\frac{f_B}{w}=w_p\displaystyle\frac{f_A}{S_A} fx​=fy​=wp​wfB​​=wp​SA​fA​​。

参考:https://blog.csdn.net/brilliantyoho/article/details/17752031

SFM之通过exif获取初始焦距相关推荐

  1. html5图exif,获取图片详细信息(exif)

    可获得如下信息(下面只是一个例子) 软件:ILCE-6000 v3.20 相机存档时间:2018-06-20 09:03:37 最后修改时间:2018-06-20 09:03:37 拍摄日期:2018 ...

  2. android获取摄像头焦距,并调焦

    不废话,上代码 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayo ...

  3. exif.js html图片旋转,exif获取图片旋转角度

    任何旋转,都可以用一个旋转轴 ω CGAffineTransform _trans = sticker.transform; CGFloat rotate = acosf(_trans.a);... ...

  4. 【构建ML驱动的应用程序】第 4 章 :获取初始数据集

  5. JS获取图片的EXIF信息+纠正图片方向

    前端图片处理碰到的一个离奇 bug , 关于图片的 EXIF 信息,特地记录下来 . 然后使用一下代码可以获取Orientation信息,并纠正Orientation带来的图片旋转问题 // from ...

  6. mysql5.7.16安装 初始密码获取及密码重置

    在window7下面安装mysql5.7.16,出现一个问题,在初始化时,默认生成了一个密码,导致连接不了数据库.而在5.7以前,默认密码是空的,可以不用密码即可进入数据库.5.7之后的就遇到坑了,下 ...

  7. mysql初始密码的获取以及修改超级用户密码的方法

    新安装的mysql5.7.*启动后进入数据库需要初始密码,获取初始密码的方法: #grep 'temporary password' /var/log/mysqld.log | awk '{print ...

  8. sfm三维重建源码_OpenMVG源码阅读小记

    "读一份好源码,就是和许多智慧的人谈话". 本文记录了笔者学习 openMVG 开源软件的一些初步经验和心得.如果你对计算机视觉和摄影测量有兴趣,需要用到相关技术,这篇文章正好就是 ...

  9. android焦距跟实际距离,手机等效焦距一算便知_nubia Z5S Mini_手机Android频道-中关村在线...

    手机等效焦距一算便知 看到这里相信对大家来说计算手机感光元件的尺寸就不算是难题,以笔者所使用的nubia Z5S mini为例.nubia Z5S mini内置的是索尼IMX135感光元件,尺寸为1/ ...

最新文章

  1. Linux内核学习总结
  2. 关于android中postDelayed方法的讲解
  3. dwmac ethernet driver(stmmac)
  4. ssl1007 and ssl -最大乘积 and 加法最大【区间dp练习】
  5. 赫胥黎的焦虑与美丽新世界
  6. 算法练习一:求最小公倍数
  7. Android+微信 弹出层无法滚动?
  8. cmd运行python脚本处理其他文件_如何在cmd命令行里运行python脚本
  9. Python之队列queue模块使用 常见问题与用法
  10. 深入浅出MFC 书中源码Frame1(C++11)
  11. Android 静默安装的几种方式
  12. Ubuntu常用软件合集
  13. C# 微信支付请求分账
  14. 解决idea百度翻译无法使用的问题
  15. CTO说出了我的成长慢的原因,价值10万:“在VUCA时代,必须掌握的12种永久技能。”...
  16. python1加到100_python for循环1加到100的和
  17. Ubuntu Server 安装Nginx 实例
  18. One-Error多标签分类_多分类及多标签分类算法
  19. conda create出现连接问题_处理conda安装工具的动态库缺失问题
  20. vs2019创建EF的时候 系统找不到指定的路径

热门文章

  1. NodeMCU文档中文翻译 7 DHT温湿度传感器模块
  2. 前身北京计算机学院,这5所“低调到隐形”的211大学,不仅分数低,还好考
  3. 跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)
  4. Android4.4 Telephony流程分析——去电(MO)流程
  5. 高铁5G NR参数配置方法
  6. 暴力破解及端口扫描详解
  7. java put方法是什么意思_java-HashMap put方法的说明
  8. java sanmu_Openfire支持视频了
  9. OSI七层协议和TCP/IP四层协议比较
  10. No message found under code 'first' for locale 'zh_CN'.