首页 > 产品 > DLP产品 > TI DLP®技术于3D 机器视觉与自动化光学检测之应用 >

高速可见光芯片组

最新课程

热门课程

TI DLP 3D SDK 介绍与解析

我们讲到第三个DLP 第三个DLP我们讲的是SDK这一款 很多人会说为什么 TI不是卖IT么,为什么会搞SDK呢 structure light其实在之前,很多人其实 没有非常了解structure light怎么应用 那我们经常讲说它是用三角函数原理得到一些 但是里面还有非常复杂的演算法 我们为了推广这个技术 所以我们就开发出一个分析 design SDK上的,大家可以知道 另外还有一个就是说 structure light它有一个非常核心的技术 就是我们叫做pattern 毕竟它叫structure light嘛 所以代表它的光打出来是被结构画过的光 被coding过的光 所以这个光,它一定要有一些coding的技术在里面 那这个怎么coding 怎么应用呢 很多人其实不太了解,因为它其实挺复杂的 或者说它的历史演进非常复杂 然后全世界为了这一个pattern 为了这一个image或coding image呢 去产生很多的pattern出来 所以很多人一开始就会凝视在这一款以后 那TI这边就提供一个非常简单 让你们了解说其实你们用这个技术 其实你只要稍微study过我们的论证 就大概可以得到入门的效果了 然后另外呢 DLP有两大特点 就是说DLP呢 我们刚刚一直在强调DLP很容易的就做到 这种程度 其他技术其实很难达成 为什么会做到这种程度呢 我们一直在强调说DLP可以挡住非常高精准的 能量 那这个能量可以转换成深度资讯 很多人对这个其实不太了解 这就是我们也可以透过SDK 来让你了解这个地方 因为这一章节其实有一点点困难 所以我等一下会稍微放慢一点点速度 让大家比较容易了解所讲的内容 一开始呢,当然还是想说 TI design TI我们做这个分析Design其实我们会做很多 尤其是针对像DLP的话呢 我们针对光伏已有做TI design 说包含任何线路图、光学设计 光学的那些全部都在里面 然后3D printing也有软体在里面 3D machine vision也有 包含source code也在里面 逻层阶都在里面 比如说像这个是DLP4500 我们选用的是4500,包含所有的产生图 结构光的都有 什么做calibration的都有 然后现流图或是boom,我们都有 针对目前的话 我们SDK是polling great camera 当然你们到时候要换的话 可以直接换自己喜欢用的camera driver就可以了 应用上其实不会有太大的困难 当然最重要的就是 说的SDK以及e to e线上回答等等 欢迎大家可以上网去看 然后如果有问题可以上网去问 这一页其实看到很多花花绿绿的图片 这个其实就是第一个最大门槛 大家看到这个图片 基本上很多人就打退堂鼓了 其实这个部分虽然是个structure light最主要的精华 但是这地方其实不会太难理解 我们稍微来讲一下 让大家可以稍微理解一下 首先我们来看一下 我们从最简单的来说,我们叫binary code pattern 那binary code pattern简单讲就是 图片binary的变化,就是黑跟白的变化 所以你可以看,上面的这个就是binary code pattern 这边有四张pattern,一二三四,四张pattern 我们简单讲就是说为什么要产生这样的pattern呢 目的只有一个,就是说投影机打出的是几条线 打到一个物件上或打到平面上 请问camera如何知道上面出现这一条线 它是投影机打出来的第几条线呢 如何知道 其实camera是不知道的 它只知道它是亮亮的 它是暗暗的而已 所以如果我们可以在打上那个pattern上面呢 有一些密码在上面的话 是不是你就会知道从camera 取得的sensor的值我就知道它第几条线呢 那我们用第一张图来解译 第一个它打了四张图 我们看到这张图的最左边它是一条白线 假设camera现在看到这一条线了 看到的是1,白的嘛 看到第二条线它也是白的 它也是1 第三张它也是白的,也是1 第四张也是白的,也是1 所以camera取到的sensor的位置 这四张图都是1的时候 我就知道,它是这画面,是投影机打出来的 最左边的那条线 这样可以了吗 我们向右边看一下 这是一嘛,第二条线是黑的 第二个黑线其实是两条线 我们可以看 第二条左边的那条黑线 第二个是黑 第二条线是黑,第一张图看到的是黑 第二张图看到是白 第三张图看到是白 第四张是白 所以如果sensor所看到的是0 1 1 1 就知道是投影机打出来的第二条线 这样可以吗 往右边继续回推 这是第三条线 第三条是黑色的 所以是白黑黑 第三条线是黑 camera现在看到的是黑 黑 白 白的时候我就知道是投影机打出来的第三条线 所以我只要连续解译这四张pattern 我就会知道camera现在看到的到底是投影机打出来的 第几条线 大家已经了解说为什么要coding这个pattern 因为我要知道是投影机的第几条线 打出来的 然后我也知道说如何coding这个pattern 前面讲的是给它加密上去 只要编个号码就可以了 那编号码的方法就是 由0101这样编好了 那01的地方我们就叫binary code binary coding pattern 那我们当然也有叫gray code pattern的 gray code pattern就是说 我这个101的时候 我可以用gray code 这个码去做编译 它就不会比方说右边是01234...... 不会这样做的 它可能会做的是 0然后做+,做n ary code的部分 所以它叫gray code,这是通讯的一些方法 n ary code部分 今天大家也可以了解binary code coding的部分 我们见到考个试好了 请问今天的我要coding 比如说十六条线 请问我要几张pattern可以coding十六条线呢 公式其实很简单 因为我是binary code嘛,对不对 我是黑白,所以我的变化只有两种 那pattern呢 我有四个pattern,所以二的四次方 所以我要coding十六条线,就是二的四次方,就是16 所以,我将四个pattern,我去coding十六条线 你可以从右边算过来 反正是1好了,最后左边就是16 可以算到十六条线的这边 所以,如果今天要coding 一千条线 所以就是二的十次方 1024条 就是将十张pattern去coding一千条线 如果我要coding一千条线 那这一千条线 那十张pattern我打完不就天荒地老了吗 那这样会不会太困难了一点 太多了 所以现在又有人说 会不会我这个黑白其实有点儿太浪费 我可以打灰呀 所以就是产生一点灰的pattern 也就是N-ary,你可以打成灰的 比如说二的几次方 因为是四次方等于十六 我可以三的三次方 就是很多张pattern了 就二十几张pattern了 所以我只要打三张pattern,就可以打二十几条线 就很方便 那一定会有人讲说 如果我这个能力是无穷多呢 无穷多的意思是什么 就是说我这个能量变化是无穷细 那我的机子就是无穷多的几次方 它可以得到无穷多或者无穷细的pattern吗 这其实是有办法的 我们来看一下下面这张 这张其实是三张 我们叫做phase shift图组成的 上面这张横的是第一张 第二张、第三张 总共三张phase shift图 第一张图最左边是0 慢慢慢慢到亮、到暗 所以亮到暗,暗到亮到暗 零度 接下来我们就shift一百二十度 两百四十度 我们就得到三张pattern 所以说我只要知道这个能量 我能量用sign 来回推 我就可以得到说它到底是shift了多少角度 目前因为有很多很多变数,大概是十几个变数 要去解它我们就需要三张pattern 来去解这个phase shift演算法 所以这就是我们叫phase shift的原因就在这里 phase shift最少就是三张 目前如果你为了一些因素的话,可能会用到四张 或更多张没有问题 但是你最少需要三张 这个原因就是说 你可以用这种phase shift 然后非常非常细的能量 然后透过能量来转换成角度 角度就会转换成深度资讯 因为角度我们用sin、cos就可以知道 它shift到多少角度 我们就可以换算成它的深度资讯 这样子跟DLP有什么关系呢 因为我们讲说DLP其实叫Digital Light Processing 所以光打出来的部分一定也是数位化 能量也是固定值 绝对不可能是无穷细的能量 所以这样子的问题 那DLP怎么打出这种无穷细的能量呢 其实有一个方法 而且是现在自然界自然而然产生的方法 DLP打出来的能量一定是,比如说我把能量切割成 灰阶,0—2灰阶值 打出去的能量就是固定值的灰阶了 理论上不会有零点多少 是0 1 2 3 4 5... 不会是0.1 0.2 0.3... 那怎么样产生零点多少 或是它中间的那些非常细微的东西呢 其实很简单 投影机的话 通常它有projection lens 那projection lens就是成像镜 成像镜其实是类比化的一个物阶 所以你所有的光打出来之后 它只要经过成像镜之后 它就变类比化 就变成类比咨询 简单讲,如果我打出一条线来 是一个很明亮的一条白线 那旁边是黑的 那条白线跟黑 已经是非常亮的shift,非常精确看到那条线,很清楚 可是今天我如果用一些比较烂的镜头 focus比较差的条件下 会有什么情况 看到,由黑慢慢变白 白慢慢变黑,那条线变模糊了 所以它就是类比化的结果 简单来讲,你用DLP 其实本质上你可以很容易的产生这种 非常是smooth的pattern 只要使用一些我们叫做light pair 或者是NTF比较差的condition 那他光学效果比较差的condition 它自然而然会将我们DLP产生的数位pattern 类比化了 那我们就挥产生非常smooth的sinusoidal pattern phase shift pattern 这就是为什么目前很多人用我们的技术可以 非常轻易的做到micro 等级的原因在这里 当然,下面有很多很多变形的 包含如何产生一些形变 我们叫adaptive pattern 依据物镜产生 或者是你可以再加一些 比如说彩色的pattern 让它有更多的变化性 让你的pattern变得更少 甚至我们叫做one shift 意思就是说上面的比如四张十张之类的 它可能只要打一张就好了 它一张里面呢 所有的资讯从coding 在好几批手里头 所以我用解析度来换取时间 来换取这些pattern 所以我只要打一张pattern 取代这四张,类似这样的效果 你可以用颜色、或是用灰阶来copy各个pattern 到各个像素上 但降低肯定是解析度之类的 还有很多很多变形方法 就是为什么全世界你可以看到 很多很多人在申请这类似的专利 因为你只要稍微变形一点点 就可以得到一些不一样的效果 或不一样的好处 当你会产生一些缺点 TI在SDK部分 我们使用了两种技术 第一个技术,两种pattern 第二篇我们叫binary code也是gray code 像这种pattern 第二个我们使用的是phase shift pattern 就是这个pattern那我们的gray code呢 pattern当然是没有问题 phase shift我们是整个gray code 加上phase shift pattern 等一下会讲到这部分 这一块大家可能会有点儿比较累 因为这部分的理解会稍微辛苦一点儿 但是你这块了解后面的话 其实就很简单的 当然,讲这么多,还是要讲一下我们的 SDK到底如何应用这些演算法 首先DLP、SDK,当然我们是自动产生pattern 所以刚刚讲过我们产生的是gray code pattern 也会自动产生gray code+phase shift pattern 那我们也会帮忙做calibration 所以演算法这就做calibration 所以我们用的是openCV的样式check部分 很多人又有质疑 那请问如果我今天用了某一个dad 那dad到底什么样的解析度 或是五条,多少条线这件事情 可以最细的做,然后到底会产生多少pattern 这边就可以看到说 这是一个简单的算法 就是说如过你是用 binary code很简单,binary code我们刚刚讲到 就是二的几次方乘以多少条线 那如果是hybrid condition呢 就是phase shift+binary code Gary code 那怎么产生呢 这是一个很简单的公式 第一个呢,我们的算法是在这里 phase shift一定就是sinusoidal pattern 就是一定是三张 我们是用three step phase shift,就一定是三张 如果你要垂直+水平,就是 三张两倍,就是六张 那gray code部分的话 我们是对应它的 所以就是说有个参数就是你要用多少 个period去产生一个phase shift 就是一个2π去产生一个sinusoidal pattern 假设是用32好了 假如是DLP450的话 它其实就是912水平的 所以大概需要产生28.5的周期 进回来是29个周期 对应的话就是二的八次方 会产生八个pattern 那八个pattern呢 如果你有invert invert就是说我打白黑 再打黑白 vertical增加所谓的对抗 如果你物件反射程度比较差 或者是你noise比较多的时候 可以用这个pattern去打造非常好的一个抗noise的效果 这是invert pattern 这边有算法 比如说是16张 垂直部分的话是horizontal shift的话就是1140条 那除以32可以得到需要打18张 所以如果这种是最复杂的阴影下的话呢 DLP4500的话 它的phase shift演算法大概需要用到40张图 大概是这样的算法,给你们做参考 接下来是calibration calibration基本上我们还是openCV的calibration 去做 calibration当然我们做check ball 这东西没有问题 这跟Open C是一模一样 那我们用它的公式是一模一样的 有的地方也不一样,就是说 今天我们使用的phase shift的话有个问题 phase shift就是一个实例 camera打出一个phase shift pattern 就是sinusoidal pattern长这样子 CCD看到物件 看到平面长这样子 就是ref plane 假设这边是0 phase shift的 当你的物件起来是红色物件 CCD同样的,原本呢ref这边是0 假设你这个物件已经超过了一个2π程度的话 会发生什么事情 我根本不晓得它到底是0,还是2π 因为我们从演算法,从公式来说 它只会告诉你到底是0—2π是哪一个值而已 它并不会告诉你是第几个2π 所以这一块的话 就会变成说 通常如果你要解译这个的话 有个叫unwrappong的演算法 unwrapping意思是什么呢 比如说我解开这边是1.9p的话,假设 它这边的话,通常不会瞬间变成0 对我们用猜的 unwrapping就是用猜的 猜出这个大概有可能是在2π 而不会瞬间掉到0π 的位置 就是unwrapping的技术 但是unwrapping其实会跟你的物件条件情况有关 比如说我的物件真的很可能它就是sharp 那这样怎么办呢 我们SDK提供另外一个solution 就是说我们用gray code+phase shift gray code的意思很简单 就是说我们刚刚的ref plane 从ref plane往上算 当然很容易就算打超过2π的情况 不过ref plane呢 是每四分之p就有ref plane 这样就和农容易 这样就很容易克服这个问题 所以呢,一个产生缩点 是我们产生的八个gray code 线条 所以产生一个π/4 refplane 所以我们就可以不用使用unwrapping 那怎么用呢 或是怎么计算,有一个recording 就是下一页我们会跟大家讲 那这一个呢 camera部分话,我们当然也做同步 所以我们camera会 SDK自动帮你做同步 同步camera跟投影机的capture部分 投影机打出的能量非常精准 所以如果我们要同步的话 能量部分一定会有问题 转换出来的深度资讯也会有问题 所以同步非常重要 那我们SDK有做同步的动作 SDK同步动作很简单 就是说因为camera它速度其实是不稳定的 为什么呢 因为camera什么时候可以capture下一张图呢 限制在你的电脑什么时候可以把图取走 所以这是camera速度其实 说不稳定的原因乃至于你的电脑什么时候能把pattern取走 它才可以做下一张 如果电脑这时候正在忙碌 的话,可能camera的速度是时快时慢 所以我们SDK的做法很简单 就是说我们是利用camera trigger投影机的方法 那camera如果trigger投影机有有一个大问题 就是说什么时候你camera 取得画面是一张投影机打出来的图 这是你不知道的 因为你开始取图的时候 投影机到开始送出pattern的时候 是camera送出的第一个trigger 投影机就打出这个pattern 其实这没有问题 可是呢,电脑是永远都在取图 所以前面会有一大堆的没有用的图 所以这个如何识别第一张图呢 我们的SDK有做 它会自动帮你识别什么是第一张投影机打出来的图 我们有一些error code 来做识别 其实就是投影机帮你做好的动作 但是这有一个问题就是说 因为你有可能要去buffer掉一些没有用的图 所以通常我们就会设定一个足够大的buffer 这个buffer可能到时候因为你的速度等等因素 你要去微调它 可能要把它加大一点 你可以加很大,就看你电脑机体够不够而已 另外的,如果你要project出一个camera的话 你可能这个地方的SDK需要改 project出一个camera的好处就是说 我可以用一个project,然后两个camera 所以我一个project 两个camera的话呢 我一次扫描可以同时取两个,在3D打印机 所以你的物件可能,比如说像是机械手臂 你可能只需要去六十度的一个角度的话 你可能一个投影机+两个camera就能解决 你不用用到一个扫描式 就是你还要动你的scanning 扫描头都不用动 可以这样对应你的应用 就简单很多 我们刚刚讲到说 我们刚有用过gray code 来做decoding 来做3D扫描的处理 到底是怎么做的呢 假设我们今天是个gray code好了 图是这样子的 那camera取到图了 我们会把它解译成叫disparity map 那disparity map到底什么意思呢 我们可以看成这就是解译完的结果 这个agree 其实就是sensor agree,camera sensor agree 假设你这是camera sensor 这是xo,定义0的位置好了 S0 Y0位置 取到的值是这个 那解译了四张pattern之后 我们刚刚讲过 你们说这个0是1 1 1 1pattern 1 1 1 1的sensor值 这四张取出来 这个sensor 得到的就是第一条线来自于投影机 同样的,所有sensor去取 全部都是1 1 1 1,这些全部都是一条线 第二个就是0 1 1 1,我就知道是第二条线 0 0 1 1,那我就知道这是第三条线 以此类推 所以,简单讲,camera sensor最后取到disparity map就是 sensor上,在sensor位置所看到的投影机的第几条线 那如果今天是,我们刚刚讲hybrid pattern的话 怎么样呢 一样,第一步我还是要解gray code 所以我就解出来,这个是第一条线 这第二条线 第三条线、第四条线等等 phase shift我们经过能量来制作 能量会换算出来它shift掉多少 所以每一条线呢,shift理论上是π/4 π/4,那shift掉多少,做线性那条就知道做 理论上这个它看到的是第几条 内差出来的第几条线 所以可以得到gray code第一、第二、第三条 细小线 这是要多细呢 取决于你camera sensor对于这个能量的精准度有多高 所以这块的话 取决于一个非常大的重点,就是说 能量如果越精准 camera取到的如果越精准 那你的这个精准值就越高 越高的话,你可以换算的深度资讯就越高 所以非常容易取到很高等级的程度 DLP另外一个好处就是我们的对比度通常是非常高的 对比度越高的话,比如说我们暗接是0 暗接好像是零点多少 亮接肯定是它的1000倍 所以我们的暗亮的对比度非常高 所以我们可以得到很好的对比效果 能量越弱,可以搭越开 sensor就能够取得更好的值 noise就会变小 所以这是为什么DLP在这块更容易做好的原因就在这里 最后就是我们讲的coding之后,就是叫reconstruction reconstruction就是说我们得到disparity map之后 如果把它转换成3D资讯 以后的课基本上我们只会一些后续的 一些filter的效果 比如说,如果你有noise的话 可以产生一些filter让你,或者是如果你 想要产生一些数学上的一些suck sample 一些比较细微的点的话 你可以做oversample 这些数学的一些辅助 是没有问题的 我们的演算法其实有两种 reconstruction 第一种我们叫做plane\line的方法 手下投影机打开是一条直线 直线在空间中其实是一个面 一进入 它就产生一个反射光在这里 camera看到,别第几个sensor看到 这条线 所以我们当disparity map,就是这个disparity map呢 我们知道说camera sensor的第几个,camera sensor 看到的投影机的第几条线 这个线其实在空间中会转换成 因为我们现在做calibration 所以这个线我们会得到一个空间的面的公式 这个线其实在空间中是个面 这个面是一个公式 所以我用面跟camera calibration面是一个公式 线公式 所以我可以透过面跟线在空间中取得一个点 面跟线会取得一个点 解这个公式就可以了 另外呢,另外的方法就是说我们 我们叫做线对线的解法 怎么做呢 如果我们今天打了一个垂直的面 出去 我们知道,投影机的X轴的第几条线打出来的 如果又打一个水平的面 出去 同样的sensor,我会取得两个disparity map 一个是垂直的 投影机的线,一个是水平投影机的线 所以呢,这两个disparity map我会知道说 这个sensor camera上的某一个sensor 跟投影机的某一个像素 打出来的line 光线。这两个光线的交错点 很明显的,大家就知道说 势必的,就只有一个值 势必的就只有这种line to line是最精准的 这一块就会产生一些误差出来 什么误差我们等下可以看 但是line to line就有个大缺点 就是说我垂直化跟水平我要打两倍的pattern 两倍的pattern就会导致什么问题 就是我时间会多一倍 所以在一些,如果你是starting go的条件下 这种情况还是可以用这个方法 就是物件摆在那里,我现在扫描 但是我要求非常高精准度 你可以用line to line去作证 但是如果你物件是在有可能会动的情况下 你可能就不太适用 打这么多pattern 你只能适用这种phase shift 那这样有什么缺点呢 我们看这个有什么缺点 这就是缺点 我们扫描的物件理论上一个面 它是一个面 一个面上应该只有一个点 可是你看,它好像一个光束射进这个面里面 这以前是一个平面 这好像每个地方都有一个光束射进这里面 为什么呢 我们可以往回看一下 这个gray code对不对 disparity map长这个样子 我们刚刚讲的 刚刚讲的一个问题 说投影机打出来是一条线 可以在现实生活中不可能一个东西线是无穷细的 那线一定是有个宽度 所以camera看到它是有个宽度 所以这条线你可以看到 比如说这是四条 四个看到的线 这是三个镜头看到的线 现在这是2,四个镜头看到的线 我们这是四个、五个镜头看到的线 所以呢,在VO world中 camera现在看到的线一定是有一个一定的宽度 那这个宽度发生什么事情呢 往后看 如果想投影机打出来,这个绿色 就是它的线 理论上,数学上它只希望看到这条中间绿色线 可事实上,它其实是一条bug camera其实是看到这1 2 3 4 5,五个点 可是在公式上 它不知道它是一个bug 它只知道从我来说 从这个camera sensor来说 看到的,它理论上是每个点都是有意义的 所以它看到的是1 2 3 4 5,五个点 解译完这五个点 提取中间这条线 这条线就含了这五个点 这五点就插入这个平面上 就好像这个点是插入这个平面上一样 那怎么解决它呢 解决它的方法其实很多 最简单的方法,当然很简单了 就比如说我们可以用一些built 或者是一些我们刚刚讲的 line to line,也是去打两张pattern 来解决 其实最简单的解决方法 或是最perfect的解决方法 或者是说最优经济效益的解决方法 其实是这样子 我们返回看 如果仅仅打出来是这条线 如果camera sensor这条线呢,我大概只能解译两个点 我的camera sensor对应投影机解析度 如果是match 所以我只要camera sensor在这条bug上只取两个点 这两个点我可以做average之后 只取一个点而已 这样它精准度,它不会浪费camera sensor 第二个呢 我还可以做简单的filter 都会取到比较精准的点 在应用disparity map来做filter 我们往回看一下 如果我今天只有两个点的话就很简单 我只要把这两个做一下filter 把两个取成一点就好了 就是像这样 水平着取一点 做filter的时候就会更简单 所以前提条件是说如果呢 我们可以在做gray code的时候 我们可以利用 camera sensor跟低面积解析度做match的时候 就不会有这个问题 那如果你是gray code+phase shift 或是只有phase shift的话 也不会有这个问题 因为phase shift本身就是有 所有camera sensor都是有意义的 它不会有多余的点出来 因为我们把每一个点都拿来用 我会只知道第一个点是有用的 其他点是做phase shift用的 所以这些点就不会被shift掉 但是前提条件,第一点要是对的才行 所以calibration就变得非常重要 误差会被gray code就是openCV的calibration 累加上去 所以,hybrid的误差其实还是被gray code的误差 累加上去 所以这个gray code变得非常重要 这是另外我们刚刚讲的filter 我们其实在演算法 我们的SDK也有提供 我们叫disparity filter 你可以做smooth,看你要做smooth去改filter就可以了 我们SDK使用的filter是by digital filter 就是对左右两边做线性 做linear decoration the filter 这就是我们SDK全部的流程 所以最终我们产生的是用line to line 或者是plane to line我们产生的是xyz空间的坐标点 会产生一个空间xyz的坐标点 这个SDK support目前所有的系列 但是新的,就是等下会讲的DLP4347x 的新系列还没有support 大概是明年的样子 会等我们的新的DLPC3479出来之后 才一并的开发出新的SDK系列 前面大概就是针对我们DLP或者3D扫描 输入应用的一些介绍

我们讲到第三个DLP

第三个DLP我们讲的是SDK这一款

很多人会说为什么

TI不是卖IT么,为什么会搞SDK呢

structure light其实在之前,很多人其实

没有非常了解structure light怎么应用

那我们经常讲说它是用三角函数原理得到一些

但是里面还有非常复杂的演算法

我们为了推广这个技术

所以我们就开发出一个分析 design

SDK上的,大家可以知道

另外还有一个就是说

structure light它有一个非常核心的技术

就是我们叫做pattern

毕竟它叫structure light嘛

所以代表它的光打出来是被结构画过的光

被coding过的光

所以这个光,它一定要有一些coding的技术在里面

那这个怎么coding

怎么应用呢

很多人其实不太了解,因为它其实挺复杂的

或者说它的历史演进非常复杂

然后全世界为了这一个pattern

为了这一个image或coding image呢

去产生很多的pattern出来

所以很多人一开始就会凝视在这一款以后

那TI这边就提供一个非常简单

让你们了解说其实你们用这个技术

其实你只要稍微study过我们的论证

就大概可以得到入门的效果了

然后另外呢

DLP有两大特点

就是说DLP呢

我们刚刚一直在强调DLP很容易的就做到

这种程度

其他技术其实很难达成

为什么会做到这种程度呢

我们一直在强调说DLP可以挡住非常高精准的

能量

那这个能量可以转换成深度资讯

很多人对这个其实不太了解

这就是我们也可以透过SDK

来让你了解这个地方

因为这一章节其实有一点点困难

所以我等一下会稍微放慢一点点速度

让大家比较容易了解所讲的内容

一开始呢,当然还是想说

TI design

TI我们做这个分析Design其实我们会做很多

尤其是针对像DLP的话呢

我们针对光伏已有做TI design

说包含任何线路图、光学设计

光学的那些全部都在里面

然后3D printing也有软体在里面

3D machine vision也有

包含source code也在里面

逻层阶都在里面

比如说像这个是DLP4500

我们选用的是4500,包含所有的产生图

结构光的都有

什么做calibration的都有

然后现流图或是boom,我们都有

针对目前的话

我们SDK是polling great camera

当然你们到时候要换的话

可以直接换自己喜欢用的camera driver就可以了

应用上其实不会有太大的困难

当然最重要的就是

说的SDK以及e to e线上回答等等

欢迎大家可以上网去看

然后如果有问题可以上网去问

这一页其实看到很多花花绿绿的图片

这个其实就是第一个最大门槛

大家看到这个图片

基本上很多人就打退堂鼓了

其实这个部分虽然是个structure light最主要的精华

但是这地方其实不会太难理解

我们稍微来讲一下

让大家可以稍微理解一下

首先我们来看一下

我们从最简单的来说,我们叫binary code pattern

那binary code pattern简单讲就是

图片binary的变化,就是黑跟白的变化

所以你可以看,上面的这个就是binary code pattern

这边有四张pattern,一二三四,四张pattern

我们简单讲就是说为什么要产生这样的pattern呢

目的只有一个,就是说投影机打出的是几条线

打到一个物件上或打到平面上

请问camera如何知道上面出现这一条线

它是投影机打出来的第几条线呢

如何知道

其实camera是不知道的

它只知道它是亮亮的

它是暗暗的而已

所以如果我们可以在打上那个pattern上面呢

有一些密码在上面的话

是不是你就会知道从camera

取得的sensor的值我就知道它第几条线呢

那我们用第一张图来解译

第一个它打了四张图

我们看到这张图的最左边它是一条白线

假设camera现在看到这一条线了

看到的是1,白的嘛

看到第二条线它也是白的

它也是1

第三张它也是白的,也是1

第四张也是白的,也是1

所以camera取到的sensor的位置

这四张图都是1的时候

我就知道,它是这画面,是投影机打出来的

最左边的那条线

这样可以了吗

我们向右边看一下

这是一嘛,第二条线是黑的

第二个黑线其实是两条线

我们可以看

第二条左边的那条黑线

第二个是黑

第二条线是黑,第一张图看到的是黑

第二张图看到是白

第三张图看到是白

第四张是白

所以如果sensor所看到的是0 1 1 1

就知道是投影机打出来的第二条线

这样可以吗

往右边继续回推

这是第三条线

第三条是黑色的

所以是白黑黑

第三条线是黑

camera现在看到的是黑

黑 白

白的时候我就知道是投影机打出来的第三条线

所以我只要连续解译这四张pattern

我就会知道camera现在看到的到底是投影机打出来的

第几条线

大家已经了解说为什么要coding这个pattern

因为我要知道是投影机的第几条线

打出来的

然后我也知道说如何coding这个pattern

前面讲的是给它加密上去

只要编个号码就可以了

那编号码的方法就是

由0101这样编好了

那01的地方我们就叫binary code

binary coding pattern

那我们当然也有叫gray code pattern的

gray code pattern就是说

我这个101的时候

我可以用gray code

这个码去做编译

它就不会比方说右边是01234......

不会这样做的

它可能会做的是

0然后做+,做n ary code的部分

所以它叫gray code,这是通讯的一些方法

n ary code部分

今天大家也可以了解binary code

coding的部分

我们见到考个试好了

请问今天的我要coding

比如说十六条线

请问我要几张pattern可以coding十六条线呢

公式其实很简单

因为我是binary code嘛,对不对

我是黑白,所以我的变化只有两种

那pattern呢

我有四个pattern,所以二的四次方

所以我要coding十六条线,就是二的四次方,就是16

所以,我将四个pattern,我去coding十六条线

你可以从右边算过来

反正是1好了,最后左边就是16

可以算到十六条线的这边

所以,如果今天要coding

一千条线

所以就是二的十次方

1024条

就是将十张pattern去coding一千条线

如果我要coding一千条线

那这一千条线

那十张pattern我打完不就天荒地老了吗

那这样会不会太困难了一点

太多了

所以现在又有人说

会不会我这个黑白其实有点儿太浪费

我可以打灰呀

所以就是产生一点灰的pattern

也就是N-ary,你可以打成灰的

比如说二的几次方

因为是四次方等于十六

我可以三的三次方

就是很多张pattern了

就二十几张pattern了

所以我只要打三张pattern,就可以打二十几条线

就很方便

那一定会有人讲说

如果我这个能力是无穷多呢

无穷多的意思是什么

就是说我这个能量变化是无穷细

那我的机子就是无穷多的几次方

它可以得到无穷多或者无穷细的pattern吗

这其实是有办法的

我们来看一下下面这张

这张其实是三张

我们叫做phase shift图组成的

上面这张横的是第一张

第二张、第三张

总共三张phase shift图

第一张图最左边是0

慢慢慢慢到亮、到暗

所以亮到暗,暗到亮到暗

零度

接下来我们就shift一百二十度

两百四十度

我们就得到三张pattern

所以说我只要知道这个能量

我能量用sign

来回推

我就可以得到说它到底是shift了多少角度

目前因为有很多很多变数,大概是十几个变数

要去解它我们就需要三张pattern

来去解这个phase shift演算法

所以这就是我们叫phase shift的原因就在这里

phase shift最少就是三张

目前如果你为了一些因素的话,可能会用到四张

或更多张没有问题

但是你最少需要三张

这个原因就是说

你可以用这种phase shift

然后非常非常细的能量

然后透过能量来转换成角度

角度就会转换成深度资讯

因为角度我们用sin、cos就可以知道

它shift到多少角度

我们就可以换算成它的深度资讯

这样子跟DLP有什么关系呢

因为我们讲说DLP其实叫Digital Light Processing

所以光打出来的部分一定也是数位化

能量也是固定值

绝对不可能是无穷细的能量

所以这样子的问题

那DLP怎么打出这种无穷细的能量呢

其实有一个方法

而且是现在自然界自然而然产生的方法

DLP打出来的能量一定是,比如说我把能量切割成

灰阶,0—2灰阶值

打出去的能量就是固定值的灰阶了

理论上不会有零点多少

是0 1 2 3 4 5...

不会是0.1 0.2 0.3...

那怎么样产生零点多少

或是它中间的那些非常细微的东西呢

其实很简单

投影机的话

通常它有projection lens

那projection lens就是成像镜

成像镜其实是类比化的一个物阶

所以你所有的光打出来之后

它只要经过成像镜之后

它就变类比化

就变成类比咨询

简单讲,如果我打出一条线来

是一个很明亮的一条白线

那旁边是黑的

那条白线跟黑

已经是非常亮的shift,非常精确看到那条线,很清楚

可是今天我如果用一些比较烂的镜头

focus比较差的条件下

会有什么情况

看到,由黑慢慢变白

白慢慢变黑,那条线变模糊了

所以它就是类比化的结果

简单来讲,你用DLP

其实本质上你可以很容易的产生这种

非常是smooth的pattern

只要使用一些我们叫做light pair

或者是NTF比较差的condition

那他光学效果比较差的condition

它自然而然会将我们DLP产生的数位pattern

类比化了

那我们就挥产生非常smooth的sinusoidal pattern

phase shift pattern

这就是为什么目前很多人用我们的技术可以

非常轻易的做到micro 等级的原因在这里

当然,下面有很多很多变形的

包含如何产生一些形变

我们叫adaptive pattern

依据物镜产生

或者是你可以再加一些

比如说彩色的pattern

让它有更多的变化性

让你的pattern变得更少

甚至我们叫做one shift

意思就是说上面的比如四张十张之类的

它可能只要打一张就好了

它一张里面呢

所有的资讯从coding 在好几批手里头

所以我用解析度来换取时间

来换取这些pattern

所以我只要打一张pattern

取代这四张,类似这样的效果

你可以用颜色、或是用灰阶来copy各个pattern

到各个像素上

但降低肯定是解析度之类的

还有很多很多变形方法

就是为什么全世界你可以看到

很多很多人在申请这类似的专利

因为你只要稍微变形一点点

就可以得到一些不一样的效果

或不一样的好处

当你会产生一些缺点

TI在SDK部分

我们使用了两种技术

第一个技术,两种pattern

第二篇我们叫binary code也是gray code

像这种pattern

第二个我们使用的是phase shift pattern

就是这个pattern那我们的gray code呢

pattern当然是没有问题

phase shift我们是整个gray code

加上phase shift pattern

等一下会讲到这部分

这一块大家可能会有点儿比较累

因为这部分的理解会稍微辛苦一点儿

但是你这块了解后面的话

其实就很简单的

当然,讲这么多,还是要讲一下我们的

SDK到底如何应用这些演算法

首先DLP、SDK,当然我们是自动产生pattern

所以刚刚讲过我们产生的是gray code pattern

也会自动产生gray code+phase shift pattern

那我们也会帮忙做calibration

所以演算法这就做calibration

所以我们用的是openCV的样式check部分

很多人又有质疑

那请问如果我今天用了某一个dad

那dad到底什么样的解析度

或是五条,多少条线这件事情

可以最细的做,然后到底会产生多少pattern

这边就可以看到说

这是一个简单的算法

就是说如过你是用

binary code很简单,binary code我们刚刚讲到

就是二的几次方乘以多少条线

那如果是hybrid condition呢

就是phase shift+binary code

Gary code

那怎么产生呢

这是一个很简单的公式

第一个呢,我们的算法是在这里

phase shift一定就是sinusoidal pattern

就是一定是三张

我们是用three step

phase shift,就一定是三张

如果你要垂直+水平,就是

三张两倍,就是六张

那gray code部分的话

我们是对应它的

所以就是说有个参数就是你要用多少

个period去产生一个phase shift

就是一个2π去产生一个sinusoidal pattern

假设是用32好了

假如是DLP450的话

它其实就是912水平的

所以大概需要产生28.5的周期

进回来是29个周期

对应的话就是二的八次方

会产生八个pattern

那八个pattern呢

如果你有invert

invert就是说我打白黑

再打黑白

vertical增加所谓的对抗

如果你物件反射程度比较差

或者是你noise比较多的时候

可以用这个pattern去打造非常好的一个抗noise的效果

这是invert pattern

这边有算法

比如说是16张

垂直部分的话是horizontal

shift的话就是1140条

那除以32可以得到需要打18张

所以如果这种是最复杂的阴影下的话呢

DLP4500的话

它的phase shift演算法大概需要用到40张图

大概是这样的算法,给你们做参考

接下来是calibration

calibration基本上我们还是openCV的calibration

去做

calibration当然我们做check ball

这东西没有问题

这跟Open C是一模一样

那我们用它的公式是一模一样的

有的地方也不一样,就是说

今天我们使用的phase shift的话有个问题

phase shift就是一个实例

camera打出一个phase shift pattern

就是sinusoidal pattern长这样子

CCD看到物件

看到平面长这样子

就是ref plane

假设这边是0

phase shift的

当你的物件起来是红色物件

CCD同样的,原本呢ref这边是0

假设你这个物件已经超过了一个2π程度的话

会发生什么事情

我根本不晓得它到底是0,还是2π

因为我们从演算法,从公式来说

它只会告诉你到底是0—2π是哪一个值而已

它并不会告诉你是第几个2π

所以这一块的话

就会变成说

通常如果你要解译这个的话

有个叫unwrappong的演算法

unwrapping意思是什么呢

比如说我解开这边是1.9p的话,假设

它这边的话,通常不会瞬间变成0

对我们用猜的

unwrapping就是用猜的

猜出这个大概有可能是在2π

而不会瞬间掉到0π

的位置

就是unwrapping的技术

但是unwrapping其实会跟你的物件条件情况有关

比如说我的物件真的很可能它就是sharp

那这样怎么办呢

我们SDK提供另外一个solution

就是说我们用gray code+phase shift

gray code的意思很简单

就是说我们刚刚的ref plane

从ref plane往上算

当然很容易就算打超过2π的情况

不过ref plane呢

是每四分之p就有ref plane

这样就和农容易

这样就很容易克服这个问题

所以呢,一个产生缩点 是我们产生的八个gray code

线条

所以产生一个π/4 refplane

所以我们就可以不用使用unwrapping

那怎么用呢

或是怎么计算,有一个recording

就是下一页我们会跟大家讲

那这一个呢

camera部分话,我们当然也做同步

所以我们camera会

SDK自动帮你做同步

同步camera跟投影机的capture部分

投影机打出的能量非常精准

所以如果我们要同步的话

能量部分一定会有问题

转换出来的深度资讯也会有问题

所以同步非常重要

那我们SDK有做同步的动作

SDK同步动作很简单

就是说因为camera它速度其实是不稳定的

为什么呢

因为camera什么时候可以capture下一张图呢

限制在你的电脑什么时候可以把图取走

所以这是camera速度其实

说不稳定的原因乃至于你的电脑什么时候能把pattern取走

它才可以做下一张

如果电脑这时候正在忙碌

的话,可能camera的速度是时快时慢

所以我们SDK的做法很简单

就是说我们是利用camera trigger投影机的方法

那camera如果trigger投影机有有一个大问题

就是说什么时候你camera

取得画面是一张投影机打出来的图

这是你不知道的

因为你开始取图的时候

投影机到开始送出pattern的时候

是camera送出的第一个trigger

投影机就打出这个pattern

其实这没有问题

可是呢,电脑是永远都在取图

所以前面会有一大堆的没有用的图

所以这个如何识别第一张图呢

我们的SDK有做

它会自动帮你识别什么是第一张投影机打出来的图

我们有一些error code

来做识别

其实就是投影机帮你做好的动作

但是这有一个问题就是说

因为你有可能要去buffer掉一些没有用的图

所以通常我们就会设定一个足够大的buffer

这个buffer可能到时候因为你的速度等等因素

你要去微调它

可能要把它加大一点

你可以加很大,就看你电脑机体够不够而已

另外的,如果你要project出一个camera的话

你可能这个地方的SDK需要改

project出一个camera的好处就是说

我可以用一个project,然后两个camera

所以我一个project

两个camera的话呢

我一次扫描可以同时取两个,在3D打印机

所以你的物件可能,比如说像是机械手臂

你可能只需要去六十度的一个角度的话

你可能一个投影机+两个camera就能解决

你不用用到一个扫描式

就是你还要动你的scanning

扫描头都不用动

可以这样对应你的应用

就简单很多

我们刚刚讲到说

我们刚有用过gray code

来做decoding

来做3D扫描的处理

到底是怎么做的呢

假设我们今天是个gray code好了

图是这样子的

那camera取到图了

我们会把它解译成叫disparity map

那disparity map到底什么意思呢

我们可以看成这就是解译完的结果

这个agree

其实就是sensor agree,camera sensor agree

假设你这是camera sensor

这是xo,定义0的位置好了

S0 Y0位置

取到的值是这个

那解译了四张pattern之后

我们刚刚讲过

你们说这个0是1 1 1 1pattern

1 1 1 1的sensor值

这四张取出来

这个sensor

得到的就是第一条线来自于投影机

同样的,所有sensor去取

全部都是1 1 1 1,这些全部都是一条线

第二个就是0 1 1 1,我就知道是第二条线

0 0 1 1,那我就知道这是第三条线

以此类推

所以,简单讲,camera sensor最后取到disparity map就是

sensor上,在sensor位置所看到的投影机的第几条线

那如果今天是,我们刚刚讲hybrid pattern的话

怎么样呢

一样,第一步我还是要解gray code

所以我就解出来,这个是第一条线

这第二条线

第三条线、第四条线等等

phase shift我们经过能量来制作

能量会换算出来它shift掉多少

所以每一条线呢,shift理论上是π/4

π/4,那shift掉多少,做线性那条就知道做

理论上这个它看到的是第几条

内差出来的第几条线

所以可以得到gray code第一、第二、第三条

细小线

这是要多细呢

取决于你camera sensor对于这个能量的精准度有多高

所以这块的话

取决于一个非常大的重点,就是说

能量如果越精准

camera取到的如果越精准

那你的这个精准值就越高

越高的话,你可以换算的深度资讯就越高

所以非常容易取到很高等级的程度

DLP另外一个好处就是我们的对比度通常是非常高的

对比度越高的话,比如说我们暗接是0

暗接好像是零点多少

亮接肯定是它的1000倍

所以我们的暗亮的对比度非常高

所以我们可以得到很好的对比效果

能量越弱,可以搭越开

sensor就能够取得更好的值

noise就会变小

所以这是为什么DLP在这块更容易做好的原因就在这里

最后就是我们讲的coding之后,就是叫reconstruction

reconstruction就是说我们得到disparity map之后

如果把它转换成3D资讯

以后的课基本上我们只会一些后续的

一些filter的效果

比如说,如果你有noise的话

可以产生一些filter让你,或者是如果你

想要产生一些数学上的一些suck sample

一些比较细微的点的话

你可以做oversample

这些数学的一些辅助

是没有问题的

我们的演算法其实有两种

reconstruction

第一种我们叫做plane\line的方法

手下投影机打开是一条直线

直线在空间中其实是一个面

一进入 它就产生一个反射光在这里

camera看到,别第几个sensor看到

这条线

所以我们当disparity map,就是这个disparity map呢

我们知道说camera sensor的第几个,camera sensor

看到的投影机的第几条线

这个线其实在空间中会转换成

因为我们现在做calibration

所以这个线我们会得到一个空间的面的公式

这个线其实在空间中是个面

这个面是一个公式

所以我用面跟camera

calibration面是一个公式

线公式

所以我可以透过面跟线在空间中取得一个点

面跟线会取得一个点

解这个公式就可以了

另外呢,另外的方法就是说我们

我们叫做线对线的解法

怎么做呢

如果我们今天打了一个垂直的面

出去

我们知道,投影机的X轴的第几条线打出来的

如果又打一个水平的面

出去

同样的sensor,我会取得两个disparity map

一个是垂直的

投影机的线,一个是水平投影机的线

所以呢,这两个disparity map我会知道说

这个sensor camera上的某一个sensor

跟投影机的某一个像素

打出来的line

光线。这两个光线的交错点

很明显的,大家就知道说

势必的,就只有一个值

势必的就只有这种line to line是最精准的

这一块就会产生一些误差出来

什么误差我们等下可以看

但是line to line就有个大缺点

就是说我垂直化跟水平我要打两倍的pattern

两倍的pattern就会导致什么问题

就是我时间会多一倍

所以在一些,如果你是starting go的条件下

这种情况还是可以用这个方法

就是物件摆在那里,我现在扫描

但是我要求非常高精准度

你可以用line to line去作证

但是如果你物件是在有可能会动的情况下

你可能就不太适用

打这么多pattern

你只能适用这种phase shift

那这样有什么缺点呢

我们看这个有什么缺点

这就是缺点

我们扫描的物件理论上一个面

它是一个面

一个面上应该只有一个点

可是你看,它好像一个光束射进这个面里面

这以前是一个平面

这好像每个地方都有一个光束射进这里面

为什么呢

我们可以往回看一下

这个gray code对不对

disparity map长这个样子

我们刚刚讲的

刚刚讲的一个问题

说投影机打出来是一条线

可以在现实生活中不可能一个东西线是无穷细的

那线一定是有个宽度

所以camera看到它是有个宽度

所以这条线你可以看到

比如说这是四条

四个看到的线

这是三个镜头看到的线

现在这是2,四个镜头看到的线

我们这是四个、五个镜头看到的线

所以呢,在VO world中

camera现在看到的线一定是有一个一定的宽度

那这个宽度发生什么事情呢

往后看

如果想投影机打出来,这个绿色

就是它的线

理论上,数学上它只希望看到这条中间绿色线

可事实上,它其实是一条bug

camera其实是看到这1 2 3 4 5,五个点

可是在公式上

它不知道它是一个bug

它只知道从我来说

从这个camera sensor来说

看到的,它理论上是每个点都是有意义的

所以它看到的是1 2 3 4 5,五个点

解译完这五个点

提取中间这条线

这条线就含了这五个点

这五点就插入这个平面上

就好像这个点是插入这个平面上一样

那怎么解决它呢

解决它的方法其实很多

最简单的方法,当然很简单了

就比如说我们可以用一些built

或者是一些我们刚刚讲的

line to line,也是去打两张pattern

来解决

其实最简单的解决方法

或是最perfect的解决方法

或者是说最优经济效益的解决方法

其实是这样子

我们返回看

如果仅仅打出来是这条线

如果camera sensor这条线呢,我大概只能解译两个点

我的camera sensor对应投影机解析度

如果是match

所以我只要camera sensor在这条bug上只取两个点

这两个点我可以做average之后

只取一个点而已

这样它精准度,它不会浪费camera sensor

第二个呢

我还可以做简单的filter

都会取到比较精准的点

在应用disparity map来做filter

我们往回看一下

如果我今天只有两个点的话就很简单

我只要把这两个做一下filter

把两个取成一点就好了

就是像这样

水平着取一点

做filter的时候就会更简单

所以前提条件是说如果呢

我们可以在做gray code的时候

我们可以利用

camera sensor跟低面积解析度做match的时候

就不会有这个问题

那如果你是gray code+phase shift

或是只有phase shift的话

也不会有这个问题

因为phase shift本身就是有

所有camera sensor都是有意义的

它不会有多余的点出来

因为我们把每一个点都拿来用

我会只知道第一个点是有用的

其他点是做phase shift用的

所以这些点就不会被shift掉

但是前提条件,第一点要是对的才行

所以calibration就变得非常重要

误差会被gray code就是openCV的calibration

累加上去

所以,hybrid的误差其实还是被gray code的误差

累加上去

所以这个gray code变得非常重要

这是另外我们刚刚讲的filter

我们其实在演算法

我们的SDK也有提供

我们叫disparity filter

你可以做smooth,看你要做smooth去改filter就可以了

我们SDK使用的filter是by digital filter

就是对左右两边做线性

做linear decoration the filter

这就是我们SDK全部的流程

所以最终我们产生的是用line to line

或者是plane to line我们产生的是xyz空间的坐标点

会产生一个空间xyz的坐标点

这个SDK support目前所有的系列

但是新的,就是等下会讲的DLP4347x

的新系列还没有support

大概是明年的样子

会等我们的新的DLPC3479出来之后

才一并的开发出新的SDK系列

前面大概就是针对我们DLP或者3D扫描

输入应用的一些介绍

视频报错
手机看
扫码用手机观看
收藏本课程

视频简介

TI DLP 3D SDK 介绍与解析

所属课程:TI DLP®技术于3D 机器视觉与自动化光学检测之应用 发布时间:2018.12.03 视频集数:4 本节视频时长:00:36:34
随着 3D 扫描应用越来越广泛,TI DLP 技术于 3D 扫描能提供高速、高精准与低价位等优点,适用于 3D 机器视觉与自动化光学检测。 本次直播中除了会讲解基础的 3D 介绍,也会针对 TI 3D SDK 做详细的解析。
TI培训小程序