【本サイトのご利用指針】
当サイトはSPAM対策等のためJavaScriptを使っています。
JavaScriptの実行を可能な状態にしてご利用下さい。
Please enable the execution of JavaScript!
















































【Kinect Sensorを利用して拡張現実センサを作る試み】

    【リンクフリー】 私設研究所ネオテックラボ Neo-Tech-Lab.co.uk
【記載者】 【私設研究所Neo-Tech-Lab】 上田 智章
作成日 2011/01/08
更新 2011/04/03
最終更新 2012/05/16
ここにチェックボックス型外部コンテンツ・メニューが入ります。




【ブラウザはGoogle Chrome】
●最新版ダウンロードはこちら

【お知らせ】

Windows7でChromeがフリーズを起こす場合は、コントロールパネル⇒管理ツール⇒サービス でWindows Media Player Network Sharing Serviceを停止かつ無効にします。Micorosoftのバグです。

【はじめに】

 本来見ることができない物理量を3次元的に可視化する拡張現実センサを実現する手段のひとつとして、Microsoft社のXBOX 360用モーションキャプチャーKinect Sensorに着目し、あれこれ試作を繰り返しています。
 このページでは、高周波磁界分布や超音波を3次元的に可視化する拡張現実センサを例に挙げてKinect Sensorの使い方を説明します。
【写真1】Microsoft社のXBOX 360用モーションキャプチャーKinect Sensor

秀和システムさんより発売中。
『Kinect for Windows SDKプログラミング Kinect for Windows V2センサー対応版』
   単行本発売開始 – 2015/5/22
   中村 薫 (著), 杉浦 司 (著),
   高田 智広 (著), 上田 智章 (著)
   単行本 ¥3,672   Kindle版 ¥3,060

 ■本書で紹介されているサンプルプログラムの入手に関して


【講演・技術セミナー予定メモ】

【トリケップス セミナー】

【題  名】『Kinect for Windows V2(ToF方式3D距離画像センサ)の基礎とその応用』
【副  題】~非接触バイタルセンシングの測定原理から人間センシングまで~
【開催日時】2015年11月6日(金)10:30-17:00【予定】
【会  場】オーム ビル(千代田区神田錦町)
【開催履歴】
  (1)2013年05月24日 (2)2013年08月30日 (3)2014年02月07日 (4)2014年06月20日
  (5)2014年08月29日 (6)2014年11月28日 (7)2015年03月18日 (8)2015年07月10日
【概略内容】
1.3Dセンサの開発動向と各種センサの特徴を概説します。
2.2014年10月に発売されたMicrosoft社のKinect for Windows V2の基本機能と潜在能力
 を示すデモの実演を行い、センサ仕様の概要説明を行います。
また、V1とV2の差異についても比較しながら説明を行います。
 ・Kinect for Windows V2は、xy解像度の高いToF(Time of Flight)方式
 ・Kinect for Windows V1は、z解像度の高いストラクチャ系(3Dスキャナ向け)
3.ストラクチャ方式(V1)、ToF方式(V2)、次世代学習型Infrared Depth方式のデプスカメラ
 の動作原理説明をデモを実演しながら説明します。
4.非接触バイタル・センシングの動作原理説明とデモ実演を行います。
5.その他、人間センシング応用に関しても動作原理説明とデモ実演を行います。
■その他、SDKのセットアップや基本的な事例の資料は添付、あるいはサンプルプログラムのダウンロードができます。

【日本テクノセンター セミナー】

【題  名】『Kinect for Windows V2(ToF方式3D距離画像センサ)の基礎と活用のポイント〜デモ付〜』
【副  題】〜3Dセンサの開発動向とセンサの特徴、Kinect for Windows V2の基本とプログラミング、非接触生体センシングの動作原理とアプリケーション〜
【開催日時】2015年11月26日(木)10:30-17:30【予定】
【会  場】【東京】日本テクノセンター研修室

Kinect Developers KitのKinect V2 アルファ版


【Webカメラで瞳孔トラッキング】


【Webカメラで脈拍センシング】


【HTML5+JavaScript+AR】【円形マーカー検出拡張現実センシング】


障害物でマーカーの一部が欠けても検出可能なオリジナル・アルゴリズムで開発。
アルゴリズムの動作原理はサポートページで詳細を記述・説明しています。




Kinectのデプスイメージから円形マーカーの中心座標を推定し、半径と法線ベクトルを取得する理論も記載。

【サンプル・プログラム】  【対応ブラウザ】最新版Google Chrome, FireFox, Opera
『円形マーカーによる距離測定デモ』  ●『回転するピラミッド拡張現実表示』
『マーカー移動履歴の表示』
 ★マーカー半径750mm, 黒枠太さ15mm~30mmで適当に作ってみて下さい。

【HTML5+JavaScript】【赤外線デプスカメラの製作】



ROHM製波長822nm単峰性光束ビームを持った赤外線レーザーRLD82PZJと市販Web赤外線カメラDC-NCR13Uで作るデプスカメラ。ピンホール方式フォトマスクでランダムドットパターンを投影。CADデータをプログラムで生成してプリント基板加工機で0.3mmφのドリル加工で製作。レーザー電源はStrawberry LinuxのLTC3490超小型LEDドライバモジュール(#13002)を使用。


2013年4月10日発売
【連載】
スポーツやヘルスケアの可能性を探る
『奥行カメラで俺センシング! 第2回 知覚コンバータCyber Eyeを作る』

トランジスタ技術2013年5月号

【連載】スポーツやヘルスケアの可能性を探る

『奥行カメラで俺センシング!
   第2回 知覚コンバータCyber Eyeを作る』




【Kinectの深度情報を音に変換するサイバー・アイ】
   ダウンロードはサポートページで!
視覚障害を克服し、駅のプラット・フォームからの転落を防止するツールとして、Visual C#で試作しました。サイバー・アイ (Cyber Eye)は、Kinectのデプス・カメラで取得できる深度情報を音に変換する知覚変換デバイスです。現在は、ウェアラブルにするための研究段階にあります。将来的には、健常者にとっても後方を見守る防犯ツールとして統合する予定です。

【サポート・ページ】⇒ 『知覚コンバータCyber Eye』


2013年3月9日発売
【連載】
スポーツやヘルスケアの可能性を探る
『奥行カメラで俺センシング! 第1回 脈波と呼吸の可視化』

トランジスタ技術2013年4月号

【サンプル・プログラム】
『Kinect非接触脈拍・呼吸モニタ』[Version5]
最新版プロジェクトファイルです。少し矛盾していますが、胸をKinectから50cm以上離し、できるだけ頬をKinectに近づけて測定します。画面中央枠に頬が、画面左下枠が左側大胸筋あるいは心臓付近に位置するようにして、10秒程待つと自動オフセット調整が有効になります。このバージョンはKinect本来のデプス・アルゴリズムを使っているバージョンです。(個体差が未確認のためです)
Kinect for Windows SDKのバージョンは1.7でなければなりません。起動後しばらくはKinect本来のデプス探索アルゴリズムのせいで大きな変動が伴う場合があります。(探索型だとわかりますよね)
サポートページはARsensingです。 記載日 2013/03/09 修正 2013/04/15

★トラ技第100回メルマガにて配信されましたように、Kinectの赤外線カメラの代わりに、パソコンの内蔵カメラまたはUSB接続カメラでも脈拍センシングを行えるようにしました。Kinect_VitalMonitor5の脈波測定部分のソースをVisual C#からHTML5+JavaScriptに移植したものです。
利用できるブラウザはGoogle Chrome, Opera, FireFoxの最新版です。IEとSafariはHTML5のgetUserMediaを実装していないので使えません。Google Chromeのインストールがお薦めです。測定領域枠はドラッグ&ドロップできるようにしました。構造も若干処理負荷が軽くなるように変更しました。今後、Kinectのデプスカメラの高速アルゴリズムをUSBカメラに実装してゆく予定です。
【Webカメラで脈拍をリアルタイム非接触センシング】

【HTML5+JavaScript体験版】Google Chrome推奨。WebカメラかUSBカメラが必要です。


【インターフェース2013年1月号】【2012年11月25日発売】

スポーツ/医療/ヘルスケア…動き解析処理&プログラムを徹底解説!
『研究 人間センシング』   (Interface2013年1月号はCQ出版Webショップで購入できます)
サポートページは【Kinectが変えるセンシングの世界】です。

【最新情報】

【第127回微小光学研究会「3D空間情報と微小光学」】
 『ランダムドットパターン投影法によるデプスカメラの動作原理』



Kionix直交3軸加速度センサ
KXTI9-1001[I2Cインターフェース]

第1部 センサ部品 活用編
【加速度センサ基礎編】
第1章
距離/速度/傾斜角/衝撃/振動/周波数...マイコンに付け足してレベルアップ!
動きセンシングの超定番! 加速度センサの基礎
pp.44-50

【参考資料】
シロアリの音(元ネタ)
シロアリの出す音(葉)

ヘッド・バンギング(日本人)
コンサートの「縦ノリ」で周辺の住宅が揺れる 縦ノリ編
【I2C直交3軸加速度センサ】
第2章
市販モジュールで試してわかる! 通信/設定/読み出しの基本
動きセンシングの超定番! 加速度センサの使い方
pp.51-56

【サンプル・プログラム】
『FT232RでI2Cインターフェースを構成して3軸加速度センサKXTI9-1001に接続』
【SAS(睡眠時無呼吸症候群) いびきと呼吸編】
Appendix 1
温度センサ&マイクで呼吸を測る
pp.67-69
【サンプル・プログラム】
『いびきと鼻呼吸を記録』
【GPSセンサとGoogle Map編】
Appendix 2
GPS×地図でセンサ・データをレベルアップ!

【Google Maps APIの使い方】
Google Maps API Version3.0の使い方についてサンプルがあります。
【GoogleMap応用例】
★当サイトでは自作ソフトでアクセス解析を行っています。
『ムカデに刺されたら...』のページの解析事例を示します。
【Bigデータ】『ムカデ被害日本地図』のインデックスページです。
『ムカデ治療アクセス解析2012年10月』(12464点)
『ムカデ治療アクセス解析2012年12月』(1369点)
 地図左下のボタンをクリックすると地図を表示。詳細はJavaScript参照。
 表示点数が多いと実行には分単位の時間がかかります。
pp.70-73
【Google Maps APIの使い方】
【サンプル・プログラム】
『FT232RでGPSの吐き出すデータを記録』
『GPSの緯度・経度データを地図上に表示する』
第2部 カメラを使って動きを検出編
【Kinect編】『非接触 呼吸モニタ』
第6章
2m離れた対象との距離を精度1mm以下で! 奥行きカメラKinectの性能を高めるための信号処理
研究! 非接触でヒトの息づかいを測る
pp.98-105

【サンプル・プログラム】
『Kinect非接触呼吸・脈拍モニタ』
『Kinectによる非接触呼吸モニタ』
『Kinectデプスカメラ(SDK Ver.1.6)』
【動画】
【Kinectで非接触呼吸モニタ】
【Kinectで人間センシング】New
【Kinectで赤外線脈波(顔)】New
【Kinectで赤外線脈波(掌)】New
【Kinectのデプス測定範囲】New
【呼吸・脈波非接触モニタ】New
【Kinect編】『バーチャル・ピアノ(ドラム)』
第7章
チカチカ点滅する照明の影響を信号処理で低減!
手の位置と叩いた瞬間を検出! バーチャル・ピアノの製作
pp.106-108

【サンプル・プログラム】
『Excel VBAでエレクトーン風のWave File(*.wav)を作成』
『Kinectによる拡張現実楽器演奏システムの簡易体験版』(加速度センサ無し)[デバッグモードでは使用不可]
【参考】DDS方式Web Vocaloid
【Kinect編】『赤外線近接センサ 簡易NUI』
第8章
赤外線映像の新しい活用法を探る
研究! 15~50cmの至近距離でジェスチャ検出
pp.109-113

【サンプル・プログラム】
『Kinectによる近接位置での手操作のデモを行う』
(NUI: Natural User Interface)
第3部 直接人間センシング編
【心電計編】(無拘束で入浴中の心電図を観測する浴槽心電計を含む)
第9章
微小な生体信号をとり出すにはアナログ回路とノイズ低減信号処理がカギ
心電計に学ぶ! 医療/ヘルスケア装置づくりの勘どころ
pp.114-126

【サンプル・プログラム】
『Excel VBAで心電図データを処理(リアルタイム処理向け)』
【旧ドキュメント残骸エントリ】
古い『心電計の製作』関連記事

★Kinectの基本的なサンプルプログラムも本ページ内でダウンロードすることができます。
 (詳細はトランジスタ技術2012年8月号を参照してください。)
 【Kinect for Windows SDK Ver.1.6】『サンプル・プログラム集』【ダウンロード・サービス】


【最新動画News】

  ●【拡張現実楽器演奏システムデモ】 ≪CEATEC2012 幕張メッセ ローム株式会社様ブース≫
  ●【拡張現実ドラム演奏システム】【試作版】
  ●【Kinectで呼吸・脈拍モニタ ~1m離れた位置から非接触でモニタできる~】

【CQ出版トランジスタ技術2012年8月号Kinect 特集】

2012年7月10日以降のサンプルソフトやその他の情報はこちらのページへどうぞ。
Kinect特集記事には80ページを割いて、Kinectデプスカメラの動作原理、関節の円運動から中心座標と半径を求めるジェスチャー判定の理論など、詳細に説明を行っています。まだ、バックナンバーの入手が可能ですので是非参考にしてください。

トランジスタ技術2012年8月号(7月10日発売済み)以降のサンプルソフトやその他の情報はこちら。

中央:骨格追尾で円運動を高速検出する【オリジナル方式ジェスチャー判定】
   残像履歴の点集合からリアルタイムで円・円弧の中心座標を推定する漸化式方式です。
   円の半径は中心座標推定後に1回計算するだけです。
   ソースリスト公開予定あり。
右側:デプスカメラの原理説明
   Kinectは本来近距離ほど高分解能ですが演算負荷の問題で測距範囲に制約を与えていることが判明。
   自作したオリジナル・デプス・アルゴリズムでは約1/1000の演算負荷となるようだ。
   廉価かつ高性能、高機能なオリジナル版KinectセンサもWebカメラにちょっと付け加えた程度で構成できそうだ。
   携帯電話に実装すれば1カメラで立体写真も撮影できるだろう。
   今後、どのような形で技術公開するか思案中。(KinectはIRカメラ・イメージを非公開のため)


【目次】

【Kinectのデプスカメラを自作する】

【Kinect for Windows SDK Version1導入編】

【OpenNI編】


【Kinectのデプスカメラを自作してみた】

Kinectのモーションキャプチャの機能は、全て赤外線プロジェクタと赤外線カメラを組み合わて構成されるデプスカメラによって実現されています。Kinectのデプスカメラは、下の写真のようなランダム・ドット・パターンを赤外線で投影して、深度情報(デプス)を検出しています。3次元デジタイザや3次元スキャナという言葉の方がふさわしいとも思えるデプスカメラの動作原理の検証を行う目的で自作にトライしてみました。

【Photo】試作中のデプスカメラでの実験風景(Kinect方式に近いモード)

【Fig.1】試作中のSkeletonCaptureのDirectX版
  (Frameworks4.0+Managed DirectX+KINECT)

【Fig.2】試作中の高周波磁界分布可視化拡張現実センサ

【Photo1】試作中のワイヤレス高周波磁界・超音波センサ

【Fig.3】JavaScript音声合成エンジン『μ-iVoice』の表示例

【詳 細 目 次】

【KinectのLight Coding技術とは?】

 ●Light Coding技術の本質について従来技術との違いを説明します。
  ■【Kinectの赤外線プロジェクタの概略構造】
  ■【光切断法】
  ■【距離計測の並列性を高める手法の例】
  ■【Light Coding技術とは?】

【Kinectのデプスカメラを自作する】

 ●Kinectのモーションキャプチャの機能を実現する上で最も重要な要素が赤外線プロジェクタと赤外線カメラで構成されるデプスカメラです。一体どのような動作原理で各画素の深度(Z値)を測定しているのか興味を持ったので自作してみました。実際には現在3通りを試作していますが、それぞれ説明が煩雑になってしまうので、Kinect方式に最も近いと考えられる方式のみ記述します。現在演算負荷を1000分の1以下に圧縮する方法に関して取り組んでいます。本年7月中旬から9月頃までに記事を充実させる予定です。

  ●【KINECTのデプスカメラの動作原理について】
   ■【米国特許庁の簡易特許検索サービス】
   ■【Google Patent検索サービス(β版)】
   ■【デプスカメラの構造】
   ■【プロジェクタの構造】
   ■【YouTubeで見かけたKinectのランダムドットパターン】
   ■【ランダムドットパターンの作成】
   ■【部分パターンのX方向のシフト量で深度(Z)がわかる】
  ●【デプスカメラを自作するプロジェクト】
   ■【レーザーポインタとUSBカメラで測距】
   ■【ランダムドット方式デプスカメラの試作】
   ■【Prime Sense社の発明の請求の範囲】

【Kinect for Windows SDK Version1導入編】【日本語版】

  English Version
 ●2012年2月1日、遂にMicrosoft社が正式にKinect for Windows SDKのVersion1の配布を開始しました。どうやら、PC接続専用センサのKinect for Windows向けらしいのですが、筆者が確認したところ、XBOX360用センサをPCで動作させることができました。
  Colorイメージ、Depth情報、Skelton(骨格)情報の取得だけでなく、音源方向の検出、音声の.wavファイル形式での録音、音声認識エンジンSpeechの実装、センサの上下角の遠隔操作などもXBOX360用センサで問題なく行うことができました。使う事のできなかった機能はnear(近接)モード[400mm~3000mm]だけでした。
  英語ですが、各機能の使い方の解説ドキュメントが付いています。目的別に非常に丁寧な文章で解説されています。注意すべき点は1点だけで、SkeletonStreamをenableにしないと、Depth値のPlayerIDが有効にならないことくらいです。
  骨格抽出、残像表示までの簡単なサンプルプログラムを目的別にプロジェクトファイルごと公開しています。/2012/02/16/
  ●【KINECT for Windows SDK Version1インストール】
  ●【KINECTセンサの特徴】
  ●【Visual C# サンプルプログラム集】
   詳細は、【Kinect for Windows SDK Version1導入編】【日本語版】に記載していますので、そちらを参考にしてください。
   ①Bitmap_GetColorImage.zip【カラー画像取得】
   ②Bitmap_GetDepthImage.zip【デプス情報/画像取得】
   ③Bitmap_GetPlayerDepthImage.zip【人物の切出し(デプス)】
   ④Bitmap_GetPlayerColorImage.zip【人物の切出し(カラー)】
   ⑤Bitmap_GetSkeletonData.zip【骨格情報取得】
   ⑥Bitmap_GetSkeletonAfterimage.zip【骨格追尾残像表示】
   その他、CircleDetect, Gesture, Cyber Eye等を随時追加の予定。
  ●【KINECT SDK導入時に予想されるトラブル事例】
  ●【Frameworks Ver.4.0でManaged DirectXを使う方法】
  ●【公開予定】
  ●【Kinect for Windows SDK Version1でのC#使い方概要】
  ●【Kinect for Windows SDKで骨格抽出を行うサンプルプログラム】
  ●【各種拡張現実センサの開発】

【OpenNI編】

OpenNIは、2010年11月のKINECTセンサの発売直後のたった2ヶ月でドライバーをオープンソースで提供してくれたという業績は評価できるものではありましたが、現状、Micorosoft社が音声認識Speech APIと統合したKINECT for Windows SDKを供給してくれており、両者の機能、インストールの手間などを比較すると、もはや見劣りがする状況に陥っています。
筆者は5分もあれば導入できるKINECT for Windows SDKをお勧めいたします。OpenNIをインストールする場合は導入に2時間を覚悟する必要があります。下記ドキュメントは本ページより分離いたします。
 ●【Windows7でKinectを使えるようにするには?】
  ●【手順1:ダウンロード】
  ●【手順2:デバイスドライバのインストール】
  ●【手順3:OpenNIのインストール】
  ●【手順4:NITEのインストール】
  ●【手順5:Sensorのインストール】
  ●【手順6:環境変数の修正】
  ●【手順7:OpenNI用xmlファイルの置き換え】
  ●【手順8:NITE用xmlファイルの置き換え】
  ●【動作確認】
 ●【Kinect Sensorの使い方】
  ●   【以下の項目書きかけです。】
 ●【Kinect Sensorについて】
 ●イスラエルのPrime Sense社のミドルウェアNITEとオープンソースOpenNI
 

【ARを支える他の技術】

■『Kinectで拡張現実センサを構成する試み』【C#】
■『Google翻訳の音声合成(Text-To-Speech: TTS)API』【JavaScript】
■『Webで使える音声合成API μ-iVoice』【JavaScript】
 変形DDS(Direct Digital Synthesizer)アルゴリズムを用いた音声合成/シンセサイザAPI(Version0.07)です。Google TTSと違ってブラウザ上で音声合成を行いますので文字数の制約はありません。簡易なスクリプトで音声に抑揚(音階、幅、強弱)をつけることができます。iframeでブログなどに埋め込めます。現状ひらがなだけですが、Version0.08で漢字への対応、自動抑揚付与などの機能追加、音質向上等の改良を予定。加えてローカルからオリジナル音声データの組み込みを可能にします。
 現状、声域の狭い初音ミク風味(あまり似ていない)の音声データのみですが、今後、オリジナル公開音声データベースを構築する予定です。
■『WebGLのページ
 JavaScriptでリアルタイム3次元グラフィックスが楽しめる時代の到来までもうすぐです。現在、Google Chrome12、Mozilla FireFox5、及び開発版のSafari、Operaで使うことができます。WebGLは、JavaScriptエンジンv8とDirectXを利用して高速化したOpenGLを融合して構成されたものです。2011年5月に指摘されたセキュリティー問題はありますが、処理速度の高速性から利便性も高いので、将来的には普及するのではないでしょうか?
 ●WebGLとは? ●事前準備:利用できるウェブブラウザは? ●事前準備:FireFox5でWebGLが動作しない場合には?
 ●WebGLのサンプル ●WebGLのデモ ●クロスドメインテクスチャーを将来も利用できる方法


【図1】Kinectの外観構造と基本機能

【KinectのLight Coding技術とは?】

Kinectの外観構造とその機能を図1に示します。
Kinectは画素単位に被写体までの距離を『撮影』することができる『デプス・カメラ』を実装していますが、これは赤外線プロジェクタと赤外線カメラを組み合わせて実現されている機能であって、カラー画像カメラは何の寄与もしていません。
開発元のイスラエルの企業Prime Sense社は、Light Coding技術と呼んでいますが、まずこれがどのような技術なのか、順に説明します。


【図2】Kinectの赤外線プロジェクタの概略構造 【図3】投影パターンのイメージ

【Kinectの赤外線プロジェクタの概略構造】

Kinectの赤外線プロジェクタは、波長827nmのレーザー光源が発生したビームを拡散板を通して輝度斑を軽減した後で、マイクロレンズアレイと呼ばれる小さなレンズをランダムに配置したレンズ集合体を通過させて多数の赤外線ビームを作っています。図2に概略構造を示します。この小さなレンズの目的は焦点を結ぶというよりは、各ビームを拡散しないようにまっすぐ被写体に向って投影することにあります。各ビームは非常に輝度が高く、可視光なら2000Lux~5000Luxに相当する輝度ではないかと考えられます。結果的に図3に示すようなランダムな配置の光点群を被写体に投影しています。無論、投影しているのは赤外線なので目には見えません。


【図4】光切断法の動作原理説明図

【図5】幾何学的関係(三角形の相似性)から距離がわかる

【図6】実験結果と理論の比較図

【光切断法】

Kinectが何故多くの光点群を照射しているのか理解する前に、1つの光点をカメラで撮影することで距離がわかる計測の仕組みを理解する必要があります。
『光切断法』と呼ばれている方法です。レーザー光源の位置から水平方向に距離dだけずれた位置でカメラにより観察を行うと、レーザー光が照射されている被写体までの距離が変わると、カメラで撮影している光点の位置が水平方向にずれて見えます。
基準とするスクリーンの位置に投影されているときの光点の観察位置と、被写体に投影されているときの光点の観察位置が何画素分水平にずれているのかを測定すれば、図5に示したような幾何学的性質から容易に光点までの距離を精確に求めることができます。
しかし、この方法では、1フレームにたった1点の距離しか求めることができませんね?
1画面分の全ての画素の距離を求めるにはレーザー光のスキャンが必要になってしまう欠点があります。


【図7】画素は水平にしかずれないので垂直方向には並列に測定を行える!

【図8】モアレ縞法の動作原理説明図

【距離計測の並列性を高める手法の例】

『光切断法』では、カメラをプロジェクタと水平にずれた位置に配置して観測するので、投影している光点は必ず水平方向にしかずれることはありません。
すなわち、図7のように垂直方向の直線状のビームを照射すれば、垂直方向の画素については同時に並列に測定することができるわけです。
さらに、測定する距離の範囲を限定すれば、水平にずれる最大画素数も制限されるので、その範囲なら図8に示すように、横方向の多重化も行うことができるのです。これはモアレ縞法と呼ばれる方法です。
しかし、これでは測定距離の範囲を狭くしないと1画面分の画素の距離を測定する時間の短縮が行えませんし、何より絶対に1画面分の画素の距離を取得するまでの時間は数フレーム以上の時間がかかってしまう欠点があるわけです。


【図9】Light Codingとは照射する光点に参照情報を与え分離できるようにする方法

【図10】Light Coding技術の例

【Light Coding技術とは?】

要するに投影している光点(ビーム)のそれぞれに情報を持たせ、同一スキャンライン上に並ぶ個々の光点の識別ができれば問題は解消するわけです。
光に水平方向投影角度の参照情報を盛り込む方法がLight Coding技術の本質です。
一番理解しやすいのは、(広い範囲で平坦なスペクトルを持った)白色光源の光をプリズムで水平方向に分光して投影する例です。
要するに、投影する方位によって投影した波長が異なるので、ある方向に投影したはずの波長の光が水平にずれた位置で観測されれば、物体までの距離がわかることになります。
波長による弁別性が高ければ高いほど距離分解能が高くなります。
このような波長(あるいは周波数)で分離する方法はチャープ式レーダーや核磁気共鳴を用いたMRI断層撮影装置などで利用されている方式です。
あるいは個々のビーム自体に固有のシンボルを投影させれば、どれだけ水平方向にずれたのかは一目瞭然です。
あるいは、シャープな自己相関特性をもった2値乱数パターン(通信分野ではポピュラーなm系列符号という擬似ノイズが有名)を投影すれば、部分相互相関を取る事でピーク位置が位相シフト(=画素の水平シフト)を示しているので距離を求めることができるのです。
最後のノイズ利用の方法がKinectのランダムドットパターンに共通する考え方なのですが、とりあえずLight Codingというのは決してランダム・ドット・パターンだけでなく、無数に方式が存在していることを理解していただけると思います。

【KINECTのデプスカメラの動作原理について】

KINECTセンサを動作状態で見ると、レーザー光のような赤い光源が光っているのがわかる。
感じとしては、レーザーにしては暗く、位置を変えると場所によって細かく明滅するようにも感じる。
おそらく、赤外線LEDのようなもので、空間変調を施されているように感じた。
そこで、KINECTセンサ特有のデプスカメラの動作原理に興味を持ってしまったので、少し調べてみました。

【米国特許庁の簡易特許検索サービス】

まず、KINECTセンサを開発したのは、イスラエルのPrime Sense社であることがわかっているので、
米国出願されたパテントがないかどうか調べてみた。
米国特許庁には
 ●登録された特許(特許として成立した発明)を検索する簡易特許検索
 ●出願された特許明細書(申請されたが審査中のもの)を検索する簡易明細書検索
等のサービスがある。
この場合には、Fieldという検索対象にAssignee Name(出願人)を選択し、PrimeとSenseで検索すればよい。
その結果、現在10件が申請中であることが判明した。

No. 出願番号     発明名称
1)  20110164032   Three-Dimensional User Interface
2)  20110096182   Error Compensation in Three-Dimensional Mapping
3)  20100290698   Distance-Varying Illumination and Imaging Techniques for Depth Mapping
4)  20100225746   REFERENCE IMAGE TECHNIQUES FOR THREE-DIMENSIONAL SENSING
5)  20100201811   DEPTH RANGING WITH MOIRE PATTERNS
6)  20100118123   DEPTH MAPPING USING PROJECTED PATTERNS
7)  20100020078   DEPTH MAPPING USING MULTI-BEAM ILLUMINATION
8)  20100007717   INTEGRATED PROCESSOR FOR 3D MAPPING
9)  20090185274   OPTICAL DESIGNS FOR ZERO ORDER REDUCTION
10) 20090183125   THREE-DIMENSIONAL USER INTERFACE

【Google Patent検索サービス(β版)】

但し、米国特許庁(USPO:United States Patent Office)の検索サービスは閲覧は無料なのだが少々読むには不便である。
図と明細書本文が分かれていて、読みにくいのだ。
そこで、次のステップには、Google Patent検索(β版)がお勧めだ。
PDFファイル形式で明細書をダウンロードすることができる。
現在、800万件の発明を検索したり、閲覧することが可能だ。
Googleがこんなサービスをしているのは、特許文献が公的な文書なので著作権が発生しないということなのだろう。
例えば、出願番号20100118123をダウンロードする場合には、
  http://www.google.com/patents/US20100118123.pdf
をアクセスすればよい。
 ■US20100118123 『DEPTH MAPPING USING PROJECTED PATTERNS』

飽きっぽい性格なので、ちまちま英語なんか読んでられないんで、図と式だけ1分程眺めた。

【デプスカメラの構造】

デプスカメラの構造がFig.2に登場する。
赤外線プロジェクタと赤外線カメラで構成されている。
Kinectセンサには普通のRGBカラーカメラも実装されているが、
深度計測には全く寄与しておらず、おまけの機能と言える。

【プロジェクタの構造】

赤外線プロジェクタの構造はFig.8に登場する。
高輝度赤外線発光LEDと、均質な光源を作るための拡散器と、
Fig.7に示されるように2次元面上にランダムに配置されたマイクロレンズアレイと、
2つのレンズで構成される。
このプロジェクタの目的は、多数のランダムドットパターンを対象に投影することである。
どんな感じかって?

【YouTube】『kinect ray pattern with ir cam』

YouTubeを徘徊していて偶然に見つけた動画。同種の動画を何件か発見することができる。
実際のランダムドットパターンは下の動画に登場します。意外に荒いパターンでしたね。
別の動画で説明があったのですが、Kinectでは赤外線で投影されているのですが、
CCDカメラは赤外線に対しても感度があるので、赤外線カメラを使わなくてもナイトショットモードのあるビデオで撮影できるそうです。
私も手持ちのデジカメで試してみたのですが、波長850nmの赤外線ならちゃんと撮影できたのですが
Kinectの赤外線は殆ど映り込まなかったので、もっと波長が長い赤外線が使用されているようです。
CCDカメラの赤外線検出能力を悪用した海やプールでの水着盗撮事件が相次いだので、
現在日本国内で市販されているAV機器には赤外線をカットするフィルタが張られているようです。
10~15年位前のカメラなら撮影できるのかもしれません。
あるいはフィルタをはがす改造方法を公開している人もいましたのでそういう対策を施したのか?
米国在住の人がアップしたYouTubeの動画ではちゃんと撮影できているので、赤外線カットフィルタ対策は日本国内限定なのかもしれません。

■以前に存在していたYouTube動画が削除されてしまったので、Kinect for Windowsのランダムドットパターンを赤外線Webカメラ≪DIGITAL COWBOY 赤外線WEBカメラ(130万画素) DC-NCR13U≫で撮影したものをアップしました。


【Kinectのデプスカメラの動作原理】

なるほど..........理解した.........と思う。........きっと。
(だって、当サイトのWeb Agentの『ホログラム記憶』で使ってるのと同種の技術なので。
下記URLが『ホログラム記憶』の米国特許出願明細書)
 ■『Web Agentのホログラム記憶』US20120005455 『DEVICE FOR STORING DATA BY UTILIZING PSEUDORANDOM NUMBER SEQUENCE』
【参考文献】 日本特許出願 擬似乱数を用いた測距技術とデータ処理方法に関するもの
 ■【特許2718222号】『距離測定方法、その装置および相対位置測定装置』(出願1989年)
 ■【特許2803237号】『データ伝送方法およびその装置』(出願1989年)

要するに、KINECTセンサのデプス・カメラは、
2次元乱数パターンで修飾された赤外線光源と、赤外線カメラと、乱数パターンの部分相関処理を組み合わせた技術だ。
以下の記載事項を理解するためには、乱数の自己相関特性に関して理解している必要がある。
以下、短時間図を眺めて英文には眼を通さず、勝手に想像しただけの内容なので、そのつもりで読まれることをお勧めする。

【ランダムドットパターンの作成】

実際のKinectセンサのランダムドットパターンはマイクロレンズのようなものを多数配置して構成されているようなので、
同様のランダムドットパターンの生成プログラムをExcel VBAで記述してみた。
疑似乱数を使って、各ランダムドットの配置を決めているので、
同じパターン2枚を重ねた場合に、2つのパターンがぴったり重なる位置はたった1箇所しかない。
(下のパターンを紙に印刷して重ねてみれば確認できます。)
これが乱数の持つ自己相関特性だ。1ドット分以上位置がずれたら無相関となる。
この性質はパターンの任意の長方形領域を一部分切り出して重ねてみるオリジナルパターンと部分パターンの相互相関処理時も成立する。
つまり、乱数の性質を使えば、部分パターンが全体のどの部分に存在しているのかは、
全体のパターンと部分パターンの相互相関をとればたやすく探し出すことができる。
相互相関値のピーク位置が部分パターンの存在する場所を示すのである。

【Kinect】ランダムドットパターンの一例(1280×1024画素、ドット半径10画素)

【Kinect】部分パターン(100×100画素)


【Kinect】部分パターンとオリジナルの相互相関(最大相関ピーク位置に部分パターンが存在する)


【Kinect】部分パターンとオリジナルの相互相関(2次元的にもピーク位置で部分パターンの位置がわかる)
100×100画素の部分パターンでさえ、ぴったり重なるのは元々そのパターンが存在する位置以外には存在しないことがわかる。

【部分パターンのX方向のシフト量で深度(Z)がわかる】

2次元ランダムドット・パターンで修飾されたプロジェクター(赤外線光源)を使って被写体にパターンを投影する。
このようすをx座標方向に距離dだけ離れた位置にある赤外線CCDカメラで撮影すると、
撮影された映像では、物体の距離zによって投影されるランダムドットのx座標が変化することがわかるだろう。
なので、Nx×Ny画素の部分要素とランダムドットの同じサイズの部分要素で相互相関を取れば
その相関ピークを示すx座標位置がその物体の深さ(z値)に関係して変化するということなのだろう。
DepthImageのサイズはSDKでは640×480画素と320×240画素だが、
赤外線CCDカメラの実際の画素数はもっと多いものと考えられる。
測定可能距離のレンジがDefaultモードで800mm~4000mmなら、4000degits程度の分解能を確保するために
大体、64×64画素の小領域での部分相関処理は必要だろうと考える。
そこまで書くと、何故、KINECTセンサがゲーム・ディベロッパーに公開されたときに、1プロセッサ分の演算負荷が必要とされ、
当初は予定されていなかった専用プロセッサをKINECT側に実装することになったのか、その理由がよくわかる。

KINECTのデプス・カメラは赤外線プロジェクタ(光源)から水平方向に距離dだけずれた位置で赤外線カメラによる撮像を行っている。
従って、下図に示すように、赤外線ランダムドット・パターンで照明されている被写体は、照明の位置と撮影の位置が異なるので、
図のように被写体による影の部分が発生し、かつ被写体上に投影されたドット・パターンはx軸方向にシフトした位置に位置ずれを起こすのだ。
擬似ランダム符号の一部のパターンを使って、撮影パターンとの相互相関を取れば、
ランダムノイズの性質からx軸方向にずれた位置に相関ピークを検出することになる。
このx軸方向の位置ズレ幅と被写体の深度(z値)には相関があるので、被写体の3次元位置がわかるのだ。


【図】距離zは部分相関のピーク位置(x座標)と強い相関がある



ランダムパターンでは意味の分からない人向けにちょっと実験してみました。
部分パターンと言うのは、人間にとってみれば漢字やひらがな、カタカナと同じものです。
その小領域(Nx×Ny画素)だけで固有のシンボルとして機能します。
例えば、この写真のように『トランジスタ技術』というパターンが投影されていると考えてみてください。
スクリーン上に投影されたパターンは、ランダムドットも『トランジスタ技術』もつながっていますが、
『技術』の部分だけスクリーンより手前にある被写体に投影されたなら、
この実験のように、『技術』の部分は水平方向にシフトした位置に見えることになります。
被写体の深度を変えてやると、近くに被写体があればあるほど、水平方向のシフト量が大きくなることがわかっていただけると思います。
この水平方向のシフト量は被写体深度(デプス値)と1:1の関係にあるので、
水平方向のシフト量を求めれば、深度(デプス値)に変換することができるのです。
つまり『文字』=『ランダムドットの部分パターン』の水平位置がわかればその部分の距離がわかるわけです。
この水平方向の位置を調べる方法として、相互相関処理を使うのです。
 

【デプスカメラを自作するプロジェクト】

2012年7月中旬に詳細を公表しますが、現在デプスカメラを自作するプロジェクトを進めています。
Microsoft社(Prime Sense社)のコピー&パクリではなく、少し別系統の技術を用います。
下は理論式通りか否かを検証する為に実施した基礎的な予備実験です。

【レーザーポインタとUSBカメラで測距】

レーザーポインタとUSBカメラがあれば簡単な実験ができる。
下図のようにレーザーポインタをUSBカメラの水平方向にずらした位置に固定して前方の被写体に向かって照射する。
無限遠(数mでも良い)の被写体に照射したとき、レーザーポインタの光点がスクリーン中央になるように向きを調整する。
被写体までの距離が変われば、光点のx座標が変化する。
光点のx方向のシフト量と被写体までの距離zの関係を調べれば、KINECTの基本的な原理が確認できるだろう。
これが測距の基本原理なのだ。
KINECTでは、ピンポイントの照射を行わず、疑似乱数を用いた2次元的なランダム・ドット・パターンで被写体に照射している。
画面全体をレーザーポインタでスキャンするのではなく、
スクリーン全体にランダム・ドット・パターンのプロジェクション(照射)を行っている。
Nx×Ny画素単位に投影パターンとキャプチャー画像との相互相関を取って、
高い相関値を示す画素と無限遠点とのx方向のシフト量を求め、距離を計測しているのだ。
相互相関とは積分(積和演算)なので演算負荷が重いのはそのせいなのだ。


【YouTube動画】『原理検証実験』(暗くてボケているので後日取り直したいと思います。)


【実験結果の一例】『原理検証実験』
焦点距離600mmとすると実験値と理論値がぴったり一致。
本来、カメラに近いほど測距精度は高くなる。
Webカメラの解像度が640×480画素でも10cmで0.5mm程が達成可能。
なのに、Kinectが近距離の部分を観測しないのはアルゴリズムのまずさに起因している。
Kinectのソフトウェア処理方式だと、近いとビットシフトも大きくなり、その分処理負荷が増えるからだ。
すなわち、この事実だけでPrime Sense社のアルゴリズムがConvolution数学を究めていない(知らない?)ことがわかる。
知っていたらこの不具合を放置しておくわけがないからだ。


大雑把な原理検証実験のメモです。
【実験条件】
●ELECOM製3メガピクセルのUCAM-DLY300TA
●Webカメラの分解能は640×480画素に設定
●カメラとレーザーポインタの距離42mm
●光点の座標位置はmax輝度の位置とした
【結果】
横軸 X方向ビットシフト量[単位 ピクセル]
縦軸 距離[単位 mm]
【感想】
XYステージもないので、光軸の向きとか固定していないし、
目分量でものさしで距離を測りながらの大雑把な実験でしたが、結果は驚くべきものでした。
結構精確に測距できるんですね。
ちなみに2mくらいで光点はほぼキャプチャ画像の中央付近に(320辺りに)
超音波パルスエコー式測距センサよりいいかも。
赤色レーザー発光モジュール(LM-102-B)は450円でした。
理論式の公開は2012年7月中旬を予定。

【デプスカメラを自作するプロジェクト】『デプスカメラの製作』(続き)

【最新のデプスカメラの製作状況】

実際にデプスカメラを自作してみようと考え、製作中です。
Cyber EyeをKinectに依存せず、自作するためにもここはいちから造る必要のある部分です。
漸くパターン抽出の実測に3通りの方法で成功しました。
大人の事情により、Kinect方式に最も近い方法の結果のみ例示します。
(少し考えれば処理方式だけでも10通り位抜け道[=別解]を考える事ができるはずです。)


【Kinectエミュレート】バスケットボールにパターンが投影されるとこんな感じ
Kinectの動作状態でプロジェクターの部分を覗き込むと肉眼でもわかるのですが、
赤外線領域ではランダムドットパターンが投影されています。


【Kinectエミュレート】試作したデプスカメラによる実測抽出パターンの例


【Kinectエミュレート】試作したデプスカメラによる各ビットシフト量におけるスライスパターンの例
次は深度情報抽出処理に進みます。
ここからがKinectセンサの突っ込みどころ満載の部分です。改良の余地がいっぱいあって面白くなってきます。
取り敢えず私にとっての30年程前の技術レベルから適用していきたいと思います。
各スライスの解像度は640×480画素。部分相関の領域サイズは40×40画素とした。
ちゃんと壁、手、ボールの形状が出ている。上のパターンがその情報を持っているのだから驚きだ。
カメラの解像度を上げるだけで3次元デジタイズの分解能も上がる。
大雑把で簡単な実験だったので、まさかここまでできるとは思わなかった。
同種の技術でイメージするとすれば、MRI断層撮影装置やホログラフィーを想起する。
ランダムドットパターンの作成は、量子化疑似乱数(疑似ランダムノイズ:m系列符号[Maximal Sequence Code])を
使ったが、物体の存在しない場所にはスライス結果にも何も存在しない結果が得られた。
ウェブカメラで撮影したわずか1枚の画像には3次元情報が織り込まれて(foldされて)いるわけだ。
私は20年間程様々な計測上の『逆問題』(Inverse Problem)にも関与してきたが、
ここまで分離性の良いスライス結果が得られるような問題はとても珍しいと言える。


【Kinectエミュレート】試作したデプスカメラによる各ビットシフト量のデプスパターンの例
シフト量に基づいて深度を求めることができるので実質的にKinectのデプスイメージと同じもの。
相互相関の部分パターンの領域サイズと相関値のしきい値の設定で試行錯誤の要因を残している。


【Kinectエミュレート】デプスカメラの実験に用いた装置構成
原理検証に用いた実験装置の構成の種明かしです。
大抵の会社や大学研究室に、PC用プロジェクタとウェブカメラはあると思います。
それだけあればデプスカメラの実験を行うことができます。
  ■ビデオプロジェクタ Epson EB-S02 33,000円
  ■ウェブカメラ ELECOM UCAM-DLY300TA
  ■ノートパソコン   SONY VPCEB28FJ
プロジェクタははっきり言ってオーバースペックなので、演算負荷さえ下げれば
Kinectセンサは多分5,000円で販売可能ですね。製品原価1600円くらいのもんでしょう。

【Prime Sense社の発明のクレーム】

      ★クレーム:Claim とは、発明の『特許請求の範囲』のことです。
この辺の情報は、企業の特許部(知的財産部)あたりでなければ興味のない人が殆どだとは思いますが、一応書いておきましょう。
上で登場したKinectセンサの開発元であるイスラエルのPrime Sense社が出願している明細書
US20100118123 『DEPTH MAPPING USING PROJECTED PATTERNS』を眺めてみると面白いことがわかる。
下に請求項の部分を下に抜き出した。
クレーム 1-21、25-45 は削除されている。
これは、多くの場合、以下の2つのケースが考えられる。
  1) 先行技術が存在して請求項として権利を認められず削除された
  2) 異種の技術であるため、明細書を分離するよう米国特許庁から命令された
1)は軍事技術で利用されていたような技術の場合、ありがちなことなのだが、極秘文書扱いで封印されている場合がある。
しかし、誰か民間人が同じ発明をしてしまった場合には、極秘文書の扱いを解除され公開されることがあるのだ。
このような場合には、特許の権利は当然認められることはない。まあ、アメリカ特有の現象だ。
いずれにしても、この発明の基本部分はクレーム22, 46, 49, 51ということになる。
これらの請求項の要素を全て含んでいる後続の発明は全て抵触することになる。
さて、そこで問題なのは、これら4つの発明要素は全てマイクロレンズアレイによるランダムドットパターン・プロジェクタ
を想定していることだ。つまり、今回のパソコン用プロジェクタやプラネタリウム方式は範囲外となるのだ。

(ただし、当サイトのアクセス解析で既に明らかだが、同種製品を開発しようとする企業の方々が調査で来られているようだが、
別に当サイトはこの主張に一切責任を持つわけではないので、自己責任で開発していただくことですね。訴えられたら少なくとも
10億円の裁判費用と、もし負けると100億円ほどの賠償額になる可能性がありますよ。) (^_^;)

【US20100118123の請求の範囲】



【典型的なピンホール型プラネタリウム・プロジェクタの構造】



【番外】

【NyARToolKitCS】はこちら。
【OpenNI】はこちら。【注意】★OpenNIは10機種以上試しましたが、『機種依存性』があり、最新版が動作しないこともあります。

【最新動画News】

【USBカメラでKinectのデプスカメラを実現する為のプロジェクト】

【Kinect】『高速デプス・アルゴリズムの試作 Version 0.01』



●2012年8月のオフ会でお話ししていましたデプスカメラの高速アルゴリズムのひとつについて検証を行いました。
今回は1990年に考案したPre-Convoluted Codeを使う高速アルゴリズムをKinectのデプスカメラに応用してみました。
当サイトの3値論理型AIシステムWeb Agentでは広域拡散型ホログラム記憶として採用している方法で、その計測応用に該当します。
Kinect for Windows SDK Version 1.6から赤外線カメラ画像の取得が可能になりました。投影しているランダム・ドット・パターンのテンプレート画像は公開されてはいないようなので、まず1.25m離れた壁に投影されているランダム・ドット・パターンを16回キャプチャして参照画像を取得し、この画像を300画素水平にシフトしながらPre-Convoluted Code Patternを作成します。Pre-Convoluted Codeを作る際に原画像に係数をかけることがこの方式の最大特徴です。
こうして得たPre-Convoluted Code Patternを1回赤外線カメラ画像に畳み込むだけで水平シフトマップを得ることができます。
Kinectでは水平シフトマップを得る為に、各シフト量毎の相互相関を取りながら探索不要になるまで処理を繰り返していたはずですので、処理速度は約200倍になったはずです。
YouTube動画の実験では、赤外線カメラ画像からキャプチャしたパターンをIntel Core i3 2.27GHzのWindows7機でリアルタイムに処理することに成功しています。
これでPre-Convoluted Code方式が演算負荷を節約できることが実証できました。実験した部屋は究極に狭い部屋だったので壁が段差を持っているので少し結果が変ではありますが。将来的にはUSBカメラと安いプロジェクタ(懐中電灯でパターンを投影)程度でデプスカメラが実現できることになり、組み込みへの応用にも道が開けました。
記事でも書きましたが、こういった高速アルゴリズムは私が思いつく限りでも100種を超えます。数学の別解は非常に多いのです。可能性は無限大ということになります。
このアルゴリズムに関しては2013年3月7日(木)に東洋大学(東京品川)にて開催される第127回微小光学研究会にて発表(というより解説?)いたします。
次のステップは、1992年に考案した基底遷移アルゴリズムにより超高精度デプスマップを取得する方法の実証ステップになります。






【お ま け】

今回、Kinectセンサのデプスカメラを試作したことで、乱数修飾が効率的な3次元位置同定に役立つことが理解できた。
同時に、等価変換理論(私が発明創造に使っている方法です。)により
センサアレイを用いなくても1個の受波器でパッシブ3次元計測を行うことができると理解した。
というより数学的に解けてしまった。
つまり、例えば超音波断層撮影装置も多素子の受波アレイを使わなくても断層像を得ることは可能だし、
1個のマイクロフォンで音源の3次元座標を同定することができるわけだ。
もしかすると各楽器の3次元座標さえ、再構成できるマイクロフォンが作れるわけだ。
米軍の潜水艦にはそういうパッシブソナー技術が使われている可能性が高くなった。
当然、レーダーでも同じことが可能になるわけで。
スペクトラム拡散レーダーには死角も存在しないわけか。ステルス機も丸見えなわけだ。
人間だって、頭部で反射する回折波を直接波とともにひろって片耳でも音源位置がわかるのはそういう理屈だ。
積極的に乱数の全方位非対称性を使うことで性能を飛躍的に上げられるわけだ。
おもしろい。