狠狠撸
Submit Search
Azure kinect DKハンズオン
?
10 likes
?
14,380 views
T
Takashi Yoshinaga
Follow
础搁コンテンツ作成勉强会での础锄耻谤别碍颈苍别肠迟ハンズオン资料
Read less
Read more
1 of 94
More Related Content
Azure kinect DKハンズオン
1.
ARコンテンツ作成勉強会 Azure Kinectハンズオン
2.
ビルド済みのSDKや演習用素材のDL http://arfukuoka.lolipop.jp/Azure Kinect/Sample.zip
3.
自己紹介 氏名:吉永崇(Takashi Yoshinaga) 所属:九州先端科学技術研究所(ISIT) 専門:ARを用いた医療支援や運動計測 コミュニティ:ARコンテンツ作成勉強会 主催
4.
#AR_Fukuoka #AzureKinect ハッシュタグ
5.
Kinect ? Kinect(キネクト)とはMicrosoft社のゲーム機、XBOX360 専用のジェスチャー入力コントローラとして発売された機器 ? カラー画像?深度(Depth)情報の取得や身体の認識等が可能 深度センサ(赤外線プロジェクタ+赤外線カメラ) カラーカメラ
6.
Kinectの歴史 ? ハックされた後、ロボットやxR系の研究者やアーティストに普及 ? バージョンアップが繰り返されたがV2が2017年に生産中止 XBOX版 Kinect
for Windows Kinect V2 DevKit Kinect V2 for Windows/XBOX
7.
Azure Kinect DK ?
2019年6月末に発売開始(米国?中国のみ) ? ゲーム用ではなくビジネス向けの計測機器として販売
8.
Azure Kinect DKの機器概要 ?
Depth、カラー画像、音声、加速度?角速度 ? 複数のKinectの間での同期も可能 7つのマイク Depthカメラ (TOF方式) Colorカメラ 加速度?各速度 複数Kinectの同期
9.
特徴①:Point Cloud 従来と比べてDepth(点群)のデータが低ノイズ
10.
Azure Kinect vs
Kinect V2 http://azure-v2.glitch.me
11.
特徴②:計測設定のバリエーション 広角 挟角 ? 視野角は広角/挟角から選択可能 ?
解像度を犠牲して奥行きの範囲の拡大も可能 ? カラー画像やIMUやマイクなど様々なセンサと併用可能
12.
Azure Kinect Viewerで動かそう Open
Device
13.
Azure Kinect Viewerで動かそう [Depth計測の設定] NFOV:視野角→狭い WFOV:視野角→広い Binned:計測距離→長い ただし解像度低下 Startで計測開始
14.
Azure Kinect Viewerで動かそう 赤外線画像
Depth画像 Color画像 IMU (加速度?角速度) マイク
15.
Azure Kinect Viewerで動かそう ①
3D ②マウスで視点変更
16.
今回のゴール AzureKinectで取得した点群 (Point Cloud)をリアルタイムにAR表示
17.
注意! ? SDKの更新はGitHub上で頻繁に行われて いるので今日のサンプルが明日使える保証はあり ません。 ? 現状、開発のための情報も少ないので、GitHubで 公開されているサンプル(C#)を読み解けると役に 立つと思ったため、ハンズオンのコードも公式サンプ ルに近い形にしています。 そのためUnity的にあまり良いコードでは無い と思いますのでご了承ください。
18.
プロジェクトの作成 New
19.
プロジェクトの作成 Create Project プロジェクト名 保存場所
20.
プロジェクトの作成
21.
.NET環境の切り替え ①File ②Build Setting
22.
.NET環境の切り替え Player Settings
23.
.NET環境の切り替え Other Settings
24.
.NET環境の切り替え Scripting Runtime Versionを .NET
4.X Equivalent Api Compatibility Levelを .NET 4.X
25.
AzureKinect SDKの導入 Assetsを右クリック
26.
AzureKinect SDKの導入 ①Create ②Folder
27.
AzureKinect SDKの導入 New FolderをPluginsにリネーム
28.
AzureKinect SDKの導入 Pluginsを開いておく
29.
AzureKinect SDKの導入 ①Sample?Pluginsフォルダ ②全ファイルをPlugins フォルダにドラッグ&ドロップ
30.
AzureKinect SDKの導入 ①SDKがインストールされたフォルダを開く C:?Program Files?Azure
Kinect SDK v1.2.0?sdk?windows-desktop?amd64?release?bin ②depthengine_2_0.dllを Pluginsフォルダにドラッグ&ドロップ
31.
PointCloud表示用オブジェクトの作成 右クリック
32.
PointCloud表示用オブジェクトの作成 Create Empty
33.
PointCloud表示用オブジェクトの作成 ①GameObject ②PointCloudにリネーム
34.
PointCloud表示用オブジェクトの作成 Add Component
35.
PointCloud表示用オブジェクトの作成 ①meshで検索 ②Mesh Filter
36.
PointCloud表示用オブジェクトの作成 Add Component
37.
PointCloud表示用オブジェクトの作成 Mesh Renderer
38.
PointCloud表示用オブジェクトの作成 Materialsを開く
39.
PointCloud表示用オブジェクトの作成 Element0を確認 ※このあと色つきのPoint Cloud描画を設定する
40.
Point Cloud描画用マテリアルの追加 ①Sampleフォルダ ②PointCloudをダブルクリック ③Import
41.
Point Cloud描画用マテリアルの追加 ①Assets ②ColoredVertexとPointCloudが追加されている
42.
Point Cloud描画用マテリアルの追加 ①PointCloud ②PointCloudをElement0に ドラッグ&ドロップ
43.
Point Cloud描画用マテリアルの追加 Custom/ColoredVertex
44.
Point Cloud描画用スクリプトの作成 ①Point Cloud ②Add
Component
45.
Point Cloud描画用スクリプトの作成 ①検索ワードを消す ②New Script ③KinectScript ④Create
and Add
46.
Point Cloud描画用スクリプトの作成 Scriptが追加されている
47.
Ctrl +S
48.
Point Cloud描画用スクリプトの作成 KinectScriptをダブルクリック
49.
Point Cloud描画用スクリプトの作成
50.
AzureKinectの起動と終了 using UnityEngine; using Microsoft.Azure.Kinect.Sensor; public
class KinectScript : MonoBehaviour { Device device; //Kinectの情報を扱う変数 void Start() { InitKinect(); //Kinectを初期化 } void InitKinect() { //Kinectの初期化を行う(次のページ) } /*スペースの都合上割愛*/ }
51.
AzureKinectの起動と終了 void InitKinect() { device =
Device.Open(0); //Kinectに接続 device.StartCameras(new DeviceConfiguration { ColorFormat = ImageFormat.ColorBGRA32, ColorResolution = ColorResolution.R720p, DepthMode = DepthMode.NFOV_Unbinned, SynchronizedImagesOnly = true, CameraFPS = FPS.FPS30, }); } void OnDestroy() { device.StopCameras(); }
52.
动作确认 Play
53.
动作确认 LEDが点灯
54.
动作确认 再度Playをクリックして停止
55.
PointCloud描画の準備 Device device; int width,
height, num; //Depth画像の縦幅?横幅?全ピクセル数 void Start(){ /*スペースの都合により割愛*/ } void InitKinect() { device = Device.Open(0); device.StartCameras ( /*スペースの都合により割愛*/ ); //Depth画像の横幅と縦幅を取得し、全点数を算出 width = device.GetCalibration(). depth_camera_calibration.resolution_width; height = device.GetCalibration(). depth_camera_calibration.resolution_height; num = height * width; }
56.
PointCloud描画の準備 int width, height,
num; Mesh mesh; //点(図形)の集合を描画するために使用 Vector3[] vertices; //点群(PointCloud)の各座標を格納 Color32[] colors; //各頂点の色情報を格納 int[] indices; //描画する頂点のリスト void Start() { InitKinect(); InitMesh(); //メッシュ情報の初期化 } void InitMesh() { //次のページで解説 }
57.
PointCloud描画の準備 void InitMesh() { mesh =
new Mesh(); //65535点以上描画する際に下記を記述 mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; //Depth画像の総ピクセル数分の頂点や色の記憶領域を確保 vertices = new Vector3[num]; colors = new Color32[num]; indices = new int[num]; //次のページに続く }
58.
これから描画するもの まずは試しにDepth画像と同数の点を縦横に並べてみる
59.
PointCloud描画の準備 /*前ページの続き(InitMesh内)*/ int index =
0; //何番目の点を操作するのかを表す変数 for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { vertices[index].x = x ; vertices[index].y = y ; vertices[index].z = 2; colors[index].r = 0; colors [index].g = 0; colors [index].b = 255; colors [index].a = 255; indices[index] = index; index++; } } 各頂点の座標を仮置き 各頂点の色を仮置き(=青) index番目の点は描画する
60.
PointCloud描画の準備 /*前頁の続き*/ int index =
0; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { /*スペースの都合により割愛*/ } } //頂点座標と色をmeshに渡す mesh.vertices = vertices; mesh.colors32 = colors; //リストに格納した番号の頂点座標を点として描画 mesh.SetIndices(indices, MeshTopology.Points, 0); //メッシュをこのオブジェクトのMeshFilterに適用 gameObject.GetComponent<MeshFilter>().mesh = mesh;
61.
动作确认 ちょっと見づらい
62.
动作确认 ①Sceneタブ ②Point Cloudをダブルクリック
63.
AzureKinectからのデータ取得 Int[] indices; Transformation trans;
//座標変換(Depth画像→xyzなど) void Start() { /*割愛*/ } void InitKinect() { /*割愛*/ width = device.GetCalibration(). depth_camera_calibration.resolution_width; height = device.GetCalibration(). depth_camera_calibration.resolution_height; num = height * width; /*Depth画像(pixel)を実空間の座標系(mm)に変換したり カラー画像との座標を合わせたりするのに使用する*/ trans = device.GetCalibration().CreateTransformation(); }
64.
AzureKinectからのデータ取得 using UnityEngine; using Microsoft.Azure.Kinect.Sensor; //非同期処理を行う準備 using
System.Threading.Tasks; public class KinectScript : MonoBehaviour { Device device; int width, height, num; Mesh mesh; Vector3[] vertices; Color32[] colors; int[] indices; /*以下割愛*/
65.
AzureKinectからのデータ取得 void Start() { InitKinect(); InitMesh(); Task t
= KinectLoop( ); } private async Task KinectLoop( ) { while (true) { //この中でAzureKinectからデータを取り続ける } }
66.
AzureKinectからのデータ取得 While (true) { //GetCaptureでKinectから送られてくるフレームを取得 using (Capture
capture = await Task.Run(() => device.GetCapture()).ConfigureAwait(true)) { //capture.Depthデプス画像を取得。 //さらにDeptuImageToPointCloudでxyzに変換 Image pImage = trans.DepthImageToPointCloud(capture.Depth); //変換後のデータから純粋に点の座標のデータのみを取得 Short3[] pointCloud = pImage.GetPixels<Short3>().ToArray(); /*このあとPointCloudを描画する*/ } }
67.
AzureKinectからのデータ取得 using (Capture capture
= await Task.Run(() => device.GetCapture()).ConfigureAwait(true)) { Image pImage = trans.DepthImageToPointCloud(capture.Depth); Short3[] pointCloud = pImage.GetPixels<Short3>().ToArray(); //Kinectで取得した全点の座標をmeshで使用する頂点配列に代入 for (int i = 0; i < num; i++) { vertices[i].x = pointCloud[i].X * 0.001f; vertices[i].y = pointCloud[i].Y * 0.001f; vertices[i].z = pointCloud[i].Z * 0.001f; } //meshに情報を反映 mesh.vertices = vertices; mesh.RecalculateBounds(); }
68.
动作确认、の前に。。。 ①MainCameraを選択 ②Positionを0 0 0
69.
动作确认 実行中にSceneタブに切り替えると いろいろな視点から観察できる
70.
Azure Kinectの座標系
71.
AzureKinectからのデータ取得 using (Capture capture
= await Task.Run(() => device.GetCapture()).ConfigureAwait(true)) { Image pImage = trans.DepthImageToPointCloud(capture.Depth); Short3[] pointCloud = pImage.GetPixels<Short3>().ToArray(); //Kinectで取得した全点の座標をmeshで使用する頂点配列に代入 for (int i = 0; i < num; i++) { vertices[i].x = pointCloud[i].X * 0.001f; vertices[i].y = -pointCloud[i].Y * 0.001f; vertices[i].z = pointCloud[i].Z * 0.001f; } //meshに情報を反映 mesh.vertices = vertices; mesh.RecalculateBounds(); }
72.
动作确认 実行中にSceneタブに切り替えると いろいろな視点から観察できる
73.
色情報の反映 (KinectLoop内) while (true) { using
(Capture capture = await Task.Run(() => device.GetCapture()).ConfigureAwait(true)) { //Depth画像との位置?サイズ合わせ済みの画像を取得 Image modifiedColor = trans.ColorImageToDepthCamera(capture); //純粋に各ピクセルの色情報だけを抜き出す BGRA[] colorArray = modifiedColor.GetPixels<BGRA>().ToArray(); Image pImage = trans.DepthImageToPointCloud(capture.Depth); Short3[] pointCloud = pImage.GetPixels<Short3>().ToArray(); /*次のページに続く*/
74.
色情報の反映 (KinectLoop内) /*前頁からの続き*/ //Kinectで取得した全点の座標をmeshで使用する頂点配列に代入 for (int
i = 0; i < num; i++) { vertices[i].x = pointCloud[i].X * 0.001f; vertices[i].y = -pointCloud[i].Y * 0.001f; vertices[i].z = pointCloud[i].Z * 0.001f; colors[i].a = 255; colors [i].b = colorArray[i].B; colors [i].g = colorArray[i].G; colors [i].r = colorArray[i].R; } //meshに情報を反映 mesh.vertices = vertices; mesh.colors32 = colors; mesh.RecalculateBounds();
75.
动作确认
76.
VuforiaでAR化しよう File
77.
Vuforia Build Settings
78.
Vuforia PlayerSettings
79.
Vuforia 下のほうにスクロール
80.
Vuforia ①XR Settings ②Vuforia Augmented
Reality
81.
Vuforia Accept
82.
Vuforia チェックされてればOK
83.
Vuforia MainCameraを削除
84.
Vuforia 空白を右クリック
85.
Vuforia ①VuforiaEngine ②ARCamera
86.
Vuforia ①空白を右クリック ②Vuforia Engine ③Image
87.
Vuforia ①ImageTargetをダブルクリック
88.
Vuforia PointCloudをImageTargetに ドラッグ&ドロップ
89.
Vuforia PointCloudがImageTarget の子要素になればOK
90.
位置や大きさを整える ①PointCloud ②位置と大きさを調整 Position 0 0.5
-1 Scale 1 1 1
91.
カメラの選択 ②Open Vuforia Engine
Configuration ①ARCamera
92.
カメラの選択 Camera DeviceでUSBカメラを選択
93.
このマーカーを使って动作确认
94.
完成