OpenCV入門【3.0対応】(1)

OpenCV入門【3.0対応】(1)

OpenCVとは? 最新3.0の新機能概要とモジュール構成

2015年7月27日 改訂 (初版:2014/4/23)

オープンソースのコンピューター・ビジョン・ライブラリ「OpenCV」 3.0のリリースに合わせて連載再始動! 今回はOpenCVの概要と基本機能を紹介する。ベータ→正式版に合わせて改訂。

@dandelion1124(dandelion's log
  • このエントリーをはてなブックマークに追加

1. OpenCV

1.1 OpenCVとは

 OpenCV(正式名称: Open Source Computer Vision Library)は、オープンソースのコンピューター・ビジョン・ライブラリです。コンピューターで画像や動画を処理するのに必要な、さまざま機能が実装されており、BSDライセンスで配布されていることから学術用途だけでなく商用目的でも利用できます。加えて、マルチプラットフォーム対応されているため、幅広い場面で利用されていることが特徴です。

 OpenCVは、Intelで開発され、その後、ロボティクス関連のハードウェア/ソフトウェアの開発を行っているWillow Garageに開発が引き継がれた後、現在はコンピュータービジョンの技術開発を手掛けるItseezによって開発が進められています。

 OpenCVを使うと、主に以下のような機能を利用できます。

  • フィルター処理
  • 行列演算
  • オブジェクト追跡(Object Tracking)
  • 領域分割(Segmentation)
  • カメラキャリブレーション(Calibration)
  • 特徴点抽出
  • 物体認識(Object recognition)
  • 機械学習(Machine learning)
  • パノラマ合成(Stitching)
  • コンピュテーショナルフォトグラフィ(Computational Photography)
  • GUI(ウィンドウ表示、画像ファイル、動画ファイルの入出力、カメラキャプチャ)

 図1はOpenCVの機能の一部を紹介した図です(「CVPR 2015チュートリアル資料」から引用)。

図1 OpenCVの主要機能

core(データ構造、行列演算、エラー処理など)highgui、imgcodecs、videoio(GUI、画像ファイル入出力、動画ファイルの入出力、カメラキャプチャ)をベースとして、このような多種多様な機能が提供されています。各英単語の意味は、上記の箇条書きを参考にしてください。

1.2 歴史

 OpenCVは、2006年に1.0がリリースされ、2009年にメジャーバージョンが実施され2.0がリリースされました。その後、しばらく2.4.x系のリリースが続いた後、ついに2015年6月にメジャーバージョンが実施され、3.0がリリースされました。

バージョン リリース年月
1.0 2006.10
2.0 2009.10
2.1 2010.4
2.2 2010.12
2.3 2011.7
2.4 2012.5
2.4.1 2012.6
2.4.2 2012.7
2.4.3 2012.11
2.4.4 2013.3
2.4.5 2013.4
2.4.6 2013.7
2.4.7 2013.11
2.4.8 2013.12
2.4.9 2014.4
2.4.10 2014.10
2.4.11 2015.2
3.0 2015.6
表1 バージョンごとのリリース年月

 また、CVPR 2015チュートリアル資料の情報によると、OpenCV 3.1は2015年の4Qにリリース予定のようです。

2. OpenCV 3.0とは

2.1 構成技術

 OpenCV 3.0の構成技術を図2に示します(「CVPR 2015チュートリアル資料」から引用)。これらの詳細は後述します。

図2 OpenCV 3.0を構成する技術(「CVPR 2015チュートリアル資料」から引用)

 また、OpenCVではGoogle Summer of Code(GSOC)の成果をベースにして、機能の追加やチュートリアルの拡充が行われています。図3はOpenCV GSOC 2014の成果がまとめられたムービーです。ここで紹介されている機能の多くが、OpenCV 3.0から利用できるようになっています。

図3 OpenCV GSOC 2014の成果がまとめられたムービー

 図4はOpenCVを用いた人体追跡のデモムービーです。

図4 人体追跡

 図5はRaspberry Pi上でOpenCVを動作させ、テニスボールを追跡するデモです。OpenCVはARM Linuxもサポートしているため、このような小型コンピューター上でも(CPUやメモリの制約はありますが)OpenCVを動作させることができます。

図5 テニスボール追跡

2.2 サポートOS

 OpenCV 3.0では、以下のプラットフォームが公式サポートされています。

  • Windows
  • Linux
  • Mac OS
  • iOS
  • Android
  • Windows RT

 iOSやAndroidにも対応していることから、モバイル端末向けのアプリケーションにも利用できます。また、ARM環境のLinuxも対応しているため、Raspberry Pi上でも動作させることができます。

2.3 サポート言語

2.3.1 公式サポート言語

 OpenCV 3.0では、以下の言語が公式サポートされています。

  • C(既存のI/F(=インターフェース)は残っているが、3.0からメンテナンス対象外)
  • C++
  • Python
  • Java

 また、バージョンごとの言語サポート状況は以下の通りです。この内容からも分かるように、バージョンを重ねるごとにサポート言語が充実してきています。

バージョン サポート言語の変更内容
1.0 C APIサポート
2.0 C++ APIのサポート追加
2.2 Pythonバインディングのサポート追加(Python2系のみ)
2.4.4 Javaバインディングのサポート追加
3.0 C APIがメンテナンス対象外となる。
PythonバインディングでPython3系のサポートも追加
表2 OpenCVバージョンごとの言語サポート状況

 ただし、上記の箇条書きと表でも説明したように、OpenCV 3.0からC APIがメンテナンス対象外になります(既存のI/Fは残っているものの、バグ対応やI/F変更への追従は行われない)。このため、今後、OpenCVを使ったアプリケーションを開発する場合は、極力C APIは用いず、C++ APIもしくは他のバインディングを用いて開発することをお勧めします。

2.3.2 非公式バインディング

 非公式バインディングのうち、継続して更新が行われているものを以下にピックアップしました。執筆時点で3.0対応のバインディングはEmgu CVのみですが、今後対応される可能性があるため、興味のある方はこれらの動向をチェックしておくとよいでしょう。

バインディング名 言語 URL
OpenCvSharp .NET Framework https://github.com/shimat/opencvsharp
Emgu CV .NET Framework http://www.emgu.com/wiki/
ruby-opencv Ruby https://github.com/ruby-opencv/ruby-opencv
表3 主要な非公式バインディング

 また、その他の非公式バインディングについては、私の個人サイトにある「OpenCV bindingまとめ」にまとめてあります。興味のある方はご参照ください。

2.4 入出力サポート画像

 OpenCVは、以下の画像フォーマットの入出力をサポートしています。詳細は公式ドキュメントを参照してください。

フォーマット 拡張子
Windows bitmap .bmp / .dib
JPEG .jpeg / .jpg / .jpe
JPEG 2000 .jp2
PNG .png
Sun rasters .sr / .ras
TIFF .tiff / .tif
OpenEXR Image .exr
WebP .webp
Portable image format .pbm / .pgm / .ppm
表4 入出力サポート画像

3. 主要モジュール紹介

 OpenCVでは、カテゴリごとに機能をまとめた「モジュール」という単位でライブラリが提供されています。そのため、アプリケーション開発者は必要な機能を含んだモジュールのライブラリをリンクすることで、モジュールの機能を用いることができるようになります。

3.1 モジュール構成

 以下の表にOpenCVを構成する主要ライブラリと、その機能の概要をまとめました。

モジュール名 ライブラリ名 概要
calib3d opencv_calib3d300.lib カメラキャリブレーション、ステレオ対応点探索
core opencv_core300.lib 画像・行列データ構造の提供、配列操作、基本図形描画、XMLおよびYAML入出力、コマンドラインパーサー、ユーティリティ機能など
features2d opencv_features2d300.lib 特徴点抽出(ORB、BRISK、FREAKなど)
hal opencv_hal300.lib ハードウェア機能を用いた最適化(Hardware Acceleration Layer)
highgui opencv_highgui300.lib GUI(ウィンドウ表示など)
imgcodecs opencv_imgcodecs300.lib 画像ファイル入出力
imgproc opencv_imgproc300.lib フィルター処理、アフィン変換、エッジ検出、ハフ検出、色変換、ヒストグラム計算、ラベリングなど
ml opencv_ml300.lib SVM、決定木、ブースティング、ニューラルネットワークなど
objdetect opencv_objdetect300.lib オブジェクト検出(顔検出、人体検出など)
photo opencv_photo300.lib 画像修復、ノイズ除去処理、HDR(High Dynamic Range)合成、画像合成など
shape opencv_shape300.lib 形状マッチング
stitching opencv_stitching300.lib パノラマ合成
superres opencv_superres300.lib 超解像処理
video opencv_video300.lib オプティカルフロー、カルマンフィルター、背景差分など
videoio opencv_videoio300.lib 動画ファイルの入出力、カメラキャプチャなど
videostab opencv_videostab300.lib 手ブレ補正(Video Stabilization)
viz opencv_viz300.lib 3Dデータの可視化(内部的にVTKを使用)
表6 主要モジュールとその機能概要

4. OpenCV 3.0の変更点

 ここではOpenCV 3.0の変更点についてまとめます。詳細は、OpenCV 3.0の公式ニュース(英語)をご参照ください。

4.1 モジュールに関する変更点

 ここではモジュールに関するOpenCV 3.0の変更点についてまとめます。

4.1.1 モジュール追加

 OpenCV 3.0から以下のモジュールが追加されています。詳細は「3.1 モジュール構成」を参照ください。

  • shape
  • hal
4.1.2 モジュール削除

 OpenCV 3.0からは、OpenCV 2.4.xにあった一部のモジュールが削除、もしくはopencv_contrib(=OpenCV用のエクストラモジュール)に移動しています。そのため、OpenCV 2.4.xで作成したコードを3.0でも流用する場合には注意が必要です。

モジュール名(2.4.x) 削除後の対応
ocl oclモジュールは廃止され、cv::UMatに置き換え
nonfree opencv_contribに移動
legacy opencv_contribに移動
contrib opencv_contribに移動
表7 3.0では削除されたモジュール
4.1.3 モジュール細分化

 OpenCV 3.0ではOpenCV 2.4.xにあったモジュールのうち、一部のモジュールが、機能ごとに細分化されています。そのため、OpenCV 2.4.xのコードを3.0でも流用する場合は注意が必要です。

モジュール名(2.4.x) モジュール名(3.0) 細分化の概要
highgui highgui GUI(ウィンドウ表示) 左記のように、機能ごとにモジュールが細分化
imgcodecs 画像ファイル入出力
videoio 動画ファイルの入出力、カメラキャプチャ
gpu cudaarithm 機能ごとにモジュールが細分化
各機能の説明は割愛)
cudabgsegm
cudacodec
cudafeatures2d
cudafilters
cudaimgproc
cudalegacy
cudaobjdetect
cudaoptflow
cudastereo
cudawarping
cudev
表8 3.0では機能ごとにモジュールが細分化された

4.2 高速化

 ここでは高速化に関するOpenCV 3.0の変更点についてまとめます。

4.2.1 T-API

 OpenCV 3.0から「T-API(Transparent API)」と呼ばれるOpenCLを用いたアクセラレーションレイヤーが追加されました。これは、動作環境上でOpenCLが利用できることを検出した場合にはOpenCL実装を用いることで高速化を図る機能です。

 図6は、「CVPR 2015チュートリアル資料(英語)」で紹介されているT-APIの計測結果です。この結果より、T-API(OpenCL)を用いることで高速化できることが分かります。ただし、計測環境によって効果は異なるので参考程度とした方がよいでしょう。

図6 T-APIによる高速化(「CVPR 2015チュートリアル資料」から引用)
4.2.2 IPPICV

 OpenCV 3.0からIntel IPPのサブセットであるIPPICVによって高速化されています。IPPICVは商用・非商用問わず無料で利用できます。利用する際には、ライセンス文書を参照してください。

 図7は、「CVPR 2015チュートリアル資料」で紹介されているIPPICVを用いた場合の計測結果です。この結果から、IPPICVを用いることで高速できていることが分かります。ただし、計測環境によって効果は異なるので参考程度とした方がよいでしょう。

IPPICVによる高速化

図7 IPPICVによる高速化(「CVPR 2015チュートリアル資料」から引用)
4.2.3 HAL(Hardware Acceleration Layer)

 OpenCV 3.0からハードウェア機能(SSE2AVXNEON)を用いた最適化の実装をhalモジュールとして提供しています。OpenCV 3.0時点では一部の機能しか実装されていませんが、OpenCV 3.1以降で実装が拡充される予定のようです。

 また、OpenCV 2.4.x系では、NEONによる最適化があまり行われてきていなかったため、iOSやAndroidデバイス上でパフォーマンスが発揮できない課題がありましたが、OpenCV 3.x系からはhalモジュールなどの導入により改善される見込みです。

4.3 その他

4.3.1 ドキュメント

 2.4系ではSphinxを用いてドキュメントが作成されていましたが、OpenCV 3.0からのドキュメント(英語)は、Doxygenを用いて作成されるようになりました。

4.3.2 バージョン番号

 2.4系ではバージョン番号が2.4.92.4.10というように3桁で構成されていましたが、3.0からは、バージョン番号が3.03.1というように2桁で構成されるようになるようです。

5. オンラインドキュメント

 最後にOpenCVを用いる際に有益な情報がまとまったWebサイトを紹介します。

5.1 公式

5.2 非公式

環境構築
C++
Pythonインターフェース
Tips

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

1. 【現在、表示中】≫ OpenCVとは? 最新3.0の新機能概要とモジュール構成

オープンソースのコンピューター・ビジョン・ライブラリ「OpenCV」 3.0のリリースに合わせて連載再始動! 今回はOpenCVの概要と基本機能を紹介する。ベータ→正式版に合わせて改訂。

2. OpenCV 3.0の新機能(+ 次バージョンのロードマップ)

2015年6月に大望のOpenCVのメジャーバージョンアップ「3.0」が登場した。この新バージョンの新機能をモジュールごとに説明し、次バージョン3.1のロードマップを簡単に紹介する。

3. OpenCVの環境構築(OpenCV 3.0/3.1)

OpenCV 3環境の構築方法として、「公式パッケージを使ったインストール」「CMakeを使ったライブラリのビルド」「NuGetを使ったパッケージインストール」の3ケースを解説。バージョン2.4.9から3.0/3.1に合わせて改訂。

4. 初めてのOpenCV開発 ― Visual Studio/CMake/NuGetでプロジェクト作成【OpenCV 3.0/3.1】

OpenCVを使ったアプリケーションのプロジェクト作成方法として、「Visual Studio」「CMake」「NuGet」の3つの方法を解説する。

5. 初めてのOpenCV開発 ― coreモジュール【OpenCV 3.1.0】

OpenCVのcoreモジュールの概要を解説。そのMatクラスを使って画像データを扱う方法や、ユーティリティ関数、OpenCV 3.0より導入されたUMatクラスを紹介する。

サイトからのお知らせ

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • 日本マイクロソフト株式会社
  • グレープシティ株式会社