MRが楽しい

MRやVRについて学習したことを書き残す

AzureKinectSDKのサンプルプログラムをPythonの拡張モジュールとしてインストールする その1(拡張モジュールの作成とビルド)

本日は AzureKinectSDK の技術調査枠です。
AzureKinectSDKのサンプルプログラムをPythonの拡張モジュールとしてインストールする一例を記事にします。
f:id:bluebirdofoz:20191126094214j:plain

今回は拡張モジュールの作成とビルド手順です。

対象とするサンプルプログラム

今回は AzureKinectSDK の sample に含まれる transformation のキャプチャ機能をモジュール化します。
github.com

transformation は AzureKinect のキャプチャや記録データから点群データ(*.ply)ファイルを出力サンプルプログラムです。
今回は本コードを利用して点群データのキャプチャ機能を Python のモジュールとしてインストールします。
f:id:bluebirdofoz:20191126094203j:plain

必要な環境とファイル

事前に以下のツールのインストールとファイルの取得を行います。
・AzureKinectSDK
・libjpeg-turbo
・AzureKinectSDKのソースコード

以下の記事に従ってツールのインストールを実施します。
bluebirdofoz.hatenablog.com
bluebirdofoz.hatenablog.com
github.com

[Download ZIP]からソースコードがダウンロードできます。
今回、必要となるのは examples/transformation/ 配下のファイルだけです。
f:id:bluebirdofoz:20191126094254j:plain

拡張モジュール用コードの作成

examples/transformation/ 配下の以下のソースコードを利用します。
・main.cpp
・transformation_helpers.cpp
・transformation_helpers.h
これらを作業用ディレクトリにコピーします。
f:id:bluebirdofoz:20191126094332j:plain

main.cpp を改変し、以下の kinect_capture.cpp ファイルを作成しました。
main 関数を Python の拡張モジュールとして登録する関数に置き換えています。
kinect_capture.cpp

これで拡張モジュール kinect_capture を定義する kinect_capture.cpp が作成できました。
更に、作業ディレクトリにビルド設定を記述する setup.py も作成します。
f:id:bluebirdofoz:20191126094350j:plain

transformation のサンプルを利用する場合、k4a の他、libjpeg-turbo のライブラリの参照を追加する必要があります。
以下の通り、setup.py を記述しました。
・setup.py

from distutils.core import setup, Extension

setup(
    name="kinect_capture",        # モジュールの名前
    version="1.0.0",              # モジュールのバージョン
    author="holomon",             # モジュールの作者
    url="",                       # モジュールのホームページ
    description="description",    # モジュールの説明(help(hello)で確認可能)
    install_requires=[],          # 依存パッケージ([pip install -e .]実行時に一緒にインストール)
    extras_require={
        "develop" : [],           # 拡張依存パッケージ([pip install -e . develop]実行時に一緒にインストール)
    },
    ext_modules=[                 # モジュールのソース
        Extension(
            # モジュールの名前
            'kinect_capture',
            # モジュールの外部参照ライブラリ名
            libraries= ['k4a', 'turbojpeg-static'],
            # モジュールのソースコードファイル名
            sources= ['kinect_capture.cpp', 'transformation_helpers.cpp'])
    ]
)

これでコードの作成は完了しました。
次はビルド環境の準備を進めます。

Includeファイルのコピー

今回のソースコードは k4a/k4a.h と turbojpeg.h のヘッダファイルを参照しています。
最初にこれらのヘッダファイルを Python の include ディレクトリに追加し、参照を追加します。

以下の k4a.h のヘッダファイルを含む k4a ディレクトリを Python 配下の include ディレクトリにコピーします。
・コピー元

C:\Program Files\Azure Kinect SDK v1.3.0\sdk\include\k4a

・コピー先

C:\Users\(ユーザ名)\AppData\Local\Programs\Python\Python37\include

f:id:bluebirdofoz:20191126094417j:plain

turbojpeg.h のヘッダファイルも同様に Python 配下の include ディレクトリにコピーします。
・コピー元

C:\libjpeg-turbo64\include\turbojpeg.h

・コピー先

C:\Users\(ユーザ名)\AppData\Local\Programs\Python\Python37\include

f:id:bluebirdofoz:20191126094426j:plain

Libファイルのコピー

次にライブラリファイルを Python の libs ディレクトリに追加し、ライブラリへの参照を追加します。
以下の k4a.lib のライブラリファイルを Python 配下の lib ディレクトリにコピーします。
・コピー元

C:\Program Files\Azure Kinect SDK v1.3.0\sdk\windows-desktop\amd64\release\lib\k4a.lib

・コピー先

C:\Users\(ユーザ名)\AppData\Local\Programs\Python\Python37\libs

f:id:bluebirdofoz:20191126094437j:plain

turbojpeg のライブラリファイルも同様に Python 配下の libs ディレクトリにコピーします。
turbojpeg-static.lib ファイルがスタティックリンクライブラリになります。
・コピー元

C:\libjpeg-turbo64\lib\turbojpeg-static.lib

・コピー先

C:\Users\(ユーザ名)\AppData\Local\Programs\Python\Python37\libs

f:id:bluebirdofoz:20191126094446j:plain

kinect_captureのビルド

これで kinect_capture のビルドの準備が整いました。
作業用ディレクトリを開き、右クリックから[PowerShellウィンドウをここに開く]を実行します。
f:id:bluebirdofoz:20191126094457j:plain

以下のコマンドを実行し、kinect_capture のビルドを実行します。

python .\setup.py build

f:id:bluebirdofoz:20191126094507j:plain

ビルドが成功すると、build ディレクトリが生成され、kinect_capture.cp37-win_amd64.pyd ファイルが出力されます。
cp37-win_amd64 の部分はビルド環境の情報が反映されます。
f:id:bluebirdofoz:20191126094516j:plain

これで kinect_capture のビルドは完了です。
次回は kinect_capture のインストールと実行確認を行います。
bluebirdofoz.hatenablog.com