提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言一、同步多台设备二、配准多台设备2.1 四个坐标系2.2 世界坐标系到相机坐标系2.3 相机坐标系到图像物理坐标系2.4 图像物理坐标系到像素坐标系2.5 张正友标定

三、多台设备3维空间信息重建总结

前言

本文章讲解 多台Azure Kinect配准与三维重建点云融合 的相关理论及思路,相关代码将免费开源至github,敬请期待。

一、同步多台设备

在进行多相机或者双相机的数据采集时,为了使得各相机所捕获的每一帧数据都是同一时刻的场景,因此需要对各个相机间进行同步操作。当有多个Kinect Azure设备同时连接时,需将它们分成master属性(主设备)和subordinate属性(从属设备)两种,其中主设备有且只有一个,剩下的全部为从属设备。 每个 Azure Kinect DK 设备附带 3.5 毫米同步端口(输入同步和输出同步),可将多个设备链接在一起。 连接设备后,软件可以协调设备之间的触发定时。 需要注意的是,“同步输入”和“同步输出”插孔需要拆下Azure Kinect DK外部塑料盖才能看到。 同步的配置有两种,可使用以下任一方法来完成设备配置: 菊花链配置。 同步一个主设备以及最多八个从属设备。在菊花链配置中连接 Azure Kinect DK 设备步骤:

将每个 Azure Kinect DK 连接到电源。将每个设备连接到其自身的主机。选择一个设备充当主设备,并将 3.5 毫米音频线插入该设备输出同步端口。将该线缆的另一端插入第一个从属设备的输入同步端口。若要连接另一个设备,请将另一根线缆插入第一个从属设备的输出同步端口,以及下一个设备的输入同步端口。重复上述步骤,直到所有设备都已连接。 最后一个设备应连接了一根线缆。 其输出同步端口应该是空的。 星形配置。 同步一个主设备以及最多两个从属设备。在星形配置中连接 Azure Kinect DK 设备步骤:将每个 Azure Kinect DK 连接到电源。将每个设备连接到其自身的主机。选择一个设备充当主设备,将耳机分线器的单体端插入其输出同步端口。将 3.5 毫米音频线连接到耳机分线器的“分接”端。将每根线缆的另一端插入某个从属设备的输入同步端口。 触发器源必须使用 3.5 毫米音频线将信号传送到主设备的输入同步端口。线缆长度应小于 10 米,可以是立体声或单声道音频线。可以使用立体声或单声道音频线。 Azure Kinect DK 会将音频线连接器的所有套管和套环短接到一起,并将其接地。 如下图所示,设备只从连接器尖端接收同步信号。

实际采集场景可如下所示: 每个Azure Kinect DK可以连接至不同的主机,也可以全部连接至同一台主机。可以根据设备的使用方式以及通过 USB 连接传输的数据量使用专用主机控制器。 注意:每个连接设备的软件必须配置为以主模式或从属模式运行。使用外部同步时,始终应先启动从属相机,然后再启动主相机,这样才能正常调整时间戳。 连接设备完成后简单地验证设备是否已连接并可通信,步骤如下:

打开 Azure Kinect 查看器的两个实例。在“打开设备”下,选择要测试的从属设备的序列号。在“外部同步”下,选择“从属设备”。选择“开始”。启动从属设备后,使用 Azure Kinect 查看器的另一实例打开主设备。在“外部同步”下,选择“主设备”。选择“开始”。Azure Kinect主设备启动后,Azure Kinect查看器两个实例应显示图像。 除此之外,也可以自己编写代码完成多台设备的同步采集。

二、配准多台设备

验证设备可正确通信后,接下来可对其进行校准,以便在单个域中生成图像。 在单个设备中,深度相机和 RGB 相机已经过出厂校准,可以协同工作。 但是,如果必须一同使用多个设备,则必须对这些设备进行校准,以确定如何将图像从捕获它时所在的相机域转换为用于处理图像的相机域。 目的:多摄像机转移矩阵的标定可以将多摄像机人体姿态转移到同一空间坐标。多摄像头的标定是为了通过标定技术获取两个或更多摄像头的相机坐标之间的旋转平移矩阵。 方案:目前使用的比较多的标定方法是张正友标定法(黑白棋盘格标定)。对于单个传感器而言,该方法可以计算传感器的内参、畸变参数以及传感器坐标系和世界坐标系之间的外参。对于两个传感器而言,可以计算它们之间的外参。 简而言之,配准就是一个用各种方法寻找相机间的旋转矩阵的过程。 配准之前,需要了解以下知识:

2.1 四个坐标系

世界坐标系:即物体在真实的物理环境所在坐标系。 相机坐标系:即以相机的的中心点为原点而建立的坐标系。相机的光轴通过该原点,且为该坐标系的Z轴。 图像坐标系:即所获得的图像所在的坐标系,图像的中心即为该坐标系的原点。需要注意的是,相机的光轴也通过图像坐标系的原点。 像素坐标系:即以图像的左上角(或者左下角)为原点的坐标系举个例子,CCD传感上上面的8mm x 6mm,转换到像素大小是640x480. 假如dx表示像素坐标系中每个像素的物理大小就是1/80. 也就是说毫米与像素点的之间关系是piexl/mm.需要注意的是,像素坐标系中的点,以像素来表示,而非距离单位。像素坐标系与图像坐标系均在像平面上,范围与图片尺寸有关。 相机坐标系和图像物理坐标系: 其中点X为相机坐标系下的现实世界中的点,XYZ为像机坐标系,xyz为图像坐标系,右图为正视图,f代表相机的焦距。 四个坐标系的叠加:

2.2 世界坐标系到相机坐标系

旋转变换: 平移变换:

2.3 相机坐标系到图像物理坐标系

2.4 图像物理坐标系到像素坐标系

坐标系变换的总结

2.5 张正友标定

张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法。传统标定法的标定板是需要三维的,需要非常精确,这很难制作,而张正友教授提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可以。同时也相对于自标定而言,提高精度,便于操作。因此张氏标定法被广泛应用于计算机视觉方面。 已知相机的内参和外参,将他们重新表示为: 容易发现B是一个对称阵,所以B的有效元素就剩下6个,即

通过至少含一个棋盘格的三幅图像,应用上述公式我们就可以估算出B了。得到B后,我们通过cholesky分解 ,就可以得到摄相机机的内参阵A的六个自由度,即: 且R具有正交性和归一性,所以

此处K等于上述的A,一个H矩阵可以提供两个方程,对于5自由度的A,至少需要三幅图片可以求解。但上述的推导结果是基于理想情况下的解,由于可能存在高斯噪声,所以使用最大似然估计进行优化。采用更多的图片(20幅有效图片),每幅图片有更多角点(8*6棋盘格)。 根据上述原理可以求得单个传感器的外参,分别求出两个设备的颜色传感器的外参,就可以计算出两个颜色传感器间的外参。

2.6 实际操作 可以通过opencv库实现相机标定。使用opencv库实现相机标定的步骤如下:

相机获取一帧图像,由图像格式转为Mat矩阵利用findChessboardCorners()函数识别图像中的棋盘格角点位置drawChessboardCorners()函数可以查看识别的角点位置是否准确当有足够多张图后,调用calibrateCamera()以获取单相机的内外参和畸变系数;调用stereoCalibrate()以获取双相机间的外参(R、t)。 Microsoft 提供了使用 OpenCV 方法的 GitHub 绿屏代码示例。 此代码示例的自述文件提供了有关校准设备的更多详细信息和说明。

三、多台设备3维空间信息重建

此处建议录制视频与生成点云是分开的。 这样做的好处有两点:一是在具体操作时发现如果二者并行,采集速度将会是龟速。二是这里的kinect即使替换为任意的RGB-D相机,该程序仍然可以运行。 Kinect Azure通过k4a_device_get_calibration函数可以获取各传感器的内参以及它们之间的外参,并存放在k4a_calibration_t数据类型中,方便使用者直接获取数据。在SDK提供的各函数接口中,会通过k4a_transformation_create函数将k4a_calibration_t数据类型转换成k4a_transformation_t类型后进行使用。换句话说,直接使用SDK提供的函数时用k4a_transformation_t类型,需要读取内外参具体数据时用k4a_calibration_t类型。 通过k4a_transformation_color_image_to_depth_camera函数可以获取到深度图像上每个像素对应的彩色值,并保存在同分辨率的transformation_color_image图像中。通过k4a_transformation_depth_image_to_point_cloud函数可以获取到深度图像上每个像素对应的点云坐标。最后遍历每个像素点,将对应的点云坐标和彩色数据写在构造的color_point_t结构体中作为一个彩色点,排除数据异常点后,所有被写在vector向量中的点即为单相机获得的单帧点云数据。可以使用PCL点云库生成点云。 得到单个相机的点云后,将所有点云进行融合,根据第二步配准得到的外参,我们可以将不同视角的点云融合至同一视角,达到三维重建的效果。 三维重建点云融合流程如下图:

总结

以上就是今天要讲的内容,本文章讲解 多台Azure Kinect配准与三维重建点云融合 的相关理论及思路,相关代码将免费开源至github,敬请期待。

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。