opencv 3.0 on ios

85
OpenCV 3.0 on iOS 修一 @shu223 2015.5.16 yidev #19

Upload: shuichi-tsutsumi

Post on 20-Jul-2015

5.309 views

Category:

Technology


8 download

TRANSCRIPT

OpenCV 3.0 on iOS堤 修一 @shu223 2015.5.16 yidev #19

• 堤 修一(つつみ しゅういち)

• iOS専業フリーランス

• ブログ『Over&Out その後』

• 著書『iOS×BLE Core Bluetoothプログラミング』『iOSアプリ開発 達人のレシピ100』

• WWDC 2015 行きます!

自己紹介

制作実績(BLE関連)

制作実績(BLE関連)

制作実績(BLE関連)

Music for the Deaf

制作実績(BLE関連)

Music for the Deaf

制作実績(BLE関連)

Music for the Deaf

制作実績(BLE関連)

Music for the Deaf

OpenCV とは by Google

はじめに:

iOSと画像/動画処理の歴史

• iOS 3, 4 時代

- Core Image も vImage もまだなく、@niw さんがビルドした

OpenCV バイナリをみんな使用

• iOS 3, 4 時代

- Core Image も vImage もまだなく、@niw さんがビルドした

OpenCV バイナリをみんな使用

• iOS 5 時代

• iOS 3, 4 時代

- Core Image も vImage もまだなく、@niw さんがビルドした

OpenCV バイナリをみんな使用

• iOS 5 時代

- Core Image 登場。顔認識やフィルタ処理がサックリできるようになる

• iOS 3, 4 時代

- Core Image も vImage もまだなく、@niw さんがビルドした

OpenCV バイナリをみんな使用

• iOS 5 時代

- Core Image 登場。顔認識やフィルタ処理がサックリできるようになる

- vImage 登場。CPUのベクトルプロセッサを利用して最適化された画像処理が可能に

• iOS 3, 4 時代

- Core Image も vImage もまだなく、@niw さんがビルドした

OpenCV バイナリをみんな使用

• iOS 5 時代

- Core Image 登場。顔認識やフィルタ処理がサックリできるようになる

- vImage 登場。CPUのベクトルプロセッサを利用して最適化された画像処理が可能に

- GPUImage 登場(2012年2月)。その後iOSにおける画像/動画処理のデファクトスタンダードOSSに

• iOS 6, 7

- Core Image や vImage の機能が増強される(CIFilter でいえば、48 種 → 94 種 → ? )

• iOS 6, 7

- Core Image や vImage の機能が増強される(CIFilter でいえば、48 種 → 94 種 → ? )

• iOS 8

• iOS 6, 7

- Core Image や vImage の機能が増強される(CIFilter でいえば、48 種 → 94 種 → ? )

• iOS 8

- CIKernel が iOS でも利用できるようになり、自分でシェーダを書いてカスタムフィルタを自作可能に

• iOS 6, 7

- Core Image や vImage の機能が増強される(CIFilter でいえば、48 種 → 94 種 → ? )

• iOS 8

- CIKernel が iOS でも利用できるようになり、自分でシェーダを書いてカスタムフィルタを自作可能に

- CIDetector も QRコード検出等の機能追加

OpenCV が iOS 開発者界隈で忘れられつつあるような・・・

今日話すこと

今となっては iOS では Core Image も vImage も

GPUImage も自作シェーダも使えるけど、

今となっては iOS では Core Image も vImage も

GPUImage も自作シェーダも使えるけど、

OpenCV もすごくいいですよ

今となっては iOS では Core Image も vImage も

GPUImage も自作シェーダも使えるけど、

OpenCV もすごくいいですよ

という話を、最新版 3.0.0 ベースで話します。

なぜ今OpenCVか?

理由その1:圧倒的に機能が豊富

理由その1:圧倒的に機能が豊富• 2500以上のアルゴリズム・機能

理由その1:圧倒的に機能が豊富• 2500以上のアルゴリズム・機能

• 最新アルゴリズムが日々実装されている

- GSoC(Google Summer Of Code)

理由その2:Cross Platform

理由その2:Cross Platform• サポートしているプラットフォーム

- iOS - Android - Linux - Mac OS X - Windows - etc…

理由その2:Cross Platform• サポートしているプラットフォーム

- iOS - Android - Linux - Mac OS X - Windows - etc…

• 言語はC++

理由その3:今が熱い

理由その3:今が熱い• Release History

- 1.0 2006.10 - 2.0 2009.10 - 2.1 2010.4 - 2.2 2010.12 - 2.3 2011.7 - 2.4 2012.5 - 3.0 RC1 2015.4.24

理由その3:今が熱い• Release History

- 1.0 2006.10 - 2.0 2009.10 - 2.1 2010.4 - 2.2 2010.12 - 2.3 2011.7 - 2.4 2012.5 - 3.0 RC1 2015.4.24

6年ぶりのメジャーアップデート!

OpenCV でできること

の一例(かつ Core Image や vImage でできないこと)

顔「以外」のものを検出

顔「以外」のものを検出同梱の学習ツールを使い、分類器自体を自作

顔「以外」のものを検出同梱の学習ツールを使い、分類器自体を自作

→ 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ)

顔「以外」のものを検出同梱の学習ツールを使い、分類器自体を自作

→ 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ)

顔「以外」のものを検出同梱の学習ツールを使い、分類器自体を自作

→ 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ)

車 動物

顔「以外」のものを検出同梱の学習ツールを使い、分類器自体を自作

→ 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ)

参考:『顔以外のものを画像認識する - Qiita』

車 動物 ロゴ

顔を「認識」する

顔を「認識」する• 顔「検出」ではなく「認識」

- 誰の顔かを推定する

顔を「認識」する• 顔「検出」ではなく「認識」

- 誰の顔かを推定する

• 複数種の手法が実装されている

- Eigenfaces

- Fisherfaces

- Local Binary Patterns Histogram(LBPH)

特徴点の検出

特徴点の検出• 特徴量算出に用いる

特徴点の検出• 特徴量算出に用いる

• 用途

- ARのマーカー認識

- パノラマ写真合成

- 物体認識

特徴点の検出• 特徴量算出に用いる

• 用途

- ARのマーカー認識

- パノラマ写真合成

- 物体認識

• 多数の手法が実装されている

- SIFT

- SURF

- ORB

- AKAZE 3.0.0

文字検出・認識 3.0.0

文字検出・認識• 文字領域の「検出」

- ERFilter

3.0.0

文字検出・認識• 文字領域の「検出」

- ERFilter

• 文字の「認識」

- OCRTesseract OCRライブラリTesseractのラッパー

- OCRHMMDecoder

3.0.0

物体追跡 3.0.0

物体追跡• 映像内で見え方が刻々と変化する物体を追跡

3.0.0

物体追跡• 映像内で見え方が刻々と変化する物体を追跡

• 複数実装あり

- TrackerBoosting

- TrackerMIL

- TrackerMedianFlow

- TrackerTLD

3.0.0

物体追跡• 映像内で見え方が刻々と変化する物体を追跡

• 複数実装あり

- TrackerBoosting

- TrackerMIL

- TrackerMedianFlow

- TrackerTLD

3.0.0

動画内のパンダが向きを変えても執拗にトラッキング!(3:14~)

物体追跡• 映像内で見え方が刻々と変化する物体を追跡

• 複数実装あり

- TrackerBoosting

- TrackerMIL

- TrackerMedianFlow

- TrackerTLD

• Tracker以外にも物体追跡の手法は(3.0より前から)色々とあるらしい

3.0.0

動画内のパンダが向きを変えても執拗にトラッキング!(3:14~)

High Dynamic Range Imaging (HDR) 3.0.0

High Dynamic Range Imaging (HDR) 3.0.0

Exposure sequence

High Dynamic Range Imaging (HDR) 3.0.0

Exposure sequence Exposure fusion

画像修復・補間(Inpainting)

画像修復・補間(Inpainting)• 写真に意図せず写りこんでしまった物体等を取り除き、それによって欠損した領域を自動修復する技術

画像修復・補間(Inpainting)• 写真に意図せず写りこんでしまった物体等を取り除き、それによって欠損した領域を自動修復する技術

• 関数を1つ呼ぶだけ

画像修復・補間(Inpainting)• 写真に意図せず写りこんでしまった物体等を取り除き、それによって欠損した領域を自動修復する技術

• 関数を1つ呼ぶだけ

元画像

画像修復・補間(Inpainting)• 写真に意図せず写りこんでしまった物体等を取り除き、それによって欠損した領域を自動修復する技術

• 関数を1つ呼ぶだけ

元画像 除去したい部分を指定

画像修復・補間(Inpainting)• 写真に意図せず写りこんでしまった物体等を取り除き、それによって欠損した領域を自動修復する技術

• 関数を1つ呼ぶだけ

元画像 除去したい部分を指定

他にも色々

他にも色々領域分割・ラベリング

他にも色々領域分割・ラベリング

Objectiveness 検出

他にも色々領域分割・ラベリング

Objectiveness 検出

三次元姿勢(Pose)推定

iOS アプリへの導入方法

1. ビルドスクリプト を実行

2. プロジェクトに追加

3. 依存フレームワークを追加

おなじみの3ステップ

CocoaPods?

一部バージョンは可能• 野良でビルド済みバイナリを置いてpodspec提供してる人がいる

- https://github.com/Fl0p/OpenCV-iOS - 2.4.8 が最新

- pull request 送ってみるといいかも

- オフィシャルで対応してほしいところ。。

Swift からの利用

• C++ で書く必要があるので、ObjC でラッパー書いて Bridging Header で呼び出す

OpenCV のパフォーマンス on iOS

GPUの利用• NVidia CUDA ランタイム API を利用して実装されている

→ iOS デバイスには恩恵なし

参考:GPUモジュールの概要説明 — opencv 2.2 documentation

• OpenCV の豊富な機能をOpenGL ES 2.0シェーダで書き換えて iOS (の GPU で)使いたい、というのが

GPUImage を作った動機らしい

並列化技術のサポートOpenCVがサポートしている並列化技術:

• OpenMP / TBB (Threading Building Blocks)

- iOSには関係なし(?←よくわかってない)

• OpenCL

- Private Framework としてはiOSに入ってるらしい

- が、Privateなので現状では恩恵受けてないはず

• GCD

- 2.4.3以降、一部処理でサポート(by Change Log)

Accelerate.framework との併用

cv::Mat から vImage_Buffer に変換 → vImage の処理を併用可能

- vImage 等、Accelerate~にある処理はそっちを使う、という選択肢がとれる

NEON• 参考書籍:「iOS SDK Hacks」

- NEONを用いたベクトル演算のサンプル・ベンチマーク

• NEONを用いたアルファブレンディングのサンプル

- https://github.com/Itseez/opencv_for_ios_book_samples/ • CvEffects/CvEffects/Processing_NEON.cpp

• OpenCV 3.0 では NEON による最適化も行われているらしい

open-source NEON optimizations - OpenCV Q&A Forum3.0.0

まとめ

OpenCV on iOS• ひさしぶりのメジャーアップデートで今が熱い

• 他にはない機能が盛りだくさん

• パフォーマンス面では vImage、Core Image、GPUImage

と比較すると不利かも。ただしそれらと併用可能

➡ Core Image や GPUImage にはない高度な/最新の処理を行いたい場合は OpenCV もあたってみるといいかも

See also• OpenCV for iOS で画像の自動補間・修復

• iOS / OpenCV 3.0 で画像の特徴点を検出する(AKAZE, SIFT, SURF, ORB)

• OpenCV for iOS でウォーリーを探すカメラアプリをつくる

• OpenCV 3.0 の拡張モジュール群 opencv_contrib を iOS で利用する

• iOSと機械学習

• 「FILTERS」で学ぶ GLSL

• 【oFセミナーメモ5】映像解析

• 【iOS8】CIKernel を使ったカスタムフィルタのつくりかた

• 「顔以外」のものを画像認識する

• OpenCV for iOSの使い方

• Core Image の遷移エフェクトを使う

• Core Image の全エフェクトを試せるサンプルコードを公開しました

• シャッター音の鳴らないカメラアプリの実装方法

• 『漫画カメラ』風に写真を加工するiPhoneアプリの作り方

• 『第3回 iphone_dev_jp 東京iPhone/Mac勉強会』で vImage について発表してきました