首页 > 其他分享 >使用OpenCV中的Structured-Light(结构光)模块做三维重建(流程 + 代码)

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

时间:2022-10-18 15:33:02浏览次数:85  
标签:投影仪 示例 Light 解码 Structured 相机 OpenCV 图像 三维重建



导读

本文主要介绍如何使用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

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

必备知识(本文省略内容)

  • 相机校准
  • 投影仪校准
  • 格雷码编码/解码
  • 三角測量
  • 如何安装使用的库/软件

运行环境

  • 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

    执行时会输出各种条纹图案:

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


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

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

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

【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坐标解码结果可视化图。解码图像中的像素越亮,投影机坐姿图像的坐标值就越大。

使用OpenCV中的Structured-Light(结构光)模块做三维重建(流程 + 代码)_3d_05【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)

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

    动态效果:

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

参考链接:

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

—THE END—



标签:投影仪,示例,Light,解码,Structured,相机,OpenCV,图像,三维重建
From: https://blog.51cto.com/stq054188/5766769

相关文章

  • ZOJ 3203 Light Bulb
    Comparedtowildleopard'swealthiness,hisbrothermildleopardisratherpoor.Hishouseisnarrowandhehasonlyonelightbulbinhishouse.Everynight,he......
  • TiDB Lightning导入超大型txt文件实践
    背景TiDB提供了很多种数据迁移的方式,但这些工具/方案普遍对MySQL比较友好,一旦涉及到异构数据迁移,就不得不另寻出路,借助各种开源或商业的数据同步工具。其实数据在不同系......
  • 实验4:开源控制器实践——OpenDaylight
    基本要求1.利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器;2.通过Postman工具调用OpenDaylight提供的API下发流表,实现拓扑内主机h1和h3网络中断10s。进......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实验要......
  • 实验4:开源控制器实践——OpenDaylight
    (一)基本要求利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器;通过Postman工具调用OpenDaylight提供的API下发流表,实现拓扑内主机h1和h3网络中断10s。(二)进......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubu......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ub......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实......