Azure Kinect相机取图并保存RGB、depth和PointCloud(Python实现)

简介:

Azure Kinect相机也是一款消费级的经典相机,相比于Realsense相机,Azure Kinect相机的点云质量更好,但是RGB图像容易有明显的畸变,分享一份取图脚本供研究者或工程师方便使用。

依赖:

Azure Kinect SDK、open3d、opencv、numpy

代码:

import os
import numpy as np
import cv2
import pyk4a
from pyk4a import PyK4A, Config
import open3d as o3d
from datetime import datetime

def save_pointcloud(points, file_name):
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(points.astype(np.float32).reshape(-1, 3))
    o3d.io.write_point_cloud(file_name, pcd)

def save_aligned_images_and_point_cloud(save_dir):
    # 创建 PyK4A 实例
    k4a = PyK4A(
        Config(
            color_resolution=pyk4a.ColorResolution.RES_720P,
            camera_fps=pyk4a.FPS.FPS_30,
            depth_mode=pyk4a.DepthMode.NFOV_UNBINNED,
            synchronized_images_only=True,
        )
    )
    k4a.start()

    # 读取并对齐 RGB 和深度图像
    while True:
        # 获取 RGB 和深度图像
        if k4a.get_capture():
            capture = k4a.get_capture()
            rgb_image = capture.color
            depth_image = capture.transformed_depth
            point_cloud = capture.transformed_depth_point_cloud

            print("rgb:",rgb_image.shape,'depth:',depth_image.shape)

            # 获取点云数据
            point_cloud = k4a.generate_point_cloud(transformed_depth_image)

            if capture.transformed_depth is not None:
                depth_colormap = cv2.applyColorMap \
                    (cv2.convertScaleAbs(depth_image, alpha=0.008)
                     , cv2.COLORMAP_JET)
                cv2.imshow('depth_color', depth_colormap)
            if capture.color is not None:
                cv2.imshow("rgb", capture.color)

            key = cv2.waitKey(1)
            if key == ord('t'):
                timeStr = datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
                # 保存对齐后的 RGB 和深度图像
                cv2.imwrite(os.path.join(save_dir, 'images/color_'+timeStr+'.png'), rgb_image)
                print('color saved', os.path.join(save_dir, 'images/color_'+timeStr+'.png'))
                cv2.imwrite(os.path.join(save_dir, 'depths/depth_'+timeStr+'.png'), depth_image)
                print('depth saved', os.path.join(save_dir, 'depths/depth_'+timeStr+'.png'))
                # 保存点云数据
                save_pointcloud(point_cloud, os.path.join(save_dir, 'point_clouds/pc_'+timeStr+'.pcd'))
                print('point_cloud saved', os.path.join(save_dir, 'point_clouds/pc_'+timeStr+'.pcd'))

            if key == 27:
                cv2.destroyAllWindows()
                break

    # 停止相机和关闭设备
    k4a.stop()

def main():
    # 设置保存路径
    save_directory = "./data"
    if not os.path.exists(save_directory):
        os.makedirs(save_directory)

    # 创建三个子文件夹
    subfolders = ['images', 'depths', 'point_clouds']
    for folder in subfolders:
        folder_path = os.path.join(save_directory, folder)
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)

    # 运行保存对齐的图像和点云
    save_aligned_images_and_point_cloud(save_directory)

if __name__ == "__main__":
    main()
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
Azure Kinect相机捕获的图像可以通过SDK提供的功能进行保存,包括彩色图和深度图。 首先,我们需要使用Azure Kinect SDK中的函数获取彩色图像和深度图像数据。通过调用相应的函数,可以从相机中获取当前帧的彩色图像和深度图像数据。 然后,我们可以将获取到的彩色图像数据保存为一张图片文件。可以使用常用的图像处理库,如OpenCV,来保存图像数据。使用OpenCV库的函数,我们可以将彩色图像数据保存为不同的图像格式,比如JPEG、PNG等。 对于深度图像数据,通常需要使用特定格式的文件来保存。一种常见的方式是使用位图格式(Bitmap)保存深度图像。我们可以使用C#或其他编程语言来创建一个位图对象,并将深度值逐个像素地写入位图中。接着,将位图保存为文件,即可将深度图像数据保存下来。 不仅如此,还可以将彩色图像和深度图像数据保存在其他格式的文件中,比如使用PLY文件格式保存点云数据。这种格式可以容纳彩色图像、深度图像和三维坐标信息,以便后续处理和分析。 总结起来,通过调用Azure Kinect SDK中的函数,我们可以获取到彩色图像和深度图像数据。随后,可以使用常用的图像处理库将彩色图像保存为图片文件,同时将深度图像数据保存为特定格式的文件,如位图文件或PLY文件。这样,我们就能够将Azure Kinect相机捕获的图像进行保存

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值