iPhoneで奥行き推定する 
プログラムを作りました 
第25回CV勉強会@関東 
Yuichi Takeda / @ginrou799
iPhoneのカメラだけで動く 
iPhoneで奥行き推定する 
プログラムを作りました 
デプスセンサ作りました 
第25回CV勉強会@関東 
Yuichi Takeda / @ginrou799
自己紹介 
• Yuichi Takeda / @ginrou799 
• CV 
• コンピュテーショナルフォトグラフィ 
• MIRU 2012 優秀賞 
• iOS 
• ミクシィでiPhoneアプリの開発 
• 本も出してますhttp://goo.gl/OaLUDc
AndroidのLensBlur 
ご存知ですか?
LensBlur 
• Android に搭載されているカメラの機能 
• シーンの奥行きを推定してリフォーカス 
出典 http://googleresearch.blogspot.jp/2014/04/lens-blur-in-new-google-camera-app.html
そのiPhone版を 
作りました。
Depth From Sequence 
iPhoneを手に持って撮影した画像シーケンスから奥行きを推定します
Depth From Sequence 
• ソースコードは公開しています。 
• https://github.com/ginrou/DepthFromSequence 
• C++ 
• 動作環境 
• CMake OpenCVの動く環境 
• Mac, Linux(多分) 
• iOS
元ネタ 
• 元ネタはLensBlurの元になった論文 
• 3D Reconstruction from Accidental Motion 
(Fisher Yu et al. CVPR 2014) 
• この論文をベースに実際に使えるように少し改良
アルゴリズム・入力画像 
• 1280x720で撮影して 640x320 に縮小して処理 
• 実際のデプスを計測するのは中央の320x320の領域 
• 10 ~ 15枚ほどが安定している
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
• KLT Trackerを使って特徴点追跡 
最初のフレームでは150個の特徴点を追跡し、 
最終フレームで70個まで減ったら失敗
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
• Feature Trackingの結果からカメラの位置と姿勢を推定 
• Bundle Adjustment 
• 便利ライブラリなかったので実装しました
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
• パラメータ 
• 最大反復回数は 5 回 
• 反復終了時に再投影エラーが 1.0 未満だと失敗とみなす
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
•入力画像がある奥行き上にあると仮定してワーピング 
•ワーピング画像を積み重ね、輝度一致度で奥行きを推定
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
• 輝度一致度だけで奥行きを求めると精度が悪い 
•テクスチャのない箇所に弱い 
•グラフカットを利用して精度向上 
• http://graphics.stanford.edu/projects/densecrf/ を利用
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
• 輝度一致度だけで奥行きを求めると精度が悪い 
•テクスチャのない箇所に弱い 
•グラフカットを利用して精度向上 
• http://graphics.stanford.edu/projects/densecrf/ を利用
アルゴリズム 
Feature 
Tracking 
Bundle 
Adjustment 
Plane 
Sweep 
•奥行き分解能は奥行きに反比例 
•近いものは細かく計れるが、遠いものは粗くなる 
•奥行き分解能は20~32段階くらい 
•分解能を上げるとメモリを圧迫する 
•100MBくらい食うのでスマートフォンにはキツイ
iPhoneへ移植 
• iOSはC++をそのまま使える 
• ただそのままだと扱いづらい 
• C++ / Objective-C / Objective-C++ を使い分ける
Objective-C/ Objective-C++ / C++ 
どう使い分けるか? 
Objective-C Objective-C++ C++ 
• Obj-C C++ の橋渡し 
• UIImage と cv::Mat 
の変換 
• 非同期処理 
• カメラのバッファ 
• UI 
• 画像処理のコア 
まずはコア部分を独立して開発
Objective-C/ Objective-C++ / C++ 
どう使い分けるか? 
Objective-C Objective-C++ C++ 
• Obj-C C++ の橋渡し 
• UIImage と cv::Mat 
の変換 
• 非同期処理 
• カメラのバッファ 
• UI 
• 画像処理のコア 
うまく行ったらiiPPhhoonneeの部分を作る
残りの課題 
• パラメータチューニング (もう少しよく出来そう) 
• ステレオ法だけで挑んでみる 
• CocoaPods化 
• 実スケール単位での計測(1m, 2m とか実測)
ご静聴ありがとうございました

Depth From Sequence