OpenCV 3.0 on iOS

56,312 views

Published on

Core Image や vImage、GPUImage 等々、便利な画像/映像処理フレームワークが存在する昨今のiOS開発環境においても、OpenCVも依然として魅力的ですよ、という話。

Published in: Technology

OpenCV 3.0 on iOS

  1. 1. OpenCV 3.0 on iOS 堤 修一 @shu223 2015.5.16 yidev #19
  2. 2. • 堤 修一(つつみ しゅういち) • iOS専業フリーランス • ブログ『Over&Out その後』 • 著書
 『iOS×BLE Core Bluetoothプログラミング』
 『iOSアプリ開発 達人のレシピ100』 • WWDC 2015 行きます! 自己紹介
  3. 3. 制作実績(BLE関連)
  4. 4. 制作実績(BLE関連)
  5. 5. 制作実績(BLE関連) Music for the Deaf
  6. 6. 制作実績(BLE関連) Music for the Deaf
  7. 7. 制作実績(BLE関連) Music for the Deaf
  8. 8. 制作実績(BLE関連) Music for the Deaf
  9. 9. OpenCV とは by Google
  10. 10. はじめに: iOSと画像/動画処理の歴史
  11. 11. • iOS 3, 4 時代
  12. 12. • iOS 3, 4 時代 - Core Image も vImage もまだなく、@niw さんがビルドした OpenCV バイナリをみんな使用
  13. 13. • iOS 3, 4 時代 - Core Image も vImage もまだなく、@niw さんがビルドした OpenCV バイナリをみんな使用 • iOS 5 時代
  14. 14. • iOS 3, 4 時代 - Core Image も vImage もまだなく、@niw さんがビルドした OpenCV バイナリをみんな使用 • iOS 5 時代 - Core Image 登場。顔認識やフィルタ処理がサックリできるよう になる
  15. 15. • iOS 3, 4 時代 - Core Image も vImage もまだなく、@niw さんがビルドした OpenCV バイナリをみんな使用 • iOS 5 時代 - Core Image 登場。顔認識やフィルタ処理がサックリできるよう になる - vImage 登場。CPUのベクトルプロセッサを利用して最適化され た画像処理が可能に
  16. 16. • iOS 3, 4 時代 - Core Image も vImage もまだなく、@niw さんがビルドした OpenCV バイナリをみんな使用 • iOS 5 時代 - Core Image 登場。顔認識やフィルタ処理がサックリできるよう になる - vImage 登場。CPUのベクトルプロセッサを利用して最適化され た画像処理が可能に - GPUImage 登場(2012年2月)。その後iOSにおける画像/動画処 理のデファクトスタンダードOSSに
  17. 17. • iOS 6, 7
  18. 18. • iOS 6, 7 - Core Image や vImage の機能が増強される(CIFilter でいえ ば、48 種 → 94 種 → ? )
  19. 19. • iOS 6, 7 - Core Image や vImage の機能が増強される(CIFilter でいえ ば、48 種 → 94 種 → ? ) • iOS 8
  20. 20. • iOS 6, 7 - Core Image や vImage の機能が増強される(CIFilter でいえ ば、48 種 → 94 種 → ? ) • iOS 8 - CIKernel が iOS でも利用できるようになり、自分でシェー ダを書いてカスタムフィルタを自作可能に
  21. 21. • iOS 6, 7 - Core Image や vImage の機能が増強される(CIFilter でいえ ば、48 種 → 94 種 → ? ) • iOS 8 - CIKernel が iOS でも利用できるようになり、自分でシェー ダを書いてカスタムフィルタを自作可能に - CIDetector も QRコード検出等の機能追加
  22. 22. OpenCV が iOS 開発者界隈で 忘れられつつあるような・・・
  23. 23. 今日話すこと
  24. 24. 今となっては iOS では Core Image も vImage も GPUImage も自作シェーダも使えるけど、
  25. 25. 今となっては iOS では Core Image も vImage も GPUImage も自作シェーダも使えるけど、 OpenCV もすごくいいですよ
  26. 26. 今となっては iOS では Core Image も vImage も GPUImage も自作シェーダも使えるけど、 OpenCV もすごくいいですよ という話を、最新版 3.0.0 ベースで話します。
  27. 27. なぜ今OpenCVか?
  28. 28. 理由その1:圧倒的に機能が豊富
  29. 29. 理由その1:圧倒的に機能が豊富 • 2500以上のアルゴリズム・機能
  30. 30. 理由その1:圧倒的に機能が豊富 • 2500以上のアルゴリズム・機能 • 最新アルゴリズムが日々実装されている - GSoC(Google Summer Of Code)
  31. 31. 理由その2:Cross Platform
  32. 32. 理由その2:Cross Platform • サポートしているプラットフォーム - iOS - Android - Linux - Mac OS X - Windows - etc…
  33. 33. 理由その2:Cross Platform • サポートしているプラットフォーム - iOS - Android - Linux - Mac OS X - Windows - etc… • 言語はC++
  34. 34. 理由その3:今が熱い
  35. 35. 理由その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
  36. 36. 理由その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年ぶりのメジャーアップデート!
  37. 37. OpenCV でできること の一例 (かつ Core Image や vImage でできないこと)
  38. 38. 顔「以外」のものを検出
  39. 39. 顔「以外」のものを検出 同梱の学習ツールを使い、分類器自体を自作
  40. 40. 顔「以外」のものを検出 同梱の学習ツールを使い、分類器自体を自作 → 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ)
  41. 41. 顔「以外」のものを検出 同梱の学習ツールを使い、分類器自体を自作 → 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ) 車
  42. 42. 顔「以外」のものを検出 同梱の学習ツールを使い、分類器自体を自作 → 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ) 車 動物
  43. 43. 顔「以外」のものを検出 同梱の学習ツールを使い、分類器自体を自作 → 任意の対象を検出可能(CIDetectorでは顔やQRコード等、APIが用意されているものだけ) 参考:『顔以外のものを画像認識する - Qiita』 車 動物 ロゴ
  44. 44. 顔を「認識」する
  45. 45. 顔を「認識」する • 顔「検出」ではなく「認識」 - 誰の顔かを推定する
  46. 46. 顔を「認識」する • 顔「検出」ではなく「認識」 - 誰の顔かを推定する • 複数種の手法が実装されてい る - Eigenfaces - Fisherfaces - Local Binary Patterns Histogram(LBPH)
  47. 47. 特徴点の検出
  48. 48. 特徴点の検出 • 特徴量算出に用いる
  49. 49. 特徴点の検出 • 特徴量算出に用いる • 用途 - ARのマーカー認識 - パノラマ写真合成 - 物体認識
  50. 50. 特徴点の検出 • 特徴量算出に用いる • 用途 - ARのマーカー認識 - パノラマ写真合成 - 物体認識 • 多数の手法が実装されている - SIFT - SURF - ORB - AKAZE 3.0.0
  51. 51. 文字検出・認識 3.0.0
  52. 52. 文字検出・認識 • 文字領域の「検出」 - ERFilter 3.0.0
  53. 53. 文字検出・認識 • 文字領域の「検出」 - ERFilter • 文字の「認識」 - OCRTesseract OCRライブラリTesseractのラッパー - OCRHMMDecoder 3.0.0
  54. 54. 物体追跡 3.0.0
  55. 55. 物体追跡 • 映像内で見え方が刻々と変化する 物体を追跡 3.0.0
  56. 56. 物体追跡 • 映像内で見え方が刻々と変化する 物体を追跡 • 複数実装あり - TrackerBoosting - TrackerMIL - TrackerMedianFlow - TrackerTLD 3.0.0
  57. 57. 物体追跡 • 映像内で見え方が刻々と変化する 物体を追跡 • 複数実装あり - TrackerBoosting - TrackerMIL - TrackerMedianFlow - TrackerTLD 3.0.0 動画内のパンダが向きを変えても執拗に トラッキング!(3:14∼)
  58. 58. 物体追跡 • 映像内で見え方が刻々と変化する 物体を追跡 • 複数実装あり - TrackerBoosting - TrackerMIL - TrackerMedianFlow - TrackerTLD • Tracker以外にも物体追跡の手法は (3.0より前から)色々とあるらしい 3.0.0 動画内のパンダが向きを変えても執拗に トラッキング!(3:14∼)
  59. 59. High Dynamic Range Imaging (HDR) 3.0.0
  60. 60. High Dynamic Range Imaging (HDR) 3.0.0 Exposure sequence
  61. 61. High Dynamic Range Imaging (HDR) 3.0.0 Exposure sequence Exposure fusion
  62. 62. 画像修復・補間(Inpainting)
  63. 63. 画像修復・補間(Inpainting) • 写真に意図せず写りこんでし まった物体等を取り除き、そ れによって欠損した領域を自 動修復する技術
  64. 64. 画像修復・補間(Inpainting) • 写真に意図せず写りこんでし まった物体等を取り除き、そ れによって欠損した領域を自 動修復する技術 • 関数を1つ呼ぶだけ
  65. 65. 画像修復・補間(Inpainting) • 写真に意図せず写りこんでし まった物体等を取り除き、そ れによって欠損した領域を自 動修復する技術 • 関数を1つ呼ぶだけ 元画像
  66. 66. 画像修復・補間(Inpainting) • 写真に意図せず写りこんでし まった物体等を取り除き、そ れによって欠損した領域を自 動修復する技術 • 関数を1つ呼ぶだけ 元画像 除去したい部分を指定
  67. 67. 画像修復・補間(Inpainting) • 写真に意図せず写りこんでし まった物体等を取り除き、そ れによって欠損した領域を自 動修復する技術 • 関数を1つ呼ぶだけ 元画像 除去したい部分を指定
  68. 68. 他にも色々
  69. 69. 他にも色々 領域分割・ラベリング
  70. 70. 他にも色々 領域分割・ラベリング Objectiveness 検出
  71. 71. 他にも色々 領域分割・ラベリング Objectiveness 検出 三次元姿勢(Pose)推定
  72. 72. iOS アプリへの導入方法
  73. 73. 1. ビルドスクリプト を実行
 
 2. プロジェクトに追加 3. 依存フレームワークを追加 おなじみの3ステップ
  74. 74. CocoaPods?
  75. 75. 一部バージョンは可能 • 野良でビルド済みバイナリを置いてpodspec提供し てる人がいる - https://github.com/Fl0p/OpenCV-iOS - 2.4.8 が最新 - pull request 送ってみるといいかも - オフィシャルで対応してほしいところ。。
  76. 76. Swift からの利用
  77. 77. • C++ で書く必要があるので、ObjC でラッパー書い て Bridging Header で呼び出す
  78. 78. OpenCV のパフォーマンス
 on iOS
  79. 79. GPUの利用 • NVidia CUDA ランタイム API を利用して実装されている → iOS デバイスには恩恵なし 参考:GPUモジュールの概要説明 — opencv 2.2 documentation • OpenCV の豊富な機能をOpenGL ES 2.0シェーダで書き 換えて iOS (の GPU で)使いたい、というのが GPUImage を作った動機らしい
  80. 80. 並列化技術のサポート OpenCVがサポートしている並列化技術: • OpenMP / TBB (Threading Building Blocks) - iOSには関係なし(?←よくわかってない) • OpenCL - Private Framework としてはiOSに入ってるらしい - が、Privateなので現状では恩恵受けてないはず • GCD - 2.4.3以降、一部処理でサポート(by Change Log)
  81. 81. Accelerate.framework との併用 cv::Mat から vImage_Buffer に変換 → vImage の処理を併用可能 - vImage 等、Accelerate∼にある処理はそっちを使う、という選択肢がとれる
  82. 82. 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
  83. 83. まとめ
  84. 84. OpenCV on iOS • ひさしぶりのメジャーアップデートで今が熱い • 他にはない機能が盛りだくさん • パフォーマンス面では vImage、Core Image、GPUImage と比較すると不利かも。ただしそれらと併用可能 ➡ Core Image や GPUImage にはない高度な/最新の処理 を行いたい場合は OpenCV もあたってみるといいかも
  85. 85. 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 について発表してきました

×