tks_yoshinagaの日記

KinectやLeap motion, VRやARなどの技術を使ってやったことのメモとか

C#で始めるAzure Kinect開発③:Depth画像の表示

1.はじめに

前々回の記事ではC#のFormアプリケーションでKinectに接続するまでの手順を、そして前回はカラー画像を表示するまでの手順を解説しました。今回はその次のステップとしてDepth画像を取得して表示するまでの手順を紹介します。なお本プログラムは前回と同様、公式サンプルのカラー画像に関する部分をアレンジしたものですので詳細を知りたい方は本家をご覧ください。
※本記事で使用するプログラムは下記の記事①の内容の続きとなります。

 
2.画像描画の準備

1) Form1.cs[デザイン]タブを開く
2) ツールボックスからPictureBoxを選択し、Form1にドラッグ&ドロップ

f:id:tks_yoshinaga:20191203162130p:plain


3) Form1上に配置したPictureBoxをクリック
4) プロパティ内で下記の通り設定
 Size: 640,576  (※元画像の2倍に引き伸ばして表示)
 SizeMode: Zoom (※PictureBoxのサイズに合うように画像をスケール)
5) PictureBoxの位置やFormのサイズを整える

f:id:tks_yoshinaga:20191203190057p:plain


6) [プロジェクト]→[(プロジェクト名)のプロパティ]をクリック

f:id:tks_yoshinaga:20191203190226p:plain

7) 左の列から[ビルド]をクリック
8) 構成から[すべての構成]を選択
9) [アンセーフコードの許可]をチェック

f:id:tks_yoshinaga:20191203163531p:plain

 

3.描画用の初期設定

1) Form1.csのコードを開く
2) InitBitmapというメソッドを作成
3) Kinectで取得したDepth画像を保持するBitmapのメモリを確保
    ※コメントの追加①~③の箇所を新規追加箇所

コード片

gist.github.com

4.画像の取得と表示

1) 使用するクラス(Image,BitmapData,PixelFormat)の読み込みをusingで行う
2) KinectLoopという非同期関数を作成
3) loopというフラグ(bool)を用意しtrueの間はwhile内で下記4-12を繰り返す
4) KinectのフレームをGetCaptureで取得
5) Depth画像を取得しdepthImageに代入
6) 各ピクセルに対応するDepth値の配列のみを取得しdepthArrayに代入
7) depthBitmapの各画素に値を書き込む準備をする
8) unsafeを使って画像のピクセル情報のポインタにアクセスする準備をする
9) 各ピクセルの情報をbyteのポインタとして取得
10) for文で1ピクセルずつ距離情報を画像に書き込む

補足:
depthArrayには各ピクセルに対応する距離情報がmm単位で格納されている。しかし画像はRGBそれぞれ0~256の整数の組み合わせで表現するので、距離情報の画像化には距離(mm)と色との対応付けが必要となる。本記事では最もシンプルなグレースケール(モノクロ表現)を用い500~5000mmを0~255で表現します。

11) Bitmap画像をPictureBox(pictureBox1)に貼り付ける
12) Updateメソッドで表示を更新
13) whileを抜けたらKinectをシャットダウン
 (Form1_FormClosingメソッドも書き換える)
14) Form1コンストラクタからKinectLoopを呼び出す

完成版

gist.github.com

15) 実行してDepth画像が表示されればOK

f:id:tks_yoshinaga:20191203190313j:plain

 

5.まとめ

今回はAzureKinectからDepth画像を取得して表示するまでの手順をご紹介しました。色表現には最も簡単なグレースケールを使用しましたが、他にもHSV変換などを用いることでより高い分解能で表現することも可能です。ご興味のがる方は是非調べてみてください。

 

 

AzureKinectの他の記事はこちら!

tks-yoshinaga.hatenablog.com