Azure Kinect DKのSDK/サンプルをビルドする

# はじめに

Azure Kinect DK、入手はしましたが、なかなかまとまって触る時間を確保できません。
Unity初めて触るので、むずかしいです。ようやくDepthから点群表示できるようになりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260166/307c5be4-1714-4568-d295-a70102882955.png" width="50%" />

今回は、まだリリースされてない
SensorSDK v1.2.0(含C#ラッパー)のビルド、KinectFusionのサンプルのビルド　について、メモ

# SDK(インストーラー)
## Sensor SDK
* カラー&深度カメラ,IMUのSDK(マイクはなし)、ビューア,レコーダ,ファームウェアツールも入ってます。

ダウンロードはこちらから

* [Azure Kinect Sensor SDK download | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/Kinect-dk/sensor-sdk-download)
v1.1.0
* [github Azure-Kinect-Sensor-SDK/docs/usage.md](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/usage.md)
v1.1.1もあります

v1.2ではC#のラッパー実装されているので、リリースを待つか自分でビルドしましょう

## Body Tracking SDK
* [Azure Kinect Body Tracking SDK download | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/Kinect-dk/body-sdk-download)

クローズドソース v0.9.0

# Sensor SDKのビルド
基本的には[github Azure-Kinect-Sensor-SDK/docs/building](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/building.md#building)に従えばビルドできます。

以下ステップバイステップで

1. 前提
    VS2019で`C++によるデスクトップ開発`と`C++によるLinux開発`ワークロードをONにした状態で行います。
    以降`x64 Native Tools Command Prompt for VS 2019`を使用
    ※`Developer Command Prompt for VS 2019`とかだと32ビットのほうに行くみたいなので注意が必要

1. クローン
    https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
    developブランチ

1. gitリポジトリのルートに"build"フォルダを作成して移動 

    ```
    mkdir build && cd build
    ```

1. "build"ディレクトリでcmake(Ninja)

    ```
    cmake .. -GNinja
    ```
1. ビルドを実行

    ```
    ninja
    ```

# C#ラッパーのビルド
続いてC# ラッパーのビルドをします。

1. 前提
    C#のプロジェクトは、SDKをNinjaでビルドする前提で構築されているようなので、
    上記SensorSDKのビルドを行ってから始めるとよいです。
    (ソリューション直下にk4a.x64.propsとStubGenerator.x64.xmlが必要)
    参考までにNinjaで生成されるpropsを張っておきます

    ```xml:src\csharp\k4a.x64.props
    <Project>
    <PropertyGroup>
        <K4aGeneratorSourcesDirectory>C:/github/Azure-Kinect-Sensor-SDK/build/src</K4aGeneratorSourcesDirectory>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
        <K4aBinaryDirectory>C:/github/Azure-Kinect-Sensor-SDK/build/bin</K4aBinaryDirectory>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Configuration)' == 'Release'">
        <K4aBinaryDirectory>C:/github/Azure-Kinect-Sensor-SDK/build/bin</K4aBinaryDirectory>
    </PropertyGroup>
    </Project>
    ```

1. depthエンジンのコピー
    SensorSDKインストーラーに同梱されているクローズドソースのバイナリのため、インストールしたSDKからbuild/binにコピーします

    ```
    copy "%ProgramFiles%\Azure Kinect SDK v1.1.0\sdk\windows-desktop\amd64\release\bin\depthengine_1_0.dll" bin
    ```
    
    詳しくは[このへん](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/depthengine.md#windows)

1. ビルド
    \src\csharp\K4a.slnをVS2019で開いてCtrl+Shitf+B


# 非公式 C#ラッパー
[github K4A.Net](https://github.com/bibigone/k4a.net)
`Three-in-one managed .NET library to work with Azure Kinect devices`
Sensor API/Record API/Body Tracking API
全部入りです。

公式のCSharpは現時点ではSensor APIのみなので、C#erな方はこちらが手っ取り早い気もします。


# Kinect Fusionのサンプル
3DスキャンなKinect Fusionのサンプルが公式で公開されています
[github Azure Kinect - OpenCV KinectFusion Sample](https://github.com/microsoft/Azure-Kinect-Samples/tree/master/opencv-kinfu-samples)

C++/CMake不慣れで、動かすまでに時間がかかったので
以下にステップバイステップでメモ


1. ダウンロード＆展開
    1. OpenCV
        OpenCV – 4.1.0　windows(opencv-4.1.0-vc14_vc15.exe)をダウンロードして展開
        [こちらから](https://opencv.org/releases/)
        
    1. OpenCV_Contrib
        opencv_contrib-4.1.0.zipをダウンロードして展開
        [こちらから](https://github.com/opencv/opencv_contrib/releases)
    1. VTK-8.2.0
        VTK-8.2.0.zipをダウンロードして展開
        [こちらから](https://vtk.org/download/)

1. 以降の前提
    * チェックアウト先
        
        `C:\github\Azure-Kinect-Samples\opencv-kinfu-samples`
    * OpenCV/OpenCV_Contrib/VTKの配置
        
        `D:\cv\opencv`
        `D:\cv\opencv_contrib-4.1.0`
        `D:\cv\VTK-8.2.0`
    * CMake GUI
        
        `cmake-3.15.1-win64-x64.msi`をダウンロードしてインストール
        [こちらから](https://cmake.org/download/)

1. includeの展開
    1. OpenCV
        
        ```
        xcopy /S D:\cv\opencv\build\include C:\github\Azure-Kinect-Samples\opencv-kinfu-samples\extern\opencv-4.1.0\include\
        ```
    1. OpenCV_contrib
        
        ```
        xcopy /S D:\cv\opencv_contrib-4.1.0\modules\rgbd\include C:\github\Azure-Kinect-Samples\opencv-kinfu-samples\extern\opencv_contrib-4.1.0\modules\rgbd\include\
        xcopy /S D:\cv\opencv_contrib-4.1.0\modules\viz\include C:\github\Azure-Kinect-Samples\opencv-kinfu-samples\extern\opencv_contrib-4.1.0\modules\viz\include\
        ```

1. VTKのビルド
    1. cmake-gui
        * source code：`D:/cv/VTK-8.2.0`
        * binaries：`D:/cv/VTK-8.2.0\build`
    1. 設定変更
        * CMAKE_INSTALL_PREFIX：`D:\cv\VTK-8.2.0\install`
            (フォルダは手で作成)
        * CMAKE_CXX_MP_FLAG：チェック
        * CMAKE_CXX_MP_NUM_PROCESSORS：`4`
        
        設定変えたら再度ConfigureしてからGenerate
    1. ビルド&インストール
        
        ソリューション`D:\cv\VTK-8.2.0\build\VTK.sln`をVS2019で開いてALL_BUILDをReleaseでビルド
        
        ビルドは時間がかかります。Corei7/NVMe(&RAID0)なデスクトップでも 30分程度…(IO\Geometoryがなかなか終わらない…?)
        
        INSTALLをReleaseでビルド
    [参考1 Visualization Toolkit (VTK) のインストール on Windows, Visual Studio](https://qiita.com/MusicScience37/items/0d197b4fed062b880db1)

1. OpenCV&OpenCV_Contrib
    1. cmake-gui
        * source code：`D:/cv/opencv/sources`
        * binaries：`D:/cv/opencv/build`
    1. 設定変更
        * OPENCV_ENABLE_NONFREE：チェック
        * OPENCV_EXTRA_MODULES_PATH：`D:\cv\opencv_contrib-4.1.0\modules`
        * WITH_VTK：チェック
        * VTK_DIR：`D:\cv\VTK-8.2.0\install\lib\cmake\vtk-8.2`
        
        設定変えたら再度ConfigureしてからGenerate
    1. ビルド
        
        ソリューション`D:\cv\opencv\build\OpenCV.sln`をVS2019で開いてALL_BUILDをReleaseでビルド
        INSTALLをReleaseでビルド
    [参考1](https://github.com/opencv/opencv_contrib)、[参考2](https://blog.negativemind.com/2016/05/27/build-opencv-3-1-with-contrib-module-on-win-10-pro-visual-studio-2015/)

1. libの展開
    
    ```
    SET SRC_DIR=D:\cv\opencv\build\lib\Release\
    SET DEST_DIR=C:\github\Azure-Kinect-Samples\opencv-kinfu-samples\extern\lib\Release
    mkdir -p %DEST_DIR%
    copy %SRC_DIR%opencv_calib3d410.lib %DEST_DIR%
    copy %SRC_DIR%opencv_core410.lib %DEST_DIR%
    copy %SRC_DIR%opencv_highgui410.lib %DEST_DIR%
    copy %SRC_DIR%opencv_imgproc410.lib %DEST_DIR%
    copy %SRC_DIR%opencv_rgbd410.lib %DEST_DIR%
    copy %SRC_DIR%opencv_viz410.lib %DEST_DIR%
    ```
1. 環境変数の設定
    PATHに`D:\cv\VTK-8.2.0\install\bin`と`D:\cv\opencv\build\bin\Release`を追加します

1. Kinfuサンプル
    1. 依存関係の設定
    
        `kinfu_example.vcxproj`に依存関係を設定(とりあえずRelease側で)
    
        ```
        <AdditionalDependencies>%(AdditionalDependencies);opencv_core410.lib;opencv_calib3d410.lib;opencv_rgbd410.lib;opencv_highgui410.lib;opencv_viz410.lib;opencv_imgproc410.lib;</AdditionalDependencies>
        ```
1. ビルド
        `kinfu_example.sln`をVS2019で開き、
        main.cppのL.13あたりにある、"#define HAVE_OPENCV"コメントアウトを外して、Releaseビルド
        ＃Solutionが2017になってるので、VS2019で明示的に開くこと
        ＃VS2017起動してることに気が付かず、VS2017にC++ワークロード入れてなくてハマった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260166/023a3e1a-874a-c440-f8eb-b729d889c0ee.png)


# おわりに
Cのビルドシステムってさっぱり…つらい

Unity入門にお勧めの本とかあれば教えてください。

ところで AzureKinectDK Azure要素あります…？