初心者がVisual Studio で始める Azure Kinect

3D Sensor Advent Calendar 2019の2日目の記事です。

## 概要
3D センサー歴 3 か月程度の初心者ですが、AzureKinect 手元にあるので、頑張ってみようかと。
目標としては、初心者レベルで Azure Kinect Sensor SDK 使って、接続、動作するところまで試してみたいと思います。

## 環境
- windows 10 pro
- Microsoft Visual Studio Community 2019 Version 16.3.9
- Microsoft .NET Framework Version 4.8.03752
- （Azure Kinect Sensor SDK 1.3.0）

環境としては、上記は Visual Studio しかインストールされていない状態で開始します。
NET デスクトップ開発
C++ によるデスクトップ開発
ユニバーサル Windows プラットフォーム開発
上記は適宜チェックをつけてインストールをしておいたほうが良いと思います。(最低限のモジュールまでは調べてないです）


### まずは C++ で AzureKinect に接続

- C++のコンソールアプリで新しいプロジェクトの作成からC++のコンソールアプリを指定

![コメント 2019-11-30 194802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/27ccbc30-0eba-8a07-0ad5-b30df6299294.png)

- プロジェクト名と配置場所を指定し、空のアプリケーションを作成。

![コメント 2019-11-30 195056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/a6312c17-7479-3657-e0d7-aa0c3ca269b1.png)

- 次の画面で AzureKinectのキーワードで探しパッケージをインストールする。

![コメント 2019-11-30 122106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/01c79290-8f8b-f595-1e0a-c13394e5c137.png)


- プロジェクトが作成出来たら、 Azure Kinect の SDK を入れる。入れ方は以下

1. NuGet で SDK をインストール
2. AzureKinect Sendor SDK をPCにインストールし、モジュールのパスを通す
の二つがあるが、今回は、1のNuGetで取得。「ツール」からNugetパッケージマネージャーの管理でGUIで入れる

![コメント 2019-11-30 121841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/bce691ab-1a7b-a502-8117-9e418f129c4c.png)



- 画面が表示される。このHello,World の部分にスクリプトを入れる。

![コメント 2019-11-30 195134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/236f06f1-f9fb-de5a-787e-4ddf71577604.png)

```c++:ConsoleApplication1.cpp
#include <iostream>
#include <k4a/k4a.h>

int main()
{
    std::cout << "Hello World!\n";

	k4a_device_t device = NULL;

	if (K4A_RESULT_SUCCEEDED != k4a_device_open(K4A_DEVICE_DEFAULT, &device))
	{
		"Device open error!\n";
		return 2;
	}

	std::cout << "Opened device";

	k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
	config.camera_fps = K4A_FRAMES_PER_SECOND_30;
	config.color_format = K4A_IMAGE_FORMAT_COLOR_MJPG;
	config.color_resolution = K4A_COLOR_RESOLUTION_2160P;
	config.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;

	if (K4A_RESULT_SUCCEEDED != k4a_device_start_cameras(device, &config))
	{
		std::cout << "Failed to start!\n";
		return 3;
	}
	else
	{
		std::cout << "Camera started.\n";
	}

	k4a_device_stop_cameras(device);

	std::cout << "Device stopped.\n";

	k4a_device_close(device);

	std::cout << "Camera closed.\n";

}

```
- ビルドからソリューションのビルドを実行。

![コメント 2019-11-30 200746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/d24c03ae-29e9-ca04-c154-730de8899990.png)

- アプリケーションを実行。ディレクトリや実行ファイル名などは適当に読み替えてください。
- 実行すると以下のような結果となり、無事接続成功。

```
D:\>"D:\ConsoleApplication1\Debug\ConsoleApplication1.exe"
Hello World!
Opened deviceCamera started.
Device stopped.
Camera closed.
```

上記で、Visual Studio の C++ で Azure Kinect に接続することができました・・・

#って何も動いてないよね

・・・すみません。C++バージョン、コンソールで接続、以外何も見えるものできてません。 C++ の描画ライブラリに手こずって、C++ で動かすところまでいきませんでした。なので、もう一つやります。

### 改めて C# サンプルを使って AzureKinect で接続、画面に表示できるところまで・・・

- 今度は、表示ができるように C# WPF ライブラリのサンプルを使用する。公式サンプルの https://github.com/microsoft/Azure-Kinect-Samples
からをダウンロード。

![コメント 2019-12-01 191649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/ba7b4cc4-dc61-10f9-fce5-1d434cf34104.png)

- Download したら適当なフォルダに展開し、build2019/csharp 配下のサンプルを試す。 

![コメント 2019-12-01 191910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/1f4861b1-3b59-6dcc-521a-f64d4ac77fb8.png)

- とりあえず 1-AquiringImages 下のソリューションファイル（.slnという拡張子）を開く。自分の環境ではセキュリティ警告とターゲットフレームワークがインストールされてませんと出るけどそのままOKを押す。

![コメント 2019-12-01 192513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/7178bcc2-2996-c84a-3c6e-36f30425a0d9.png)

- 忘れないように Azure Kinect Sensor SDK を NuGet でインストールする。
- リリースにして、ソリューションのビルドを実行する。
- ちなみに本体プログラムは Mainwindow.xaml.cs なので、詳細を変えたければここを変える。

![コメント 2019-12-01 192759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/ae9894c7-7b79-524c-d05e-fef6cee9253e.png)

- 正常終了したら bin の中にプロジェクトの名前の実行可能なファイルが作成される。

![コメント 2019-12-01 193152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/4ffeba13-ef7f-9396-7642-fcbc27a2c0c2.png)

- 上からカラーカメラ取得 、 深度を色で表現したもの 、 色での識別、（4つめのはAzure の Cognitiveサービス使用が必要そうなので今回は割愛）

![コメント 2019-12-01 193403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/89390baf-e9e7-2925-bf71-05f56c01d908.png)
![コメント 2019-12-01 195217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/f785d30a-d736-f9ae-57e9-01e939ba3344.png)
![コメント 2019-12-01 195512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389500/513e3fa0-2ef9-98ef-d0d9-6078c65bd9e0.png)

やっと、何とか表示までできました・・・。


## 振り返り

- 今回は、 C++ と C# を初心者でも動かせるように解説したかった。すごい初歩だが、苦戦しながらなんとか完了。
- でも、 世にある AzureKinect の C++ サンプルは、動作するまでかなり大変そう。(C++知識がないのと、ライブラリが各々違ってコンパイルがなかなかできない)
- C# の方が描画などは楽かもしれない（でも AzureKinect の C#Sample も少ない）

ということで、次は Unity で頑張ってみます。

明日12/3(火)は @SatoshiGachiFujimoto さんの「PythonでRealSenseD400シリーズ入門」です。Python入門、私も書こうと思ってましたが、他のものにしようかな・・・楽しみにしています。