讲讲3D相机由深度图的深度值转为实际距离值的标定程序

Posted 苏州程序大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲讲3D相机由深度图的深度值转为实际距离值的标定程序相关的知识,希望对你有一定的参考价值。

讲讲3D相机由深度图的深度值转为实际距离值的标定程序

1、由深度相机获取到深度图

见 深度图 图像(此处深度图不可用,只用于展示。如果需要要原图可以私聊我。发给你们)
在这里插入图片描述

2、获取相机的标定参数

这里指的是深度图的高度值与实际高度值的转换关系。
这里给出示例标定文件

hCalib:=[-0.05222084973043714, -0.002391138992846065, -1.023497609589042;0.0003089211485861814 ,0.09824354104364211 ,29.93117908554381;5.514953089488846e-06 0.0002171078807592449 1]

3、获取图像中所有像素位置的深度值

get_image_size (Image3D, Width, Height)
threshold (Image3D, Region, 1, 65535)
get_region_points (Region, Rows, Columns)
get_grayval (Image3D, Rows, Columns, Grayval)

4、深度图转换为点云图

EncoderStep:=1  //Y向采样间隔(mm)X := Columns
Y_ := EncoderStep * Rows
Z := Grayval * 0.015625
**0.015625为亚像素精度
get_full_matrix (hCalib, Homography)
gtc:= gen_tuple_const(|X|,1)
* transform (x,z) to (x',z')使用投影变换矩阵投影齐次二维点
projective_trans_point_2d (Homography, X, Z, gtc, Qx, Qy, Qw)* 转换为欧几里得坐标系
X_ := Qx/Qw
Z_ := Qy/Qw
* Z_为深度图中每一个灰度值对应的实际距离值

5、创建新的视差图像ImageZ、ImageY、ImageX

gen_image_const (ImageZ, 'real', Width, Height)
reduce_domain (ImageZ, Region, ImageZ)
*将实际距离值赋值给每个像素点
set_grayval (ImageZ, Rows, Columns, Z_)
gen_image_const (ImageZ, 'real', Width, Height)
reduce_domain (ImageX, Region, ImageX)
set_grayval (ImageX, Rows, Columns, X_)
gen_image_const (ImageY, 'real', Width, Height)
reduce_domain (ImageY, Region, ImageY)
set_grayval (ImageY, Rows, Columns, Y_)

6、将视差图像合成为一个三通道图像

compose3 (ImageX, ImageY, ImageZ, Image3DXYZ)

7、结果如图所示

点云展示
在这里插入图片描述
下面附上全面的代码:

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image3D, '深度图.tif')
get_image_size (Image3D, Width, Height)
threshold (Image3D, Region, 1, 65535)
get_region_points (Region, Rows, Columns)
get_grayval (Image3D, Rows, Columns, Grayval)
*深度图转换为点云图
EncoderStep:=0.05  //Y向采样间隔(mm)
X := Columns
Y_ := EncoderStep * Rows
Z := Grayval * 0.015625
**0.015625为亚像素精度
Homography:=[-0.05222084973043714, -0.002391138992846065, -1.023497609589042, \\
             0.0003089211485861814, 0.09824354104364211, 29.93117908554381, \\
             5.514953089488846e-06, 0.0002171078807592449, 1]
gtc:= gen_tuple_const(|X|,1)
* transform (x,z) to (x',z')使用投影变换矩阵投影齐次二维点
projective_trans_point_2d (Homography, X, Z, gtc, Qx, Qy, Qw)
* 转换为欧几里得坐标系
X_ := Qx/Qw
Z_ := Qy/Qw
* Z_为深度图中每一个灰度值对应的实际距离值
* 创建新的视差图像ImageZ、ImageY、ImageX
gen_image_const (ImageZ, 'real', Width, Height)
reduce_domain (ImageZ, Region, ImageZ)
*将实际距离值赋值给每个像素点
set_grayval (ImageZ, Rows, Columns, Z_)
gen_image_const (ImageX, 'real', Width, Height)
reduce_domain (ImageX, Region, ImageX)
set_grayval (ImageX, Rows, Columns, X_)
gen_image_const (ImageY, 'real', Width, Height)
reduce_domain (ImageY, Region, ImageY)
set_grayval (ImageY, Rows, Columns, Y_)
* 将视差图像合成为一个三通道图像
compose3 (ImageX, ImageY, ImageZ, Image3DXYZ)
xyz_to_object_model_3d (ImageX, ImageY, ImageZ, ObjectModel3DModel)
visualize_object_model_3d (WindowHandle, ObjectModel3DModel, [], [], ['lut','intensity','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut)


关注苏州程序大白,持续更新技术分享。谢谢大家支持

以上是关于讲讲3D相机由深度图的深度值转为实际距离值的标定程序的主要内容,如果未能解决你的问题,请参考以下文章

深度学习在耐火砖项目的一些思考

从 3d 点创建深度图

深度相机-介绍

opencv 单目相机pnp测距(Cpp)

相机的内外参与相机标定

相机的内外参与相机标定