OpenCVについて

記事を共有する:

1. OpenCV とは [概要]

OpenCV (Open Source Computer Vision Library) とは,実時間処理のコンピュータビジョン向けの関数群を広範囲で網羅する,オープンソースライブラリである (Apache2ライセンス).ソースコードはC++で開発されており,一部処理に対してはGPU 高速化も備えている.Verison 2系, 3系, 4系の順に,メジャーバージョンを更新していき,現在はOpenCV4系が開発されている.

OpenCVはクロスプラットフォームであり,デスクトップOSの他にも,AndroidやiOS等のモバイルOSにも対応している.またARMでも動作するなど,さまざまな計算機で使用できるライブラリである (https://opencv.org/platforms/). 

加えて,OpenCVには他言語バインディングが多く提供されている.その中でも,「Python バインディング」が提供されている.このおかげで,IPythonやJupyterNotebookなどの「科学計算的なインタラクティブ環境」上でも使うことできて,科学計算分野の人間からすると非常に便利である.OpenCV の Python バインディングは,科学技術計算全般でのPythonの人気上昇から追加されたもので,結果的に近年ではラズベリーパイなどのエッジ計算モジュールにおいても, OpenCV Pythonバインディングの使用が増えることとなった.

2. OpenCV の歴史と,使用用途の変遷

OpenCV はアルファ版が2000年 (CVPR2000) にお披露目され,ベータ版を経たのち,2006年にversion 1.0がにリリースされ,当初はインテル社が開発していた.その後2009年に,ロボットベンチャーのWillow Garage に保守が移管され,その後 Itseez社に移管された.更に,そのItseez社をインテル社が買収したことにより,現在は再びインテルがOpenCVを主に保守・開発している状況に戻っている.

初期はロボットビジョン向けに開発

Willow Garage社が2009年以降はロボットビジョン目線で保守していたという事情もあり,Willow Garage社が同時期に開発していた ROS (Robot Operating System) の,PerceptionモジュールにもOpenCVが標準的に組み込まれている.従って,その当時は自律移動ロボットやロボットアーム向けに必要な機能が優先的に実装されていた.ただ,徐々にOpenCVのコミュニティがロボットビジョン以外にも大きく広がり,ユーザーの多様性も拡大していった.それに伴い,ロボットビジョンに限らず,コンピュータビジョン・画像認識全般の用途のモジュール(機能)も,OpenCVに多く追加されるようになっていった.

C言語APIの廃止と,完全C++化

OpenCVの開発は,C言語で当初スタートした.その構造体・関数群であるC++ラッパーが登場したのちに,c言語はレガシーAPIとみなされていき,C++がOpenCVのメイン開発言語となった.近年の若手の研究開発社のみなさんの中には,そもそもOpenCVはほとんど触ったことがなく,深層学習ライブラリでしかコンピュータビジョンの研究開発を行なったことがない人も多いであろう.しかし,私のようにC++のみでの開発にOpenCVが移行する前からOpenCVに触っていた世代の人間は,OpenCVの 旧C言語APIにも 触れて(苦労して)いたわけである.

深層学習登場以降

OpenCVは開発者はもとより,研究者の間でも標準的に使用されるライブラリであった.ところが,2010年台序盤にディープラーニングの流行が始まって以降は,みんな深層学習の研究開発に移行したため,機械学習・画像認識向けには研究者にOpenCVが使用される機会が減っていった.

また,スマホアプリ向けの用途などでも,Appleが独自のケータイ向けのライブラリを開発し,そこには顔認識なども用意されていたりするなどなって,自分でアルゴリズムを組むプロ以外は,OpenCVの活用の場が減っていった(画像認識全体がコモディティ化していったと言えば良いだけであるかもしれない).

2010年前後での「Compute Visionアプリケーションなら,頻繁にOpenCVが使われていた」という使用状況と比べると,近年のコンピュータビジョンは深層学習が主役になってきたこともあいまって,OpenCVの使用場所は限定的になっている.もちろん深層学習も要らず,OpenCV に搭載されている機能で済む応用のニーズがある応用や計算機では,現在でも積極的に使用されているはずではある.(あくまで憶測であり,実際の使用度合いまでは調べられないのでわからない).

一方で,OpenCV2系くらいの時代の「業界のライブラリでOpenCVが主役だった頃」と比べると,近年はロボットの商用化が,工場以外の用途でも増えてきている(店内配達ロボットなど).この中で,ROSの需要増加が起きているので,これまではアカデミック向けだった印象のある「ROS + OpenCV のロボットビジョン向けの開発」ニーズが,以前より少し上昇傾向にあると言えるかもしれない.

3. 開発プログラミング言語 と OpenCV バインディング

現在のOpenCVは,C++で書かれており,メインのインターフェースもC++である.Python, Java, Matlab, Octave, Javascript などによるバインディングが提供されている.また,有志により非公式に開発されているその他言語向けのバインディングも存在する (OpenCVSharpなど).

C言語インターフェースは,OpenCV3.x系からはレガシー扱いで保守はされておらず, 最新のOpenCV4系 (2018年11月リリース)では完全にC++のみの開発に移行し,C言語インターフェースは廃止された.

4. OpenCVのインターフェースの特徴

C言語からスタートしてそのラッパーとしてC++版に移行したこともあり,初期の関数の多くがC関数のインターフェースを継承したままC++のクラスに移行したので,関数群的なライブラリである特徴をOpenCVは有する.一方で,それ以降に追加されたモジュールや,Google Summer of Codeなどで新規追加されていったモジュールでは,各機能が初めからクラス化されたオブジェクト指向設計で設計されている .例とえば C言語時代の関数群をまとめた cv::KalmanFilter はC言語APIの関連関数群と構造体をC++のクラスにまとめたものに過ぎないが,v4.5.1で追加された cv::detail::tracking::kalman_filters::UnscentedKalmanFilter は最初からクラスオブジェクトとして設計されている.

Pythonインターフェース

Pythonインターフェースは,OpenCV2の頃はC++版の関数を全てラップして提供していた網羅的なラッパーだった.ただ,その頃から比べると,現在のOpenCV4.x系では, 特にExtraモジュール側だと,C++からしか使用できない他言語にラップ提供されていないクラス・モジュールの割合は少し高くなっている.逆にMainモジュールの方では,dnnモジュールなど,近年ニーズがあり重要度の高いモジュールも含めて,全てPythonインターフェースも提供されている傾向にある.

(OpenCV3 系の登場移行は特に)時代的にGoogle Summer of Codeなどのインターン学生による新規モジュール追加も沢山続いたことで,Extra側には大量のモジュールが新規追加された.短期間に作られるモジュールもあり,それらは若干保守不足というか多言語バインディングまで手を回せなかったと憶測されるものもある.

References

関連書籍

外部参考サイト