tks_yoshinagaの日記

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

C#で始めるAzure Kinect開発②:カラー画像の表示

1.はじめに

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

 
2.画像描画の準備

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

f:id:tks_yoshinaga:20191203162130p:plain


3) Form1上に配置したPictureBoxをクリック
4) プロパティ内で下記の通り設定
 Size: 640,360  (※元画像のアスペクト比16:9に合わせただけ)
 SizeMode: Zoom (※PictureBoxのサイズ合うように画像をスケール)
5) PictureBoxの位置やFormのサイズを整える

f:id:tks_yoshinaga:20191203162712p:plain


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

f:id:tks_yoshinaga:20191203163007p:plain


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

f:id:tks_yoshinaga:20191203163531p:plain

 

3.描画用の初期設定

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

コード片

gist.github.com

4.画像の取得と表示

1) 使用するクラス(Image,PixelFormat)の読み込みをusingで行う
2) KinectLoopという非同期関数を作成
3) loopというフラグ(bool)を用意しtrueの間はwhile内で下記4-8を繰り返す
4) KinectのフレームをGetCaptureで取得
5) unsafeを使って画像のピクセル情報のポインタにアクセスする準備をする
6) Kinectのカラー情報を保持したBitmap画像を作成しcolorBitmapに代入
7) Bitmap画像をPictureBox(pictureBox1)に貼り付ける
8) Updateメソッドで表示を更新
9) whileを抜けたらKinectをシャットダウン
 (Form1_FormClosingメソッドも書き換える)
10) Form1コンストラクタからKinectLoopを呼び出す

完成版

gist.github.com

10) 実行してカメラの画像が表示されればOK

f:id:tks_yoshinaga:20191203163355j:plain

 

5.まとめと余談

今回はAzureKinectからカラー画像を取得して表示するまでの手順をご紹介しました。カラー画像のみを使用することは少ないかとは思いますが、Kinect接続からリアルタイムデータ取得までの流れを理解するにはちょうど良いのではないかと思います。

このサンプルを作成するうえでハマった点としては、C#でBitmapへの書き込む際によく用いられるBitmapクラスのLockBitsを用いたピクセルデータ取得方法(記事)を用いると、何故か途中でNullReferenceExceptionでシャットダウンしてしまった事が挙げられます。もしかしたら自分の環境のみで起こるエラーなのかもしれませんが同じような問題に直面した方にとっても参考になれば幸いです。