【三维重建】相移法+格雷码

本篇文章介绍一种稠密点云的获取方式------条纹结构光三维重建算法。

在学习此算法前,我们需要对基于视觉的三维重建算法有一定了解。

需要了解什么是相机模型、相机标定以及三角化的相关知识。

【三维重建】摄像机几何-CSDN博客

【三维重建】摄像机标定(张正友相机标定法)_相机内参矩阵和外参矩阵怎么获取-CSDN博客

【三维重建】三角化-CSDN博客

当我们得到两个相机的内参、外参后,就能通过两个视图的匹配点计算出该点的三维坐标。但是一般的特征匹配算法(SIFT、SURF)只能提取特征点,并且只有正确匹配才能得到正确的三维坐标。因为两个视图上能够成功匹配的点比较少, 因此通过这种方式获得的点云是稀疏的。

结构光的重建算法和三角化是一样的,不一样的是结构光算法通过向物体主投影带有特殊编码的图案,提高了两个视图成匹配点的个数,可以得到更多的三维点。

下面介绍一种常见的结构光算法:相移法+格雷码

单目结构光系统由一个相机和一个投影仪组成。我们可以把投影仪看作是一个逆相机,双目视觉中,需要成功得到两个相机视图中的匹配点对儿,那么在单目结构光系统我们就需要得到相机和投影视图的匹配点对儿。

知道了做什么,接下我们介绍一下怎么做?如何得到相机和投影视图的匹配点对儿?

相移法

首先,需要先生成待写入投影仪的理想N步相移条纹

通常对于N步相移来说,生成第k幅条纹图案的公式如下:

这个公式是一个正弦函数,k的增加可以看作正弦函数向左移动的过程。

对这个曲线的值进行repeat操作,就能生成下面幅图,图的每一行对应的就是正弦函数的值

根据实际需要设置相应的参数就能生成理想的相移图。

将相移图投影到物体上,再由相机捕获的图叫做实际相移图。

通过N幅相移图,就能计算出每个像素点的相位值

相机与投影仪就能通过相位值建立联系

格雷码

通过相移法解出的相位值是成周期状的,我们需要的是每一行的相位值是唯一的。

通过格雷码进行相位展开,得到唯一的相位值。

通过投影格雷码就能够计算出每一个像素的阶次k,阶次反映的是当前像素在第几个周期。

通过阶次可以计算出绝对相位 :

绝对相位在每一行中是唯一的。

重建

通过归一化,将相位值的取值范围变成0-1之间,知道当前像素的相位值,就能知道当前像素在投影仪中是哪一列。

通过相机-投影仪标定可以得到相机与投影仪的投影矩阵

投影矩阵反应了世界坐标到像素坐标的映射关系。

通过绝对相位图能够知道,相机视图的像素坐标 以及投影仪视图的像素的横坐标

通过联立前面两个公式即可求得三维坐标:

相关推荐
Navigator_Z4 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
云泽8087 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
wlsh157 小时前
Go 迭代器
算法
语戚8 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
CS创新实验室8 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
Black蜡笔小新9 小时前
自动化AI算法训练服务器DLTM训推一体化平台助力农业生产管理实现安全智能化
人工智能·算法·自动化
8Qi810 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS10 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚11 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法
智者知已应修善业11 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机