
1. OpenCV とは [概要]
OpenCV (Open Source Computer Vision Library) とは,実時間処理むけのコンピュータビジョン向けオープンソースライブラリである (Apache2ライセンス).
https://opencv.org (公式サイト)
この記事は,当サイトのOpenCVカテゴリーのトップ記事であり,OpenCVの完結な全体像(歴史)を,以下の順に紹介する:
- 2. OpenCV の歴史と,使用用途の変遷
- 3. OpenCV の 収録内容 : モジュール群の概要
- 4. メインの開発言語(C++) と各言語ラッパー版の特徴(とくにOpenCV-Python)
OpenCVは,C++で開発されており,ユーザーが使う「主たるインターフェース言語」もC++です.一部処理に対しては,GPU 高速化も備えています.OpenCVは,Verison 2系, 3系, 4系の順に,メジャーバージョンを更新していき,2020年代に入って以降は,「OpenCV4.x 系」が開発されています.
またOpenCVは「クロスプラットフォームな数値計算ライブラリ」です.各デスクトップOSの他にも,AndroidやiOS等のモバイルOSにも対応しており,ARM上でも動作するなど,さまざまな組み込み計算機上で使用できる.また,CUDAやOpenCLなど,GPUを活用した高速(並列)計算への対応も充実している.
※ 対応プラットフォームの一覧は,OpenCV (ja.wikipedia) や,公式サイトの https://opencv.org/platforms/ などを参照のこと).
加えて,OpenCVには他言語バインディングが多く提供されています(4節で詳しく).その中でも特に使われているのが「OpenCV-Python バインディング」である元のC++版よりも,インタラクティブにPythonからOpenCVを使えるので,実験的に試すことが仕事の研究者だけでなく,開発者にとっても色々ためしやすく,非常に便利です(4.1節で詳しく).
また,初期のディープラーニングブームが一段落した2020年以降には,OpenCVにも「PyTorchなどを統合したディープラーニング式画像認識 (例:物体検出など)」が新たに追加されている.
1.1 当サイトでのOpenCV記事のフォーカス:伝統的な「non-deep learningな」関数・モジュール群.
私のCVMLエキスパートガイドでは,ディープラーニングを使用していない,伝統的で古典的なnon-deep learning なOpenCV関数/モジュールについて,主に紹介していきます.
※ [2025/07/22] OpenCVの「モジュールごとの解説記事」や「各クラス・(C++&Python共通の)関数の解説・紹介記事」を,今後少書き始めます.各クラス・関数の記事は,対応する用語wikiの記事とも連携させていきます.今後は,初~中級者層もOpenCVを通じて読者層にとりこみたいのが理由・動機です.(当サイトを大学の授業で使っている教員・学生へも,サイト内にOpenCVの情報もあったほうが,理解が進むと思いますし.)
2. OpenCV の歴史と,使用用途の変遷
OpenCV は,まずリリース前に「アルファ版」が2000年 (CVPR2000) にお披露目され,ベータ版を経たのち,2006年にversion 1.0がにリリースされて,その当初は米国「インテル社」が開発していました.その後「2009年」に,ロボットベンチャーのWillow Garage (wikipedia)にOpenCVの保守が移管され,その後 Itseez社に移管されました
更に,そのItseez社を「インテル社」が買収したことにより,以降は(再び)インテルがOpenCVを主に保守・開発する状況に戻っています.
2.1 初期はロボットビジョン向けに開発
Willow Garage社が2009年以降はロボットビジョン目線で保守していたという事情もあり,Willow Garage社が同時期に開発していた ROS (Robot Operating System) の,PerceptionモジュールにもOpenCVが標準的に組み込まれています.従って,その当時は自律移動ロボットやロボットアーム向けに必要な機能が優先的に実装されていました.ただ,徐々にOpenCVのコミュニティがロボットビジョン以外にも大きく広がり,ユーザーの多様性も拡大していき,それに伴って,ロボットビジョンに限らずコンピュータビジョン・画像認識全般の用途のモジュール(機能)も,OpenCVに多く追加さるようになっていきました.
2.2 C言語APIの廃止と,完全C++化
OpenCVの開発は,C言語で当初スタートした.その構造体・関数群であるC++ラッパーが登場したのちに,c言語はレガシーAPIとみなされていき,C++がOpenCVのメイン開発言語となった.近年の若手の研究開発社のみなさんの中には,そもそもOpenCVはほとんど触ったことがなく,深層学習ライブラリでしかコンピュータビジョンの研究開発を行なったことがない人も多いであろう.しかし,私のようにC++のみでの開発にOpenCVが移行する前からOpenCVに触っていた世代の人間は,OpenCVの 旧C言語APIにも 触れて(苦労して)いたわけである.
2.3 深層学習登場以降
OpenCVは開発者はもとより,研究者の間でも標準的に使用されるライブラリであった.ところが,2010年台序盤にディープラーニングの流行が始まって以降は,みんな深層学習の研究開発に移行したため,機械学習・画像認識向けには研究者にOpenCVが使用される機会が減っていった.
また,スマホアプリ向けの用途などでも,Appleが独自のケータイ向けのライブラリを開発し,そこには顔認識なども用意されていたりするなどなって,自分でアルゴリズムを組むプロ以外は,OpenCVの活用の場が減っていった(画像認識全体がコモディティ化していったと言えば良いだけであるかもしれない).
2010年前後での「Compute Visionアプリケーションなら,頻繁にOpenCVが使われていた」という使用状況と比べると,近年のコンピュータビジョンは深層学習が主役になってきたこともあいまって,OpenCVの使用場所は限定的になっている.もちろん深層学習も要らず,OpenCV に搭載されている機能で済む応用のニーズがある応用や計算機では,現在でも積極的に使用されているはずではある.(あくまで憶測であり,実際の使用度合いまでは調べられないのでわからない).
一方で,OpenCV2系くらいの時代の「業界のライブラリでOpenCVが主役だった頃」と比べると,近年はロボットの商用化が,工場以外の用途でも増えてきている(店内配達ロボットなど).この中で,ROSの需要増加が起きているので,これまではアカデミック向けだった印象のある「ROS + OpenCV のロボットビジョン向けの開発」ニーズが,以前より少し上昇傾向にあると言えるかもしれない.
3 OpenCVの収録内容 ≒ モジュール群
OpenCVでは,モジュールと呼ぶC++の名前空間に,近い機能のクラス・関数・構造体をまとめれるかたちで,開発および,我々ユーザーが(使いたいmoduleだけを)ロードします.
この各モジュール(CoreやImgProc)の名前および内容が,実質的にOpenCVに収録されている内容(手法やデータ構造)に相当しています.よって,この3節ではOpenCVモジュール群を一覧化+各モジュールの子記事をリスト化することで,
3.1 OpenCV (4.x系)のモジュール一覧
公式ドキュメントの以下のページ,モジュールの一覧があります:
公式ドキュメント(OpenCV4系):https://docs.opencv.org/4.x/index.html
このページのモジュール一覧(※ $.12)を参考に.OpenCV4系でのMainモジュール群を以下に一覧化します(Extraモジュールについては,上記のドキュメントなどを参照):
Main モジュール の一覧
※ [2025/7以降] これらの各モジュールの概要記事を,順に執筆・公開していっています.
- core モジュール :OpenCVのコア機能
- imgproc モジュール :古典的な画像処理(Image Processing),画像への描画.
- imgcodecs モジュール:画像のI/O
- videoio モジュール: 動画の I/O
- highgui モジュール. High-level GUI
- videoモジュール:ビデオ解析(古典的な背景差分と物体追跡)
- calib3dモジュール:カメラキャリブレーションと3次元復元
- features2d モジュール:2次元画像特徴.
- objdetectモジュール:
- dnn モジュール.:Deep Neural Network (GPUやFPGAの指定も可能)
- mlモジュール: non-deep learningな 機械学習 (SVM, Boostring, Random Forestsなど)
- flann モジュール:FLANNライブラリを用いた,階層的クラタリングと近似近傍探索(ANN).
- photo モジュール:コンピュテーショナルフォトグラフィ.
- stitchingモジュール :画像スティッチング .
- gapiモジュール :グラフAPI.
4. 開発プログラミング言語 と OpenCV バインディング
OpenCVには,元のC++以外のプログラミング言語のインターフェース(Python, Java, Matlab, Octave, Javascript (OpenCV.js) など)が「バインディング」とよばれる,「別言語のラッパー関数の自動生成機能」を用いて提供されている.
OpenCV-Pythonバインディングの記事にまとめているが,C++版関数からの自動生成であるがゆえに,元のC++とPythonの関数インターフェースが同じになるので,C++版を知っている人だと,Python版やJava版も快適に使えるというメリットを持つ(4.1.2節).また,有志により非公式に開発されている,他の言語向けラッパーも存在する(OpenCVSharpなど).
4.1 . 各言語版の特徴
4.1.1. 元C++版の特徴 : クラスだけど,関数群的なライブラリ
OpenCVは当初C言語からスタートして,そのラッパーとしてC++メインに移行した経緯があり,初期の関数の多くが「C関数のインターフェースを継承したままC++のクラスに移行」したので,関数群的なライブラリである特徴をOpenCVは有する.
一方で,それ以降に追加されたモジュールや,Google Summer of Codeなどで新規追加されていった各モジュールでは,各機能が初めからクラス化された「オブジェクト指向設計」で設計されています.例えば ,OpenCVのC言語時代の関数群をまとめたものである「 cv::KalmanFilter」 は,元のC言語APIの関連関数群と構造体を,のちにC++のクラスにラッパーしてまとめたものですが,v4.5.1で追加された 「cv::detail::tracking::kalman_filters::UnscentedKalmanFilter 」クラスは,(ラッパーするC言語の関数はないので)最初からC++のクラスオブジェクトとして設計されています.
当初はC++同様にOpenCVのメイン言語であった「OpenCV の C言語インターフェース」は,OpenCV3.x系からは「レガシー扱い」となり,それ以降は保守されていません.そして,OpenCV4系 (2018年11月リリース)では,完全にC++のみの開発に移行したため,C言語インターフェースは廃止されました.
4.1.2 OpenCV-Python バインディングの特徴・意義・メリット
以下の子記事に,内容を移動しましたので,詳しくは,そちらを参照してください.:
References
関連書籍
- Learning OpenCV 4 Computer Vision with Python 3: Get to grips with tools, techniques, and algorithms for computer vision and machine learning, 3rd Edition Joseph Howse, Joe Minichino, Packet Publishing, 2020.