Azure kinect DKハンズオン

Please download to get full document.

View again

All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
 0
 
  1. ARコンテンツ作成勉強会 Azure Kinectハンズオン 2. ビルド済みのSDKや演習用素材のDL http://arfukuoka.lolipop.jp/Azure Kinect/Sample.zip 3.…
Share
Transcript
  • 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. 完成
  • Related Search
    We Need Your Support
    Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

    Thanks to everyone for your continued support.

    No, Thanks
    SAVE OUR EARTH

    We need your sign to support Project to invent "SMART AND CONTROLLABLE REFLECTIVE BALLOONS" to cover the Sun and Save Our Earth.

    More details...

    Sign Now!

    We are very appreciated for your Prompt Action!

    x