应用笔记12-Vzense 3D ToF相机对齐功能介绍和点云转换

编辑:Sophia.feng 时间: 2024-10-22

基本原理

Vzense的产品具有RGB彩色图像传感器和ToF(Time-of-Flight)深度图像传感器,图像对齐指的是将RGB彩色图像传感器与深度图像传感器,通过坐标系转换,可以在各自的图像中找到世界坐标系下的同一物体的过程。具体地说,由下图可知,彩色图像传感器与深度图像传感器由于其物理位置和光学参数不同,所以在采集同一物体时,由于视差导致同一目标在各自像素坐标系中对应的像素点并不一致。所以需要通过寻找一种空间变换关系,建立一个统一的坐标系,将一副图像映射到另一幅图像上,使得两图中的像素点数据一一对应。

机器视觉系统坐标系的定义和相机参数详解

请参考《技术笔记08-机器视觉系统坐标系和相机内外参详解》。

对齐方式与使用方法

根据以上原理,Vzense的产品设计了两种图像对齐方式:
1、深度图像对齐到彩色图像
2、彩色图像对齐到深度图像

深度图像对齐到彩色图像

此方法是以彩色图像为统一坐标系,将深度图像对应到彩色图像坐标系中,使得彩色图像变为一副每个彩色像素都包含深度信息的彩色图像。如下图所示:

使用场景:
将深度图像对齐到彩色图像的方式,是使用较为广泛的一种形式。例如目标检测场景,在此场景下,通常算法通过彩色图像进行深度学习模型的目标检测,然后获取到彩色图像中的目标框或者分割后的点集。最终使用对齐后的深度图像获取对应点的距离值,用于三维信息的计算与定位。
ScepterGUITool使用方法:
在深度图像的预览界面选项中,选择”DepthImgToColorSensor“,以此开启深度图像到彩色图像的对齐功能。如下图所示:

开启后,在深度/彩色图像中点击鼠标左键,可以看到对齐后点的信息。
SDK相关API
参考例程
BaseSDK/Windows/Samples/Base/NYX650/TransformDepthImgToColorSensorFrame。
对齐功能是默认关闭的,如果使用需要通过如下的API进行调用使能。

//设置使能打开深度图像到RGB图像的对齐
ScStatus scSetTransformDepthImgToColorSensorEnabled(ScDeviceHandle device, bool bEnabled);

//获取深度图像到RGB图像的对齐是否已经使能
ScStatus scGetTransformDepthImgToColorSensorEnabled(ScDeviceHandle device, bool* bEnabled);

//获取图像
status = scGetFrameReady(deviceHandle, 1200, &FrameReady);
if (1 == FrameReady.transformedDepth)
{
    status = scGetFrame(deviceHandle, SC_TRANSFORM_DEPTH_IMG_TO_COLOR_SENSOR_FRAME, &frame);
}

彩色图像对齐到深度图像

此方法是以深度图像为统一坐标系,将彩色图像对应到深度图像坐标系中,使得深度图像变为一副每个深度像素都包含彩色信息的深度图像。如下图所示:

使用场景:
彩色图像对齐到深度图像的方式,适合以深度图像为主进行算法检测然后再获取彩色信息的场景。例如在体积检测等场景中,算法通过深度图像计算物体体积等信息,然后通过获取对齐彩色对象的位置后,在彩色图像中绘制目标框用于预览功能。
彩色图像对齐到深度图像的方式也适用于先用深度图的距离信息做ROI分割,然后再通过对齐后的彩色图像做语义识别,从而降低算力要求的场景。
ScepterGUITool使用方法:
在彩色图像的预览界面选项中,选择“ColorImgToDepthSensor”,以此开启彩色图像到深度图像的对齐功能。如下图所示:

SDK相关API:
参考例程:
BaseSDK/Windows/Samples/Base/NYX650/TransformColorImgToDepthSensorFrame。
对齐功能是默认关闭的,如果使用需要通过如下的API进行调用使能。

//设置使能打开RGB图像到深度图像的对齐
ScStatus scSetTransformColorImgToDepthSensorEnabled(ScDeviceHandle device, bool bEnabled);

//获取RGB图像到深度图像的对齐是否已经使能
ScStatus scGetTransformColorImgToDepthSensorEnabled(ScDeviceHandle device, bool* bEnabled);

//获取图像
status = scGetFrameReady(deviceHandle, 1200, &FrameReady);
if (1 == FrameReady.transformedColor)
{
    status = scGetFrame(deviceHandle, SC_TRANSFORM_COLOR_IMG_TO_DEPTH_SENSOR_FRAME, &frame);
}

如何获取相机内外参?

通过下面软件API可以获取到相机的内参和外参,其中内参可通过参数选择获取ToF相机的还是RGB相机的。
参考例程:
BaseSDK/Windows/Samples/Base/NYX650/DeviceParamSetGet。

//根据传感器类型获取传感器内参
ScStatus scGetSensorIntrinsicParameters(ScDeviceHandle device, ScSensorType sensorType, ScSensorIntrinsicParameters* pSensorIntrinsicParameters);

//根据传感器类型获取传感器外参
ScStatus scGetSensorExtrinsicParameters(ScDeviceHandle device, ScSensorExtrinsicParameters* pSensorExtrinsicParameters);

需要注意,如要用内参转换点云或对齐到世界坐标系,要根据对齐方式来选择使用合适的内参:
如未对齐,则应选择使用ToF相机的内参。
如采用深度图像对齐到彩色图像的方式,则应选择使用RGB相机的内参。
如采用彩色图像对齐到深度图像的方式,则应选择使用ToF相机的内参。

如何从深度图转换点云?

建议用户使用我们SDK的API来实现深度图转换到点云,根据用户需求,我们提供了几种转换点云的方式:
(1)整幅图像转换。整幅图像转换的软件API如下:
参考例程:
BaseSDK/Windows/Samples/Base/NYX650/PointCloudCaptureAndSave。

//深度图像转换为点云图
ScStatus scConvertDepthFrameToPointCloudVector(ScDeviceHandle device, const ScFrame* pDepthFrame, ScVector3f* pWorldVector);

(2)部分像素转换。客户可以只转换部分深度图像素到点云来减少处理器消耗,用如下软件API实现。
参考例程:
BaseSDK/Windows/Samples/Base/NYX650/PointCloudVectorAndSave。

//深度图像点转换为点云图像点
ScStatus scConvertDepthToPointCloud(ScDeviceHandle device, ScDepthVector3* pDepthVector, ScVector3f* pWorldVector, int32_t pointCount, ScSensorIntrinsicParameters* pSensorParam);

但需要注意根据对齐方式选择正确的内参:
如未对齐,则应选择使用ToF相机的内参。
如采用深度图像对齐到彩色图像的方式,则应选择使用RGB相机的内参。
如采用彩色图像对齐到深度图像的方式,则应选择使用ToF相机的内参。

相关文章

How can we support you?

We will be happy to advise you on product selection and find the right solution for your application.

联系我们