点击下方卡片,关注“ OpenCV与AI深度学习

视觉/图像重干货,第一时间送达!

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

背景介绍

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

—THE END—

下载1:Pytoch常用函数手册

在「OpenCV与AI深度」号后台回复:Pytorch函数手册能够学习下载全网第一份Pytorch函数常用手册,包括Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多处理等十四章内容。

下载2:145个OpenCV实例应用代码
在「OpenCV与AI深入」公众号后台回复:OpenCV145能够学习下载145个OpenCV实例应用代码(Python和C++双语言实现)。


CV相关内容讨论交流欢迎加入微信交流群

觉得有用,记得点个赞和在看哟 

内容中包含的图片若涉及版权问题,请及时与我们联系删除