立体视觉_基于多频外差的三频正弦波理想状态下的解相位


立体视觉_基于多频外差的三频正弦波理想状态下的解相位


2017.7.18

1.背景

在双目视觉中,如何协调两个摄像头并获取深度信息是一项关键技术。其中精度较高的办法之一是使用基于多频外差原理的相位相关技术。初到公司实习,接到的第一个任务就是学习多频外差的解相位相关技术。从无到有的三天学习,从理论知识到用具体数据模拟,在python下进行可视化实现,作以博文以记之。

2.过程

在做三维重建的时候,如何准确高效地获取物体的深度信息是关键。作为一种非接触式地扫描方法,结合实际情况,在只有两台相机地情况下该采用什么方法来获取呢?现在比较靠谱地方法就是利用相位相关地数学知识,将深度信息抽象在相位信息中。主要就是“求解包裹相位”和“相位展开”。求解包裹相位地作用是利用反三角函数将深度信息截断至-π到π的相位之内。此时的包裹相位实际上是按照投射的正弦光栅的周期进行分布的。如下图。


横坐标是图片中任意一行的像素,这张图片中使用的11pixel条距的正弦光栅。而我们的目的是确定该图片的该行任意一点处的深度信息,也就是说我们需要一个能够唯一确定图像上每一点的深度信息的相位函数,像这样按周期分布的相位函数是不行的。所以,我们要对包裹相位进行展开。

那么问题来了,只有一个频率的正弦波是无法进行相位展开的。要么双频、要么多频。查阅网上的资料,双频对于连续简单的物体重构效果较好,但是对于复杂物体的响应很差。而四频或者四频以上的光栅太耗时。所以我选取了三频的正弦光栅,条距分别是11px,12px,13px。

画出包裹相位图如下:


选用T1 = 11px,T2 = 12px,T3= 13px的原因是相位外差公式,计算可得T12 = 132px,T23 = 156px,再叠加T12和T23可得T123 = 858px。我要处理的图片宽度是854px,刚好满足要求。


在相机、投影仪和被测物相对位置不变的情况下,根据图像上同一点在相位编码图像上的

位置也相同,可以得到两种周期下相应的绝对相位之间的关系:



叠加后效果:


可见,叠加后相位再整行数据中已经覆盖了整个视场,可以根据绝对相位和高度之间的对应关系得到深度信息了。

3.模拟代码(python 需导入matpotlib包)

# encoding:utf-8

from matplotlib import pyplot as plt

 

PI = 3.1415926

# 三行像素的包裹相位

T1 = [0] * 854

T2 = [0] * 854

T3 = [0] * 854

T_12 = [0] * 854

T_23 = [0] * 854

T_123 = [0] * 854

 

x = [0] * 854

for i in range(0, 854):

   x[i] = i

m = 1

n = 1

q = 1

for i in range(0, 854):

   if m < 12:

       T1[i] = m * 2 * PI / 11 - PI

       m = m + 1

   else:

       m = 1

       T1[i] = m * 2 * PI / 11 - PI

       m = m + 1

   if n < 13:

       T2[i] = n * 2 * PI / 12 - PI

       n = n + 1

   else:

       n = 1

       T2[i] = n * 2 * PI / 12 - PI

       n = n + 1

   if q < 14:

       T3[i] = q * 2 * PI / 13 - PI

       q = q + 1

   else:

       q = 1

       T3[i] = q * 2 * PI / 13 - PI

       q = q + 1

for i in range(0, 854):

   if T1[i] >= T2[i]:

       T_12[i] = (T1[i] - T2[i])

   elif T1[i] < T2[i]:

       T_12[i] = (T1[i] - T2[i] + 2 * PI)

   if T2[i] >= T3[i]:

       T_23[i] = (T2[i] - T3[i])

   elif T2[i] < T3[i]:

       T_23[i] = (T2[i] - T3[i] + 2 * PI)

for i in range(0, 854):

   if T_12[i] >= T_23[i]:

       T_123[i] = (T_12[i] - T_23[i])

   elif T_12[i] < T_23[i]:

       T_123[i] = (T_12[i] - T_23[i] + 2 * PI)

 

plt.plot(x, T1)

plt.plot(x, T2)

plt.plot(x, T3)

plt.plot(x, T_12)

plt.plot(x, T_23)

plt.plot(x,T_123)

plt.title("T123")

plt.xlabel("pixel")

plt.ylabel("w/rad")

# plt.grid()

plt.show()


  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值