了解PDAF,首先需要了解当今数码相机的工作原理,这里以单反为例进行介绍:
DSLR(digital single-lens reflex camera),数码单镜头反光相机,也就是我们常称的单反相机。属于数码静态相机(Digital Still Camera,DSC)与单反相机(SLR)的交集。
单反相机与其它数码相机的主要区别是反射设计方案。在单反相机中,光线穿过镜头,然后传到镜子,该镜交替将图像发送到取景器或图像传感器。DSLR相机使用光学取景器,通过透过视觉反射器观察被拍摄物体,用户可以更好地预测最终照片的成像效果。这种取景方式比其他类型的相机使用的电子取景器或屏幕取景器更加准确和可靠,通过使用一个镜头,DSLR 的取景器显示的图像与相机传感器捕获的图像没有显著差异。光学取景器的使用也意味着用户可以通过镜头看到物体的真实大小和形状,从而更容易地调整拍摄位置和角度。其内部结构如下图所示:

摄影师可以在拍摄图像前通过镜子看到被摄体。 拍摄图像时,反射镜会向上摆动,光线会转到感光元件。各部分分别为:
传统结构上,单反相机上有一小块磨砂玻璃(现在一般使用光学塑料)5,叫对焦屏。它位于单反相机的反光镜上方,显示焦平面的图像,是单反类型照相机的独有零件。
对焦屏在光路中截断了光线,因为反射和散射减少了亮度,但它存在的意义主要不是取景,而是对焦。在与光电传感器近似等距离的位置,磨砂屏上的成像与传感器上的成像基本一致。包括画面构图、焦点、景深等,如果没有这个对焦屏,取景窗内仍然可以看到镜头传送的画面,而由于人眼的自动对焦,使画面始终清晰,无法判断照相机感光传感器的清晰程度。
磨砂屏会起到这个效果,是因为浴帘效应。大众经常听到的“浴帘效应”是物理学上的,浴室里淋浴时,悬挂的浴帘总会向内卷起,甚至贴到人身上。在光学上还有另外一个“浴帘效应”。
学术上会有很复杂的研究,简而言之,就是**磨砂幕越靠近物体,透光越明显。**这才是磨砂屏本身的成像原理。
在对焦屏这个位置上对焦,对于没有自动对焦的传统单反具有重要的意义,因此厂商开发了磨砂屏、精细磨砂屏、微棱屏、裂像屏、双裂像屏,还有磨砂、微棱、裂像复合屏等。更有复合了菲涅耳透镜的对焦屏。成为单反相机独有而不可或缺的组成部分。
另外,随着时代发展,现在无反相机也逐渐占据了一席之地,可以更换镜头的无反相机就是我们常叫的微单相机。单反相机和无反相机的区别在于机身构造和大小,无反相机取消了反光镜和光学取景器,采用电子取景器,机身更轻便紧凑,更适合爱好者和旅行摄影师。除此之外,在感光元件规格相近、镜头素质相当的情况下,无反相机和单反相机在画质表现方面并没有显著差别。
说到自动对焦,首先需要介绍的是经典的反差检测自动对焦,也叫对比度检测自动对焦,英文Contrast Detection Auto Focus。因为对比度对视觉效果非常关键,反差对焦被广泛应用于传统的摄像系统中。它通过对比镜头传感器传来的对比度反差来进行对焦。
我们知道,一般来说,对比度越大,图像越清晰醒目,色彩也越鲜明艳丽。当镜头逐渐合焦时,传感器得到的相邻像素间的对比度会越来越高,图像也就会越来越清晰。所以当我们找到整个图片对比度最高的时候,镜头所处的位置也就找到了准确的对焦点。这一过程如下图所示:

在对焦调节范围内,每一个调焦位置都会对应一个锐度值,也就是聚焦值。这些聚焦值形成一曲线,通常称为聚焦曲线。锐度值通过锐度评价函数计算获得,锐度评价函数有时也称为聚焦函数。一个良好的锐度评价函数对应的聚焦曲线应该是一个如图所示的单峰曲线,并且曲线峰值对应的调焦位置即为准确聚焦的位置。

CDAF的流程如下图所示。当CDAF触发后,系统对当前的实际图像进行聚焦值计算,并结合前面的聚焦值数据综合判别当前聚焦值是否是聚焦曲线峰值。如果判定是聚焦峰值,则聚焦结束;否则,结合相关信息确定下一步调焦的移动方向和大小,驱动调焦步进电动机作相应的移动,对新的图像再次进行同样的步骤以此形成一个反馈控制环路。由此可见,对比度检测聚焦的关键因素有两点:① 锐度评价函数:② 峰值判定和搜索策略

相位检测自动对焦,英文Phase Detection Auto Focus。该系统的工作原理与测距仪相机类似。从副镜反射回来的光被2个或多个上面带有微透镜的小型图像传感器(取决于自动对焦系统有多少个焦点)接收。如上图7所示,对于每个焦点,有两个位于两侧的相位差传感器,两个单独的光束经过反射到达两个单独的传感器。
事实上,现代相位检测设备上的传感器数量远不止两个,而且这些传感器彼此非常靠近。**当光线到达这两个传感器时,如果物体处于对焦状态,则来自镜头最两侧的光线会聚在每个传感器的中心(就像它们在图像传感器上一样)。 ** 两个传感器上都会有相同的图像,表明该物体确实处于完美对焦状态。如果物体没有聚焦,光线将不再会聚,并且会照射到传感器的不同侧面,如下图所示(图片由维基百科提供):

图 1 至 4 表示镜头聚焦的情况分别为: (1) 太近,(2) 正确,(3) 太远,(4) 太远。从图中可以看出,两个曲线之间的相位差不仅可以用来确定在焦平面的哪个方向上,还可以用来确定改变焦点的程度,以实现最佳聚焦。但有一点需要注意,这只是检测传感器,实际上最终移动对焦的是镜头而不是传感器。
下面图片也显示了相位差产生过程:(a)现实世界中的一个物体;(b)配置了适当遮罩的左侧(上)和右侧(下)的相位传感器;©获取到的左侧(上)和右侧(下)相位图像。

由于PDAF系统知道一个物体是前聚焦还是后聚焦,它可以向相机镜头发送准确的运动指令,说明以何种方式转动焦点以及转动多少。以下是当相机获得对主体进行对焦(闭环自动对焦操作)的命令时会发生的情况:
因为这一切都在很短的时间内发生,所以这就是PDAF比CDAF快得多的原因(CDAF由于依赖来回改变焦点直到达到焦点,需要基于大量图像数据进行分析)。
目前比较流行的是片上相差自动对焦(on chip phase detection autofocus),在生产sensor的时候,把某些用于相位检测像素遮住左边一半或者右边一半,如下图:

上图只是示意图,各个厂商的半掩模的工艺各有不同,在对IR filter或者microlens的处理上也不相同,但是基本的原理都是让图像形成左右两幅类似人眼的不同光学通路的图像。这样左右侧的相位检测像素就会产生这样的图像:

目前PDAF的生产处理方式主要有三种,分别是:

shield pixel
屏蔽掉像素一般的感光区域(黑色部分),只获得一半信号。需要另外的像素屏蔽掉另一半信号,得到完整的相位差信息。SP越多,对焦越快,但信号损失越严重,目前SP密度控制在1%~3%。
super PD
将相邻的像素共用一个on chip microlens得到相位差信息,一般在Green上处理。同样的,二合一的PD越多,对焦越快,但信号损失越严重,目前密度也控制在1%~3%
dual PD
将同一个像素底部的感光区域(即光电二极管)一分为二,在同一个像素内即可完成相位信 息捕获。dual PD 也有叫 2PD、全像素双核对焦,这种像素覆盖率100%,所以对焦体验最佳。但由于将光电二极管一分为二,井口变小,FWC急剧衰减,dynamic range衰减严重,拍照非常容易过曝。
下面以SP为例再实际解释一下。(图一)为Sony感光元件有放置对焦使用像素示意图,CMOS感光元件的相位像素会接收到左右不同的光波信息,进而判断出远近距离产生相位差,Sony感光元件上的"对焦点区域"设计一排专用的对焦像素。像素是由L、R两组像素交错排列组成的。如果单看L和单看R,可以将这条对焦像素视为两条独立的感应器,L和R接收同来自一光源的光。

Sony的做法是在对焦用像素上设计两层交错的光罩遮光(图二、三),让所有L像素只能接收到来自左边的光,R像素只能接收到右边的光。这样一来,L和R两组对焦像素就能接收同一光源不同方向的光。
如(图二)黄色光线所示,光罩遮住一半的入射光源,造成此相位像素仅能接收到左半边的光源信息。(图三)黄色光线因光罩遮住一半的入射光源,造成此相位像素仅能接收到右半边的光源信息。


因此,CMOS将两个感应器的信号进行比较,这两个成像间的距离就是所谓的“相位差”。既然“相位差”与“光源和焦点的距离”有这层关系,便可参考当前的相位差来驱动对焦马达,使得对焦可以快速完成。


相信大家一定听说过,在工业建筑和测绘领域,工人们都会使用激光技术来确定高度或水平距离。LGG3首次将该技术应用在了手机对焦上,随后2015年,魅族将这项技术应用在了自家MX5上,使之成为了国内第一款应用激光辅助对焦的机型。
魅族MX5的激光对焦原理是:通过背面的微型发射器可以发射出低强度脉冲激光,然后通过相机左侧的红外传感器将反弹折射回来的信号进行回收,从而实现对焦的目的。
每个红外脉冲光束经过电子测量器多次反复计算反射时间,从而建立一个精确的范围。ISP 接收器可以计算出具体的物体或场景究竟有多远,同时锁定在最适合的焦点景深。而这一切看起来虽然复杂,但是实际上只发生在几分之一秒内,几乎感觉不到过程。根据魅族官方表示,MX5的对焦时间只有 0.2 秒左右。
在最后说这项技术,是因为整个红外对焦技术只被联想的VIBE SHOT实际应用了,但是因为这项技术可实用型不高,并且故障频出,所以几乎没有厂商愿意跟进,最后只能放弃。基本上,Vibe Shot 的红外自动对焦可以说是魅族MX5激光对焦的另外一个版本,但这项技术让 Vibe Shot比普通的自动对焦技术快上2 倍。
目前,PDAF主要应用于高端数码相机和智能手机上。它通过将像素分为左、右两组,接收不同方向的光线信息,并通过比较两个成像之间的相位差来确定焦点位置。PDAF的优点是快速对焦、适用于低光环境,但它需要特殊的硬件支持,且对镜头质量和设计有一定要求。
CDAF则主要应用于入门级数码相机和相机模块化智能手机上。它通过计算成像中相邻像素之间的对比度来确定焦点位置。CDAF的优点是适用于各种类型的镜头和成像情况,但它对光线和对比度的要求比较高,且在低光环境下对焦速度较慢。
事实上,除了前面的提到的一些对焦技术外,部分厂商将这些对焦技术混合在一起,取长补短。在这些厂商中,我觉得做的最好的应该是PRO6 Pus。这台机子将PDAF对焦、激光辅助对焦和反差对焦混合在一起,大大提高了不同场景的对焦成功率,也同时增强了相机成片的观感。
[1]: Digital single-lens reflex camera
[2]: 单反、无反、微单 相机的选择?
[3]: 反光镜和对焦屏(单反屏幕对焦)
[4]: How Phase Detection Autofocus Works
[5]: 片上相差式自动对焦原理
[6]: 摄像头模组 PDAF对焦(Phase Detection Auto Focus)
[7]: 相位對焦(Phase Detection) 資料整理
[8]: 《计算摄影学基础》
[10]: PDAF 相位对焦
[11]: 手机拍照知识科普:PDAF对焦与激光对焦的区别
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_
我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3