当前位置: 首页 > news >正文

最近在折腾结构光三维重建,发现格雷码和相移这俩兄弟配合起来干活真挺有意思。今天咱们就手撕几段核心代码,看看怎么用Python把三维模型从二维图像里刨出来

单双目结构光三维重建代码 格雷码相移逆相机

先上点硬货,格雷码生成器用位运算搞起来特别带感:

def generate_gray_code(bits): gray = [] for i in range(1 << bits): gray.append((i >> 1) ^ i) return [format(code, '0{}b'.format(bits)) for code in gray] # 生成4位格雷码 gray_codes = generate_gray_code(4) print(gray_codes) # ['0000', '0001', '0011', '0010', ...]

这段代码里最骚的操作就是(i >> 1) ^ i,通过异或运算把二进制转成格雷码。生成的条纹图案得用投影仪打到物体上,相机拍下变形的条纹。这时候问题来了——怎么从照片里解码出原始编码?

看这个二值化处理的骚操作:

def decode_binary_pattern(img_white, img_black, threshold=30): diff = cv2.absdiff(img_white, img_black) _, binary = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY) return binary

这里用到了环境光消除的技巧,白场图减黑场图能去掉环境光干扰。threshold参数得根据实际光照调整,实验室里可能30够用,但现场环境可能得调到50+。

相移法才是重头戏,相位计算得这么玩:

def compute_phase(imgs, frequency): height, width = imgs[0].shape phase_map = np.zeros((height, width)) for i in range(3): # 三步相移 phase_map += imgs[i] * np.sin(2 * np.pi * i / 3) phase_map += imgs[i] * np.cos(2 * np.pi * i / 3) * 1j return np.angle(phase_map) # 相位主值

这里用了复数域运算,把三张相移图的信息压缩到一个相位图里。不过直接算出来的相位是包裹在[-π, π]里的,得用格雷码来展开相位。

单双目结构光三维重建代码 格雷码相移逆相机

重点来了,把格雷码和相移结合起来的相位展开:

def unwrap_phase(gray_code, wrapped_phase): k = np.zeros_like(wrapped_phase) for i in range(gray_code.shape[0]): k += gray_code[i] * (2 ** (gray_code.shape[0] - 1 - i)) return wrapped_phase + 2 * np.pi * k

这步相当于用格雷码的绝对位置给相移的相对相位做锚点,相当于用GPS定位给惯性导航做校准。实际调试时要注意格雷码边界处的跳变处理,不然容易产生条纹状的误差。

最后的三维坐标计算才是真·魔法:

def calculate_3d(phase_map, projector_params): u = np.arange(phase_map.shape[1]) v = np.arange(phase_map.shape[0]) u, v = np.meshgrid(u, v) z = projector_params['f'] / (phase_map - projector_params['phase_offset']) x = z * (u - projector_params['cx']) / projector_params['fx'] y = z * (v - projector_params['cy']) / projector_params['fy'] return np.dstack((x, y, z))

这里假设了逆相机模型,把投影仪当逆向的相机用。实际工业场景里得做双目标定,单目方案容易受物体表面反射率影响。调试时发现z轴计算对相位误差极其敏感,0.1个像素的相位误差能导致毫米级的深度误差。

整套流程跑下来,单目方案在实验室环境能达到0.1mm精度,但拿到车间里可能就掉到0.5mm了。这时候就得祭出双目结构光方案——多一个相机不只是简单的备份,两个视角的数据融合能有效抑制镜面反射噪声。不过代码复杂度直接翻倍,下次有机会再唠这个。

http://www.jsqmd.com/news/468772/

相关文章:

  • 别再用人工/RFID盘点了!无人零售货架边缘计算实战:Java+YOLOv11s+WebSocket+RK3588,盘点准确率99.2%
  • 【重要概念】CRTP:奇异递归模板模式、零开销多态的编译期魔法
  • Android 应用架构演进与设计指南
  • k8s的service、ingress controller和ingress
  • Unity中使用矩阵实现物体跟随
  • 从Spring Boot到Quarkus:Java+YOLOv11边缘/云端部署双杀!启动快5倍、内存降60%、容器缩70%!
  • 气动力到载荷——BEM理论
  • 恒压供水(无负压供水)系统全图纸程序
  • 智慧调度:让光伏和储能系统共同编织绿色能源网
  • AI教材写作大揭秘:如何利用AI工具实现低查重优质产出!
  • 图片格式转换小技巧:BMP批量变PNG的5种方法分享
  • 软件开发之DevOps
  • 震惊!Nature子刊论文竟有85%的参考文献都是假的!为提高编校质量,期刊编辑部启用这款文献校对软件,已经迫在眉睫!
  • MATLAB 2021b闪退问题排查与解决:字体兼容性案例
  • Python 3.12 MagicMethods - 41 - __imod__
  • 【Halcon】halcon中的常用算子的中文
  • Vue页面加载复杂表单弹窗内存上升页面崩溃的解决方案
  • FCC认证是美国电子市场准入的核心合规门槛,中鉴检测值得信赖
  • 跨网文件安全交换系统的进化之路——更智能、更安全的未来
  • .NET Core 集成 SqlSugar 最简实战(开箱即用)
  • 铌酸锂波导和频技术的研究与应用:引领未来通信技术革新
  • 静态住宅IP安全吗?
  • 当“数字同事”遇上“物理工人”:OpenClaw与人类劳动的终极博弈
  • 习题7-2 求一批整数中出现最多的个位数字
  • Nano Banana 2 实测 – 谷歌 Gemini 3.1 Flash Image 登顶 Arena 生图榜第一
  • 【无标题】从零搭建四大名著NLP分析系统:分词、词频、词性、实体抽取、可视化全攻略
  • 混动汽车建模 [hot]P2运输车混合动力simulink模型[hot] ①(工况可自行添加)...
  • FLASH分区
  • 安卓帝国生存指南:四大组件打工仔与AMS-WMS幕后老板的恩怨情仇
  • 大模型开发从入门到精通:全流程实战+代码解析,一文掌握大模型应用开发全流程指南,值得收藏