About Official Python Wrapper

Azure Kinect Sensor SDKのリポジトリにPython Wrapperが取り込まれました。これによりC、C++、C#に続きPythonからもAzure Kinectを利用できます。
この記事ではPython WrapperのインストールとPython APIの使い方について紹介します。

Python Wrapperはまだ正式にリリースされていません。
Azure Kinect Sensor SDKのすべての機能がカバーされているわけではないことに注意してください。(現状では記録・再生の機能がサポートされていません。)

How to Build Python Wrapper

  1. Python 3をインストールする。

  2. NumPyをインストールする。

    pip3 install numpy
    
  3. Azure Kinect Sensor SDKをインストールする。

  4. Azure Kinect Sensor SDKのソースコードをクローンする。

    git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK --recursive
    
  5. 以下のファイルをsrc/python/k4a/src/k4a/_libsディレクトリにコピーする。

    • Windows

      • k4a.dll
      • depthengine_2_0.dll
    • Ubuntu

      • libk4a.so (symbolic link) -> libk4a.so.1.4
      • libk4a.so.1.4 (symbolic link) -> libk4a.1.4.1
      • libk4a.so.1.4.1
      • libdepthengine.so.2.0
  6. コマンドラインを開き以下のコマンドを実行してWheelをビルドする。

    • Windows

      cd ./Azure-Kinect-Sensor-SDK/src/python/k4a/
      powershell -File build_wheel.ps1
      
    • Ubuntu

      cd ./Azure-Kinect-Sensor-SDK/src/python/k4a/
      bash build_wheel.csh
      
  7. 以下のディレクトリに生成されたWheelを利用してインストールする。

    cd ./build
    pip3 install k4a-0.0.2-py3-none-any.whl
    
  8. 正しくインストールされているか確認する。

    C:\>python3
    >>> import k4a
    

Download Pre-Built Wheel

ビルド済みのWheelファイルを配布します。
Python Wrapperを手軽にインストールして利用することができます。

以下のコマンドを実行してインストールすることができます。

pip3 install k4a-0.0.2-py3-none-any.whl

Sample Program for Python API

サンプルプログラムはこちらにあります。

サンプルプログラムはNumPy、OpenCV、Open3Dに依存しています。

pip3 install numpy opencv-python open3d

・Get Data from Image Object

Python APIによるプログラミングも基本的な流れはC++やC#のAPIと同じです。
画像データを扱うImageオブジェクトからデータを取り出すにはk4a.Image.dataを利用します。k4a.Image.dataはnumpy.ndarrayになっているので、OpenCVやOpen3Dでそのまま扱うことができます。

  • OpenCV
# get color image
color_image = capture.color
color_image = color_image.data
print(type(color_image)) # numpy.ndarray
print(color_image.shape) # (720, 1280, 4)
print(color_image.dtype) # numpy.uint8

# show color image using opencv
cv.imshow("color image", color_image)
# get depth image
depth_image = capture.depth
depth_image = depth_image.data
print(type(depth_image)) # numpy.ndarray
print(depth_image.shape) # (576, 640)
print(depth_image.dtype) # numpy.uint16

# show depth image using opencv
depth_image = depth_image * (-255.0 / 5000.0) + 255.0
depth_image = depth_image.astype(np.uint8)
cv.imshow("depth image", depth_image)
  • Open3D
# get xyz_image
xyz_image = transformation.depth_image_to_point_cloud(depth_image, k4a.ECalibrationType.DEPTH)
xyz_image = xyz_image.data
print(type(xyz_image)) # numpy.ndarray
print(xyz_image.shape) # (576, 640, 3)
print(xyz_image.dtype) # numpy.uint16

# convert point cloud (open3d format) from xyz_image
height, width, channels = xyz_image.shape
xyz_image = xyz_image.reshape(height * width, channels)
xyz_image = xyz_image.astype(np.float64)
point_cloud = o3d.geometry.PointCloud()
point_cloud.points = o3d.utility.Vector3dVector(xyz_image)

# show point cloud using open3d
visualizer = o3d.visualization.Visualizer()
visualizer.create_window(window_name="point cloud")
visualizer.add_geometry(point_cloud)
visualizer.run()

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です