SlideShare a Scribd company logo
ARコンテンツ作成勉強会
Azure Kinectハンズオン
ビルド済みのSDKや演習用素材のDL
http://arfukuoka.lolipop.jp/Azure
Kinect/Sample.zip
自己紹介
氏名:吉永崇(Takashi Yoshinaga)
所属:九州先端科学技術研究所(ISIT)
専門:ARを用いた医療支援や運動計測
コミュニティ:ARコンテンツ作成勉強会 主催
#AR_Fukuoka
#AzureKinect
ハッシュタグ
Kinect
 Kinect(キネクト)とはMicrosoft社のゲーム機、XBOX360
専用のジェスチャー入力コントローラとして発売された機器
 カラー画像・深度(Depth)情報の取得や身体の認識等が可能
深度センサ(赤外線プロジェクタ+赤外線カメラ)
カラーカメラ
Kinectの歴史
 ハックされた後、ロボットやxR系の研究者やアーティストに普及
 バージョンアップが繰り返されたがV2が2017年に生産中止
XBOX版
Kinect for Windows
Kinect V2 DevKit
Kinect V2 for
Windows/XBOX
Azure Kinect DK
 2019年6月末に発売開始(米国・中国のみ)
 ゲーム用ではなくビジネス向けの計測機器として販売
Azure Kinect DKの機器概要
 Depth、カラー画像、音声、加速度・角速度
 複数のKinectの間での同期も可能
7つのマイク
Depthカメラ
(TOF方式)
Colorカメラ
加速度・各速度
複数Kinectの同期
特徴①:Point Cloud
従来と比べてDepth(点群)のデータが低ノイズ
Azure Kinect vs Kinect V2
http://azure-v2.glitch.me
特徴②:計測設定のバリエーション
広角 挟角
 視野角は広角/挟角から選択可能
 解像度を犠牲して奥行きの範囲の拡大も可能
 カラー画像やIMUやマイクなど様々なセンサと併用可能
Azure Kinect Viewerで動かそう
Open Device
Azure Kinect Viewerで動かそう
[Depth計測の設定]
NFOV:視野角→狭い
WFOV:視野角→広い
Binned:計測距離→長い
ただし解像度低下
Startで計測開始
Azure Kinect Viewerで動かそう
赤外線画像 Depth画像
Color画像
IMU
(加速度・角速度)
マイク
Azure Kinect Viewerで動かそう
① 3D
②マウスで視点変更
今回のゴール
AzureKinectで取得した点群 (Point Cloud)をリアルタイムにAR表示
注意!
• SDKの更新はGitHub上で頻繁に行われて
いるので今日のサンプルが明日使える保証はあり
ません。
• 現状、開発のための情報も少ないので、GitHubで
公開されているサンプル(C#)を読み解けると役に
立つと思ったため、ハンズオンのコードも公式サンプ
ルに近い形にしています。
そのためUnity的にあまり良いコードでは無い
と思いますのでご了承ください。
プロジェクトの作成
New
プロジェクトの作成
Create Project
プロジェクト名
保存場所
プロジェクトの作成
.NET環境の切り替え
①File
②Build Setting
.NET環境の切り替え
Player Settings
.NET環境の切り替え
Other Settings
.NET環境の切り替え
Scripting Runtime Versionを
.NET 4.X Equivalent
Api Compatibility Levelを
.NET 4.X
AzureKinect SDKの導入
Assetsを右クリック
AzureKinect SDKの導入
①Create
②Folder
AzureKinect SDKの導入
New FolderをPluginsにリネーム
AzureKinect SDKの導入
Pluginsを開いておく
AzureKinect SDKの導入
①Sample¥Pluginsフォルダ
②全ファイルをPlugins
フォルダにドラッグ&ドロップ
AzureKinect SDKの導入
①SDKがインストールされたフォルダを開く
C:¥Program Files¥Azure Kinect SDK
v1.2.0¥sdk¥windows-desktop¥amd64¥release¥bin
②depthengine_2_0.dllを
Pluginsフォルダにドラッグ&ドロップ
PointCloud表示用オブジェクトの作成
右クリック
PointCloud表示用オブジェクトの作成
Create Empty
PointCloud表示用オブジェクトの作成
①GameObject
②PointCloudにリネーム
PointCloud表示用オブジェクトの作成
Add Component
PointCloud表示用オブジェクトの作成
①meshで検索
②Mesh Filter
PointCloud表示用オブジェクトの作成
Add Component
PointCloud表示用オブジェクトの作成
Mesh Renderer
PointCloud表示用オブジェクトの作成
Materialsを開く
PointCloud表示用オブジェクトの作成
Element0を確認
※このあと色つきのPoint Cloud描画を設定する
Point Cloud描画用マテリアルの追加
①Sampleフォルダ
②PointCloudをダブルクリック
③Import
Point Cloud描画用マテリアルの追加
①Assets
②ColoredVertexとPointCloudが追加されている
Point Cloud描画用マテリアルの追加
①PointCloud
②PointCloudをElement0に
ドラッグ&ドロップ
Point Cloud描画用マテリアルの追加
Custom/ColoredVertex
Point Cloud描画用スクリプトの作成
①Point Cloud
②Add Component
Point Cloud描画用スクリプトの作成
①検索ワードを消す
②New Script
③KinectScript
④Create and Add
Point Cloud描画用スクリプトの作成
Scriptが追加されている
Ctrl +S
Point Cloud描画用スクリプトの作成
KinectScriptをダブルクリック
Point Cloud描画用スクリプトの作成
AzureKinectの起動と終了
using UnityEngine;
using Microsoft.Azure.Kinect.Sensor;
public class KinectScript : MonoBehaviour
{
Device device; //Kinectの情報を扱う変数
void Start()
{
InitKinect(); //Kinectを初期化
}
void InitKinect()
{
//Kinectの初期化を行う(次のページ)
}
/*スペースの都合上割愛*/
}
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();
}
動作確認
Play
動作確認
LEDが点灯
動作確認
再度Playをクリックして停止
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;
}
PointCloud描画の準備
int width, height, num;
Mesh mesh; //点(図形)の集合を描画するために使用
Vector3[] vertices; //点群(PointCloud)の各座標を格納
Color32[] colors; //各頂点の色情報を格納
int[] indices; //描画する頂点のリスト
void Start()
{
InitKinect();
InitMesh(); //メッシュ情報の初期化
}
void InitMesh()
{
//次のページで解説
}
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];
//次のページに続く
}
これから描画するもの
まずは試しにDepth画像と同数の点を縦横に並べてみる
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番目の点は描画する
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;
動作確認
ちょっと見づらい
動作確認
①Sceneタブ
②Point Cloudをダブルクリック
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();
}
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;
/*以下割愛*/
AzureKinectからのデータ取得
void Start()
{
InitKinect();
InitMesh();
Task t = KinectLoop( );
}
private async Task KinectLoop( )
{
while (true)
{
//この中でAzureKinectからデータを取り続ける
}
}
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を描画する*/
}
}
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();
}
動作確認、の前に。。。
①MainCameraを選択
②Positionを0 0 0
動作確認
実行中にSceneタブに切り替えると
いろいろな視点から観察できる
Azure Kinectの座標系
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();
}
動作確認
実行中にSceneタブに切り替えると
いろいろな視点から観察できる
色情報の反映 (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();
/*次のページに続く*/
色情報の反映 (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();
動作確認
VuforiaでAR化しよう
File
Vuforia
Build Settings
Vuforia
PlayerSettings
Vuforia
下のほうにスクロール
Vuforia
①XR Settings
②Vuforia Augmented Reality
Vuforia
Accept
Vuforia
チェックされてればOK
Vuforia
MainCameraを削除
Vuforia
空白を右クリック
Vuforia
①VuforiaEngine
②ARCamera
Vuforia
①空白を右クリック
②Vuforia Engine
③Image
Vuforia
①ImageTargetをダブルクリック
Vuforia
PointCloudをImageTargetに
ドラッグ&ドロップ
Vuforia
PointCloudがImageTarget
の子要素になればOK
位置や大きさを整える
①PointCloud
②位置と大きさを調整
Position 0 0.5 -1
Scale 1 1 1
カメラの選択
②Open Vuforia Engine Configuration
①ARCamera
カメラの選択
Camera DeviceでUSBカメラを選択
このマーカーを使って動作確認
完成

More Related Content

PDF
tf,tf2完全理解
PDF
画像生成・生成モデル メタサーベイ
PDF
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
PPTX
OpenVRやOpenXRの基本的なことを調べてみた
PPTX
[DL輪読会]Pay Attention to MLPs (gMLP)
PDF
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
tf,tf2完全理解
画像生成・生成モデル メタサーベイ
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
OpenVRやOpenXRの基本的なことを調べてみた
[DL輪読会]Pay Attention to MLPs (gMLP)
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
Python 3.9からの新定番zoneinfoを使いこなそう

What's hot (20)

PDF
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
PDF
第126回 ロボット工学セミナー 三次元点群と深層学習
PDF
20180527 ORB SLAM Code Reading
PDF
【Unity道場】物理シミュレーション完全マスター
PDF
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
PDF
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
PPTX
【DL輪読会】"Instant Neural Graphics Primitives with a Multiresolution Hash Encoding"
PDF
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
PDF
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
PDF
SLAMチュートリアル大会資料(ORB-SLAM)
PPTX
3次元計測とフィルタリング
PPTX
ORB-SLAMの手法解説
PDF
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
PDF
3次元レジストレーション(PCLデモとコード付き)
PDF
【Unite 2017 Tokyo】Unityで楽しむノンフォトリアルな絵づくり講座:トゥーンシェーダー・マニアクス
PDF
【Unity】 Behavior TreeでAIを作る
PPTX
分散深層学習 @ NIPS'17
PDF
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
PDF
[DLHacks 実装] DeepPose: Human Pose Estimation via Deep Neural Networks
PPTX
デプスセンサとその応用
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
第126回 ロボット工学セミナー 三次元点群と深層学習
20180527 ORB SLAM Code Reading
【Unity道場】物理シミュレーション完全マスター
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
【DL輪読会】"Instant Neural Graphics Primitives with a Multiresolution Hash Encoding"
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
SLAMチュートリアル大会資料(ORB-SLAM)
3次元計測とフィルタリング
ORB-SLAMの手法解説
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
3次元レジストレーション(PCLデモとコード付き)
【Unite 2017 Tokyo】Unityで楽しむノンフォトリアルな絵づくり講座:トゥーンシェーダー・マニアクス
【Unity】 Behavior TreeでAIを作る
分散深層学習 @ NIPS'17
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
[DLHacks 実装] DeepPose: Human Pose Estimation via Deep Neural Networks
デプスセンサとその応用
Ad

Similar to Azure kinect DKハンズオン (20)

PDF
Kinect技術紹介20140407
PDF
Hands on
PDF
KinectでAR空間に入り込もう
PPTX
Build 2021のDigital Twinsセションを読み解く ~Azure関連サービス概要とラーニングパスの詳説~
PPTX
Mixed Realityを活用したIot Edgeの管理と情報の可視化による「Digital Twins」の実現
PPTX
Azure Object Anchors のQuick Startで理解を深めたい
PPTX
ラーニングパス「Azure Digital Twins と Unity を使用して Mixed Reality デジタル ツインを構築する」にAzure ...
PDF
はじめようRGB-Dセンシングと画像処理
PPTX
Mixed RealityとAzure Digital Twinsを組合わせてデジタルツインを可視化するためのTips
PPTX
Unreal Engine でアプリ開発~ MRTK UXTools for Unreal V0.9.0 ~
PDF
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
PPTX
KinectプログラミングStepByStep
PPTX
Azure Digital TwinとUnreal Engineを統合するADTLink Pluginについて
PDF
Elixirでディープラーニング! Keras+PyTorchみたいな DL入門向けライブラリ「Axon」
PPTX
World Locking Tools でAzure Spatial Anchorsが使えるようになった
PPTX
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
PDF
Immersal を活用した AR クラウドなシステム開発とハンズオン!
PPTX
Mixed Reality関連のSDKの状況を調べてみた
PDF
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
Kinect技術紹介20140407
Hands on
KinectでAR空間に入り込もう
Build 2021のDigital Twinsセションを読み解く ~Azure関連サービス概要とラーニングパスの詳説~
Mixed Realityを活用したIot Edgeの管理と情報の可視化による「Digital Twins」の実現
Azure Object Anchors のQuick Startで理解を深めたい
ラーニングパス「Azure Digital Twins と Unity を使用して Mixed Reality デジタル ツインを構築する」にAzure ...
はじめようRGB-Dセンシングと画像処理
Mixed RealityとAzure Digital Twinsを組合わせてデジタルツインを可視化するためのTips
Unreal Engine でアプリ開発~ MRTK UXTools for Unreal V0.9.0 ~
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
KinectプログラミングStepByStep
Azure Digital TwinとUnreal Engineを統合するADTLink Pluginについて
Elixirでディープラーニング! Keras+PyTorchみたいな DL入門向けライブラリ「Axon」
World Locking Tools でAzure Spatial Anchorsが使えるようになった
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Immersal を活用した AR クラウドなシステム開発とハンズオン!
Mixed Reality関連のSDKの状況を調べてみた
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
Ad

More from Takashi Yoshinaga (20)

PPTX
HoloLens2とMeta QuestではじめるWebXR
PPTX
【準備編】OculusQuest/HoloLens2対応WebXR開発
PPTX
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
PPTX
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
PPTX
iPad LiDARで エンジニアカフェを3Dスキャン
PPTX
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
PPTX
Web技術ではじめようAR/VRアプリ開発
PPTX
MRTKをNreal Lightに対応させてみた
PPTX
Nreal Lightハンズオン
PPTX
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
PPTX
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
PPTX
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
PPTX
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
PPTX
Voxon Photonics VX1 で遊んでみた
PPTX
AR-Frame x AR.js入門
PPTX
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
PPTX
コロナ禍中のコミュニティ活動
PPTX
Project HoloBox
PPTX
AR Fukuoka紹介2020
PPTX
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020
HoloLens2とMeta QuestではじめるWebXR
【準備編】OculusQuest/HoloLens2対応WebXR開発
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
iPad LiDARで エンジニアカフェを3Dスキャン
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
Web技術ではじめようAR/VRアプリ開発
MRTKをNreal Lightに対応させてみた
Nreal Lightハンズオン
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
Voxon Photonics VX1 で遊んでみた
AR-Frame x AR.js入門
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
コロナ禍中のコミュニティ活動
Project HoloBox
AR Fukuoka紹介2020
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020

Azure kinect DKハンズオン