狠狠撸

狠狠撸Share 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

Azure kinect DKハンズオン