2019年10月23日水曜日

【Kinect_V2】Kinect~Unity間の座標変換

Kinectの基本ストリームの取り出し方、Unityへの取り込み方がだいたい分かってきたのでそろそろ人の形に切り抜いた点群を表示させる方法を考えていきます。

そのまえに、KinectからUnityに3D情報を渡した時の座標変換について、学んだことを簡単にまとめます。

Kinectで取ったBodyの関節ごとの3D座標を、Unityのワールド座標にもっていき、カラー画像にマッチングさせるところまでです。
※UnityにKinect for windowsのUnityパッケージをすでに読み込ませた状態を想定

①Unity上でカラー画像を表示させる。

CubeのScaleを横19.2、縦10.8に設定して作成。これに2つのC#スクリプトをアサインして実行するとkinectのカラー画像が表示される。
Unityの最小単位がメートルなので、19.2m×10.8mの壁に描画されている状態。

②Unityの座標に変換するためのカメラを用意


新しくカメラを作成する。カメラの投影方法は平行投影に変え、Sizeを微調整する。
ちなみに上図の上がワールド空間で見た状態、下が新しく作ったカメラのスクリーン。

スクリーン上の座標は左下が原点で、縦と横の座標が画像のピクセルで表される。
スクリーンで映る範囲を①で作ったCubeがぎりぎり収まるようにカメラのパラメータ(位置とスケール、sizeなど)を決める。

続いて、骨格を表示させる部分に移る。

③骨格を表示させるObjectの作成

次に、骨格を表示させる空のObjectを作る。
このObjectにBodySourceManager.csと、次の手順で修正するBodySourceView.csをアサイン。

④BodySouceView.csの修正


最後にBodySouceView.csの修正する。このスクリプトの中に、座標変換を記述する。
Kinectから取り出したJointデータ(各間接のx,y,z座標)をMapCameraPointToColorSPaceメソッドを使ってkinectのカラー座標(左上が原点で、縦と横がピクセル単位)に変換する。

変換したkinectのカラー座標の数値を、そのままUnityのVector3型の変数のxとyに代入する(スクリーンは2Dなので、zは0にする)。
kinectの画像の大きさをScreenの大きさに合わせるため、倍率調整する。
point.X = point.X * Screen.width / 1920
point.Y = point.Y * Screen.Height / 1080
こうすると、kinectから取り出した骨格のデータがスクリーンの枠内に表示される。

最後に、ConvertCamera.ScreenToWorldPointメソッドを使ってワールド座標に変換する。
※Unityのスクリーン座標は左下から右上に向かって増えていくので、Y座標にマイナスをかけて反転させる。
Z座標は奥行き方向なので、適当な数値を入れる。(0だと表示されないかも)

0 件のコメント:

コメントを投稿

【Grasshopper_98】SporphとSurface Morphingの特徴、違いなどについて

今年もまたGWに突入しましたね。コロナ明けに円安、インバウンド特需のおかげで東京から郊外に出かけると例年以上に混雑に巻き込まれそうなので、昨年と同様、連休中は家に籠ってブログを更新します。今回のテーマは、Surface MorphingとSporphの違いについてまとめてみました。