Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >相位偏折术原理概述

相位偏折术原理概述

作者头像
3D视觉工坊
发布于 2021-01-13 03:00:08
发布于 2021-01-13 03:00:08
1.2K0
举报

相位偏折术是一个比较冷门的方向,主要用于测量镜面物体。一直以来,干涉法都是测量镜面最佳方法,精度可以达到波长的几百分之一,但是有一些局限性:

  1. 测量自由面型的镜面物体时,干涉法所需要的光学补偿原件制作复杂且昂贵;
  2. 回程误差,干涉法很难快速标定;
  3. 测量环境苛刻,不适合干涉法测量,因为轻微抖动、温度变化,会给测量记过带来很大误差;

解决:PMD,相位偏折术,对环境不敏感,没有回程误差,因而标定相对简单,可以测量自由曲面。其实偏折术系统跟结构光系统是非常相似的,回顾下它的重建流程:

  1. 标定相机,以及屏幕、相机位置关系
  2. 使用屏幕投影条纹(结构光使用投影仪)
  3. 解码获取表面梯度(结构光直接获取高度)
  4. 梯度积分获取高度信息

额外说明的是,偏折术系统中常说的“精度”达到几纳米,不是传统意义上的“精度”,这是因为偏折术通常用来测量纯镜面反射的物体表面,比如说天文望远镜的镜面,它的模型假设中也假设参考平面跟实测待镜面在同一高度,所以精度甚至可以达到几纳米。

01 原理

单相机PMD系统如图1所示,系统由LCD显示屏、CCD相机和计算机组成:

图1 PMD系统示意图 [1]

简单原理:

  1. 显示屏显示计算机生成的结构光条纹;
  2. 相机通过待测镜面表面拍摄显示屏上条纹的镜像;
  3. 如果镜面表面不平整的话,则拍摄到的条纹会产生相应的变形;

更复杂原理,如图2所示(由于光路可逆,我们对光线反向描述):

图2 PMD系统原理图 [1]

在这个式子的推导中,有一点需要额外注意这个近似条件,实际上它是现有单相机PMD系统中误差的主要来源:

近似条件:我们认为,待测物体的高度要远小于,在点处待测镜面和参考面位置的高度点是完全一致的,忽略了这部分误差,认为相位仅仅与镜面表面梯度相关。

之后的重建步骤:

  1. 相位的获取原理跟结构光相类似
  2. 根据相位获取梯度
  3. 在获取了梯度之后,对 x,y方向分别沿路径进行积分

最终即可获取高度信息。

说明:这篇文章目的仅仅是对相位偏折术的核心原理做个概略性的介绍,完整的推导并未介绍,更多的细节请查看相关论文。

02 特性

相比较来说,PMD有以下优势:

图3 振动对梯度测量的影响 [1]

因为我们测量的是平面,即零频项信息,其是不包含梯度的,该项的变化不会引起反射光线角度的变化。

  • 对系统随机误差不敏感,因为积分的累积效应,使得随机噪声在积分过程中被很大程度抑制。
  • 获得更准确的曲率信息:
    • 计算曲率是检测面形缺陷的重要手段,梯度测量法仅仅需要对获得的梯度求一阶导数就可以获得曲率;
    • 而直接的高度测量方法则要二阶导数才能获得曲率,计算二阶导数会丢失更多的信息,计算得到的曲率较为不准确;

但相比较来说,梯度测量方法也有以下缺陷:

  • 只能测量连续的镜平面;
  • 积分过程引入误差;

一句话概括,PMD相比较FFP精度更高,但是测量场景受限,只能测量连续的镜平面!

03 参考文献

[1] 基于光学三维成像的镜面物体表面质量检测方法研究 [博],吴雨祥

备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3D视觉工坊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】list容器及其模拟实现
在数据结构当中,我们学习过链表的一系列形式,带头、不带头、双向、单向、循环、不循环等形式,其中带头双向链表由于可以轻易找到头尾节点,某一节点前后节点,具有头结点,因此链表为空不需要做特殊处理等优势,作为链表最完美的形式。C++STL中list底层的结构就是采用带头双向循环链表(对list的理解需要建立在对数据结构有一定基础上,对于链表不了解的读者可以先移步学习链表。)
ZLRRLZ
2024/12/13
1670
【C++】list容器及其模拟实现
一些关于广泛使用的C++标准库STL的思考
就算typedef对于提高运行速度可能没有什么实质性的帮助,但是它对于撰写你的代码是会有帮助的,你总不会喜欢一直重复的去写:
看、未来
2021/09/18
5910
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
前言: 在STL中,list是一种双向链表,它支持在序列的任何位置进行快速插入和删除操作。与此同时,迭代器是STL中非常重要的一个概念,它使得我们能够以统一的方式遍历和访问STL容器中的元素。在深入了解STL的过程中,模拟实现list和迭代器无疑是一个极有价值的学习过程。
Eternity._
2024/06/14
2600
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
【c++】STl-list使用&&list模拟实现
list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口
用户10925563
2024/06/04
1640
【c++】STl-list使用&&list模拟实现
C++(STL3)容器适配器(1) stack<T>,queue<T> and priority_queue<T>
容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。 这里有 3 种容器适配器:
种花家的奋斗兔
2020/11/13
8200
C++(STL3)容器适配器(1)   stack<T>,queue<T> and priority_queue<T>
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。
秦jh
2024/06/12
3280
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
C++11移动语义与右值引用
C++11新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力。如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升性能。参考如下程序:
恋喵大鲤鱼
2019/02/22
1.2K0
【C++】STL——stack,queue
注意在实现优先级队列时,我们可以用仿函数来控制优先级顺序,默认是大堆,可以通过仿函数改编成小堆,我这里把仿函数也模拟实现了一下,注意仿函数没有私密的成员变量,是空类,将括号重载,通过创建个仿函数类的对象(也可以不用创建直接使用匿名对象),调用括号,实现比较,模拟成函数调用的样子,这就是仿函数
用户11290673
2024/09/25
2130
【C++】STL——stack,queue
C++系列笔记(十)
【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等。这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。本文是系列笔记的第十篇,欢迎各位阅读指正!
墨明棋妙27
2022/08/24
6450
STL容器的线程安全性了解多少?
STL的意思是与迭代器合作的C++标准库的一部分,包括标准容器(包括string),iostream库的一部分,函数对象和算法,它不包括标准容器适配器(stack,queue和priority_queue)以及bitset和valarray容器,因为它们缺乏迭代器的支持,也不包括数组。数组以指针的形式支持迭代器,但数组是C++语言的一部分,并非库。
用户9831583
2022/12/04
1.9K0
C++核心准则C.60: 拷贝赋值运算符应该是以const&为参数,返回非常量引用类型的非虚函数
C.60: Make copy assignment non-virtual, take the parameter by const&, and return by non-const& C.60: 拷贝赋值运算符应该是以const&为参数,返回非常量引用类型的非虚函数
面向对象思考
2020/03/25
1.1K0
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——7.list(模拟实现)
用类来封装一个一个结点,里面有两个指针,一个是指向下一个位置的指针,一个是指向前一个位置,还有一个用来存放数据的变量
hope kc
2024/09/23
920
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——7.list(模拟实现)
【C++】STL---list
list 学习时也要学会查看文档:list 文档介绍,在实际中我们熟悉常见的接口就可以,下面我们直接开始模拟实现,在模拟实现中我们实现的是常见的接口,并且会在实现中讲解它们的使用以及注意事项。
YoungMLet
2024/03/01
1970
【C++】STL---list
【C++】STL--vector
使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习
用户11375356
2024/11/22
1770
【C++】STL--vector
【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)
堆是一种特殊的树形数据结构,通常以二叉树的形式实现,具有特定的排序特性。堆分为两种类型:最大堆和最小堆。
P_M_P
2024/08/25
3030
【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)
C++核心准则​​SL.con.2:除非有理由使用其他容器,默认使用STL vector
vector and array are the only standard containers that offer the following advantages:
面向对象思考
2020/10/30
4670
C++核心准则​​SL.con.2:除非有理由使用其他容器,默认使用STL vector
[C++] 容器适配器:深入理解Stack与Queue的底层原理
本文所涉及的stack、queue和priority_queue都是容器适配器,在底层都可以通过在接口传入的容器类型来进行底层的容器实现。
DevKevin
2024/08/02
4730
[C++] 容器适配器:深入理解Stack与Queue的底层原理
【C++篇】栈的层叠与队列的流动:在 STL 的韵律中探寻数据结构的优雅之舞
栈与队列是常见的数据结构,常被用于不同的算法场景。在本文中,我们将详细探讨栈与队列的基本概念、实际应用及其模拟实现。栈和队列在日常开发中的重要性不言而喻,通过对这两种数据结构的深入理解,将助你更加灵活地应对算法题目和工程开发。
半截诗
2025/05/29
2060
【C++篇】栈的层叠与队列的流动:在 STL 的韵律中探寻数据结构的优雅之舞
C++ STL学习之【容器适配器】
适配器(配接器)是 STL 中的六大组件之一,扮演着轴承、转换器的角色,使得 STL 中组件的使用更为灵活,比如 栈和队列 就是属于适配器而非容器,以及神秘的反向迭代器也属于适配器
北 海
2023/07/01
6260
C++ STL学习之【容器适配器】
【深入探索 C++ STL 容器 list】 —— 编程世界的万能胶,数据结构中的百变精灵
cplusplus.com/reference/list/list/?kw=list
换一颗红豆
2024/12/20
2170
【深入探索 C++ STL 容器 list】 —— 编程世界的万能胶,数据结构中的百变精灵
推荐阅读
相关推荐
【C++】list容器及其模拟实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档