前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用OpenCV中的Structured-Light(结构光)模块做三维重建(流程 + 代码)

使用OpenCV中的Structured-Light(结构光)模块做三维重建(流程 + 代码)

作者头像
Color Space
发布2022-09-26 10:09:31
4.3K0
发布2022-09-26 10:09:31
举报

导读

本文主要介绍如何使用OpenCV中的结构光(Structured-Light)模块完成三维重建。(公众号:OpenCV与AI深度学习)

背景介绍 从3.0版本开始OpenCV新增了结构光(Structured-Light)模块。示例代码是一个由两台相机和一台投影仪组成的三维重建程序。本文对此进行了修改,并制作了一个可以使用一台相机和一台投影仪重建 3D结果的程序。【但是,拍摄过程本身并不包含在程序中。它是一个对预先拍摄的图像进行处理的程序】 官方教程: https://docs.opencv.org/4.6.0/d3/d81/tutorial_structured_light.html https://docs.opencv.org/4.6.0/dc/da9/tutorial_decode_graycode_pattern.htm

必备知识(本文省略内容)
  • 相机校准
  • 投影仪校准
  • 格雷码编码/解码
  • 三角測量
  • 如何安装使用的库/软件

运行环境
  • Win 10(64 位)
  • Visual Studio 2015
  • OpenCV >= 3.0.0
  • 投影仪
  • 相机

工作和处理流程

  • 相机和投影仪校准
  • 将格雷码图案投射到目标物体上并拍摄
  • 解码拍摄的图像
  • 根据解码结果和校准结果进行三角测量

【1】相机和投影仪校准/标定 通过下面链接的方法即可: http://qiita.com/nn_tok/items/852e1a7d4d9a1e7d5075 【2】将格雷码图案投影到目标物体上并拍摄 格雷码图案是一种使二进制图案光更智能的识别。二进制模式光的粗略解释是黑白条纹。有多种类型的模式。它投影整个图案,根据是否暴露在光线下生成一个 0,1 位字符串,并根据该位字符串计算投影仪的哪些像素坐标与其对应。由于所有图案都是投影和拍摄的,因此需要拍摄多张图像以生成解码图像。生成格雷码模式的程序如下。(格雷码模式编码和解码只是调用OpenCV中实现的功能) https://github.com/kibekibe/structured_light/blob/master/gray_code/main_encode.cp 执行时会输出各种条纹图案:

将这些模式投射到物体上,以下是捕获的图像的示例:

【3】解码拍摄的图片 解码程序如下: https://github.com/kibekibe/structured_light/blob/master/gray_code/main_decode.cpp 以下是运行时参数的示例: test_img_list.txt 512 384 -white_thresh=1 -black_thresh=5 在第一个参数中,指定一个文本文件,逐行描述捕获的图像列(图片路径)。 分别在第二个和第三个参数中指定投影仪的图像宽度和图像高度。 可选的 -white_thresh 是灯亮和不亮之间亮度差异的阈值。我省略了解释,但格雷码模式包含一个黑白位模式反转的图像。我们正在检查这个位反转图像和亮度值之间是否有足够的差异。 可选的 -black_thresh 是首先检查光线是否正确到达的阈值。阈值判断用于检查投影纯白色图案时和投影纯黑色图案时的亮度值是否存在差异。 执行时会输出解码结果的图像。有两种图像格式,exr 图像和 png 图像。输出 png 用于检查解码结果。 下图从左至右依次为主体、x坐标解码结果可视化图、y坐标解码结果可视化图。解码图像中的像素越亮,投影机坐姿图像的坐标值就越大。

【3】根据解码结果和校准结果进行三角测量 获得解码图像后,您所要做的就是调用 OpenCV 中实现的三角测量函数。即使您不太了解原理也可以做到的方便(^ o ^) 该程序如下: https://github.com/kibekibe/structured_light/blob/master/procam_triangulation/main_procam_triangulation.cpp 以下是运行时参数的示例。 -xMap=x.exr -yMap=y.exr -mask=x.png -cam=camera_data.yml -proj=proj_data.yml -rt=extrinsics.yml -texture=cap_target/DSC04088.JP 分别在 -xMap 选项和 -yMap 选项中指定 x 坐标和 y 坐标解码结果图像。-mask 中指定的图像是指定要在 3D 中恢复的像素的掩码图像。-cam和-proj指定标定得到的相机内参和投影仪内参。格式为 OpenCV yml 或 xml 格式。 -rt 是相机和投影仪之间的外部参数。 -texture 指定要为恢复的 3D点云着色的图像。 示例数据 https://github.com/kibekibe/structured_light/tree/master/sample_data 如果执行示例数据,将得到以下点云(可以适应MeshLab或CloudCompare)

动态效果:

参考链接:

https://qiita.com/nn_tok/items/b2233a5632ec9fcaf714

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

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 必备知识(本文省略内容)
  • 运行环境
  • 工作和处理流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档