基于多台azure kinects的点云采集、配准、相加

这篇具有很好参考价值的文章主要介绍了基于多台azure kinects的点云采集、配准、相加。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文采用多台Azure kinect实现了对人体的动态捕捉


前言

  • 如果你是刚接触kinect的小白,建议认真阅读Microsoft给出的官方文档
  • 如果你打算自己开发azure kinect的程序,请参考官方的SDK手册
  • 如果你想在win下配置azure kinect的开发环境,请参考我的上一篇文章
  • 在linux下配置azure kinect会复杂一些,k4a暂时不支持ubuntu 21.04.建议选择20.04LTS或18.04LTS。官方手册中提供了安装指南,在网上也能搜到一些资料,如点击此处。
  • 在本文中,录制视频与生成点云是分开的。 这样做的好处有两点。一是在具体操作时发现如果二者并行,采集速度将会是龟速。二是这里的kinect即使替换为任意的RGB-D相机,该程序仍然可以运行。
  • 本文大部分代码与思想基于此文,大感谢!

提示:以下是本篇文章正文内容,下面案例可供参考

一、多台Azure kinect的配准

1、硬件配准

配准硬件相当简单,具体参见此处。如果使用Daisy-chain configuration,你仅需3.5mm的音频线,一端插入sync out,一端连接sync in。如此反复,将多台kinect连接起来。第一台机器会被自动识别为主设备(master device)。你可以使用SDK中自带的viewer进行查看。打开多个viewer窗口来打开多台设备,依次打开从属设备(subordinate device),最后打开主设备。如果你的配置正确,它们会同时开启。

kinect可以用一根usb-c线同时完成供电与传输信号。如果你打算这么做,且线的长度会超过1.5m,推荐使用有源usb-c线。

The Azure Kinect can be powered in two ways:

  1. The sensor comes with its own USB-C to USB-A cable with power adapter that can used to power the sensor via wall power outlet.
  2. For capturing on location, you can power the device with a USB-C to USB-C cable verified to supply both the power as well as the data transfer.

2、利用k4arecorder录制

如果你想要体验一下自己写代码的乐趣,强烈推荐这个专栏。
但由于笔者照葫芦画瓢写完之后一不小心删除了整个工程文件,并且心灰意冷直接摆烂…
同时sdk自带的工具k4arecorder也可以实现这个功能。具体的介绍也可以在官方文档中找到。

请注意!

  • 使用管理员权限打开终端,不然可能没有权限写入视频文件。
  • 如果找不到k4arecorder.exe的命令,将其替换为k4arecorde试试。
  • 如果你也像笔者一样,需要一个外部触发来实现设备间的同步,可以将所有设备都设置为从属模式,将头一个设备的sync in连接至你的触发源。

二、点云采集

k4arecorder得到的是一个mkv视频文件,其中包括了RGB图,深度图,以及每个时刻的时间戳信息。我们要做的就是读取各个信息,并将其转换到点云文件中。

    for (int i = 0; i < count; i += coord_stride) {
        Eigen::Vector3d q(frame.PointCloudData.data()[3 * i + 0] / 1000.0f, frame.PointCloudData.data()[3 * i + 1] / 1000.0f, frame.PointCloudData.data()[3 * i + 2] / 1000.0f);
        if (q.z() == 0)
        {
            continue;
        }
        // BGR -> RGB
        Eigen::Vector3d color{};
        color.z() = (double)frame.ColorImage.data()[4 * i + 0] / 255.0;
        color.y() = (double)frame.ColorImage.data()[4 * i + 1] / 255.0;
        color.x() = (double)frame.ColorImage.data()[4 * i + 2] / 255.0;

        if (color.x() == 0 && color.y() == 0 && color.z() == 0)
        {
            continue;
        }
        full_cloud[idx]->points_.push_back(q);
        full_cloud[idx]->colors_.push_back(color);
    }

三、点云配准

关于点云配准的文章在CSDN就能查到很多,在这里就不赘述了。一句话概括:点云配准就是一个用各种方法寻找相机间的旋转矩阵的过程。 需要注意如果直接使用ICP配准,很可能陷入局部最优解中。因此我们引入一个编码标志点(fiducial marker)来判断相机的相对位置,再调用ICP来细化相机的位置。

1.基于AprilTag的粗配准[1]

部分代码如下(示例):

            apriltag_detection_info_t info;
            info.det = det;
            info.cx = calibration.Color.cx; // pixels
            info.cy = calibration.Color.cy;
            info.fx = calibration.Color.fx; // mm
            info.fy = calibration.Color.fy;
            info.tagsize = 0.22f; // in meters 按照你的maker大小修改  

其中tagsize取决于你的图片尺寸,计算标准如下:
基于多台azure kinects的点云采集、配准、相加
Apriltag还有其他的参数,如果你想要达到更好的效果,不妨花些时间研究一下。

2.基于彩色ICP的细配准[2]

官网提供的函数示例:

RegistrationResult open3d::pipelines::registration::RegistrationGeneralizedICP	(	const geometry::PointCloud & 	source,
const geometry::PointCloud & 	target,
double 	max_correspondence_distance,
const Eigen::Matrix4d & 	init = Eigen::Matrix4d::Identity(),
const TransformationEstimationForGeneralizedICP & 	estimation = TransformationEstimationForGeneralizedICP(),
const ICPConvergenceCriteria & 	criteria = ICPConvergenceCriteria() 
)	

Parameters:
source: 源点云.
target: 目标点云.
max_distance:最大对应点对距离
init 初始变换估计. 默认值: array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]). (本项目中使用apriltag配准后得到的矩阵)
criteria: 收敛标准.

四、点云相加

两个维度相同的点云相加非常简单,在open3d中,你仅仅需要创建两个指向点云的指针(std::shared_ptr<open3d::geometry::PointCloud>),然后*cloud_A+=*cloud_B即可。要注意指针必须指向某个位置,不然会出现segment fault的问题。比如:full_cloud = std::make_shared<open3d::geometry::PointCloud>();这样指针full_cloud就指向了一个空的点云。


五、开源项目推荐

https://github.com/stytim/k4a-calibration
推荐!实用且好用!不过配置环境较为麻烦,其实如果只是想输出点云文件,可以只安装open3d和sdk,但要修改相应的cmake文件和头文件。
https://github.com/catid/xrcap/tree/master/codecs
此项目实现了windows上的实时人体捕捉,一度让笔者心动不已,但实在没法解决K4a dir not found的问题,最终放弃了。
https://vcl3d.github.io/VolumetricCapture/docs/synchronization/
不多说,看起来就非常炫酷。

总结

其实整个过程还是非常简单的,每个环节都能找到很多前人留下的笔记。笔者从一个两眼一抹黑的c++小白到终于拼拼凑凑做出来,实在是走了很多弯路。Anyway,希望大家都能顺顺利利完成。

参考文献

[1]https://april.eecs.umich.edu/software/apriltag
[2]Jaesik Park, Qian-Yi Zhou, Vladlen Koltun; Proceedings of the IEEE International Conference on Computer Vision (ICCV), 2017, pp. 143-152文章来源地址https://www.toymoban.com/news/detail-456407.html

到了这里,关于基于多台azure kinects的点云采集、配准、相加的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • KSS-ICP: 基于形状分析技术的点云配准方法

    目录 1. 概述 2. 算法实现 3. 实验结果 总结 Reference 三维点云配准是三维视觉领域一个经典问题,涉及三维重建,定位,SLAM等具体应用问题。传统的配准可以被分为两条技术路线,即基于全局姿态匹配的方法以及基于特征点对应的方法。全局姿态匹配通过在全局范围查找变换矩

    2023年04月08日
    浏览(74)
  • Azure Kinect DK点云实时可视化及图像点云按键交互存储(Open3D)

      Azure Kinect DK在python上的使用仍然很空白,开篇blog记录一下利用Open3D开发Kinect DK的笔记,内含利用Open3D对Azure Kinect DK相机读取的信息进行点云实时可视化及图像点云按键交互存储。   对官方的代码做些解读: main函数   代码首先是对argparse 模块的设置,argparse 模块可

    2024年02月05日
    浏览(27)
  • 基于深度学习方法的点云算法5——PointConv(点云分类分割)

    请点点赞,会持续更新!!! 基于深度学习方法的点云算法1——PointNetLK(点云配准) 基于深度学习方法的点云算法2——PointNet(点云分类分割) 基于深度学习方法的点云算法3——PointNet++(点云分类分割) 基于深度学习方法的点云算法4——PCT: Point Cloud Transformer(点云分类

    2024年02月06日
    浏览(32)
  • 点云从入门到精通技术详解100篇-基于 LSTM 的点云降采样(下)

    目录 3.3 实验结果与分析 3.3.1 点云分类实验 3.3.2 点云检索实验 3.4 消融实验

    2024年02月07日
    浏览(30)
  • 基于Open3D的点云处理16-特征点匹配

    将点云数据统一到一个世界坐标系的过程称之为点云配准或者点云拼接。(registration/align) 点云配准的过程其实就是找到同名点对;即找到在点云中处在真实世界同一位置的点。 常见的点云配准算法: ICP、Color ICP、Trimed-ICP 算法流程: 选点: 确定参与到配准过程中的点集。 匹

    2024年02月10日
    浏览(43)
  • 【Kinect】Ubuntu20.04 安装Azure Kinect Sensor

    本文主要记录Ubuntu20.04 安装Azure Kinect Sensor SDK Azure Kinect 人体跟踪 SDK官网 : https://learn.microsoft.com/zh-cn/azure/Kinect-dk/body-sdk-download Linux版本目前只支持 18.04 和 20.04 Azure Kinect 传感器 SDK 官网: https://learn.microsoft.com/zh-cn/azure/Kinect-dk/sensor-sdk-download Linux版本目前只支持 18.04 ,但也能

    2024年02月06日
    浏览(30)
  • 基于Open3D的点云处理17-Open3d的C++版本

    http://www.open3d.org/docs/latest/cpp_api.html http://www.open3d.org/docs/latest/getting_started.html#c http://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-project https://github.com/isl-org/open3d-cmake-find-package https://github.com/isl-org/open3d-cmake-external-project https://github.com/isl-org/Open3D/releases Note: -DBUILD_SHARED_LIBS

    2024年02月09日
    浏览(45)
  • Azure Kinect 使用记录 (一)

    20211111 - 占坑 20211115 - 添加vs编译内容 20220311 - k4abt_simple_3d_viewer 突然用不了了 因项目需要,得用Azure Kinect以及它的SDK进行开发,在这里记录下心得体会,不定时更新 1.0 k4abt_simple_3d_viewer 闪退 之前用着还好好的,突然就用不了了,表现情况是,双击 k4abt_simple_3d_viewer.exe ,出现

    2024年02月06日
    浏览(29)
  • Azure Kinect获取相机内参

    在采集点云数据时需要根据相机不同depth、color分辨率调整对应相机内参u0(px)、v0(py)、fx、fy,那么具体内参怎么获得呢?就跟随ludaner一起来看看吧。 其实Azure-Kinect-Sensor-SDK已经提供了example代码,只需编译运行即可: Azure-Kinect-Sensor-SDK/main.cpp at develop · microsoft/Azure-Kinect-Sensor-S

    2023年04月13日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包