OpenCV

OpenCV（オープンシーヴィ、）とはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリ。2009年にWillow Garage（ウィロー・ガレージ）に開発が移管され、さらにその後Itseezにメンテナンスが移管されたが、2016年5月にインテルがItseezを買収することが発表された。

概要 
画像処理・画像解析および機械学習等の機能を持つC++、Java、Python、MATLAB用ライブラリ。プラットフォームとしてmacOSやFreeBSD等全てのPOSIXに準拠したUnix系OS、Linux、Windows、Android、iOS等をサポートしている。Androidへの移植は2010年に始まり、バージョン2.3で正式に利用可能となった。iOS対応の完全な統合は2012年にリリースされた2.4.2で利用可能となった。

歴史 
1999年にプロジェクト開始。最初のアルファ版が公開されたのは、国際会議CVPR 2000 (IEEE Conference on Computer Vision and Pattern Recognition 2000) である。2001年から2005年の間に5つのベータ版がリリースされた。2006年の後半にバージョン1.0の正式版がリリースされた。クロスプラットフォームを意識した設計となっており、当初はC言語で書かれていた。このことが移植性を高めることにつながった。

2008年にWillow Garageによるサポートを受け、開発状況が再び活発になった。2009年10月に2回目のメジャーバージョンアップが実施され、2.0版がリリースされた。従来のC API（C言語関数形式のインターフェイス）に加えて、C++ APIが導入された。OpenCV 2.4.4以降ではJavaが公式にサポートされている。OpenCV 2.x系列は2018年2月に2.4.13.6がリリースされた後、メンテナンスされていない。

2015年6月に3回目のメジャーバージョンアップとしてOpenCV 3.0が正式リリースされた。OpenCV 3.0では従来のC APIはレガシーAPI扱いとなりメンテナンスが終了しているため、代わりにC++ APIを使うことが推奨されている。2015年12月にリリースされたOpenCV 3.1では、Google Summer of Code 2015の成果物の取り込みなど、多数の機能が追加されている。OpenCV 3.x系列は、2021年10月にリリースされた3.4.16の公式ビルド済みバイナリが提供されており、また2023年6月にバグ修正を含む3.4系列の最終版として3.4.20がリリースされた。

2018年11月にOpenCV 4.0がリリースされた。C++11規格準拠コンパイラが必須となり、またC APIは廃止された。Graph API (G-API) やQRコード検出機能などが追加された。DNNモジュールにおいて、OpenCLが使えないプラットフォーム向けに、Vulkanバックエンドの実験的サポートが追加された。

2023年9月現在、4.x系列の開発が続けられている。

機能 
実装分野は次の通り。

 画像処理 (Image Processing)
 勾配、エッジ、コーナー (Gradients, Edges and Corners)
 サンプリング、補間、幾何変換 (Sampling, Interpolation and Geometrical Transforms)
 演算 (Morphological Operations)
 フィルタと色変換 (Filters and Color Conversion)
 ピラミッドとその応用 (Pyramids and the Applications)
 画像分割、領域結合、輪郭検出 (Image Segmentation, Connected Components and Contour Retrieval)
 画像と形状のモーメント (Image and Contour Moments)
 特殊な画像変換 (Special Image Transforms)
 ヒストグラム (Histograms)
 マッチング (Matching) 
 ラベリング (Labeling) : OpenCV 3.0以降
 構造解析 (Structural Analysis)
 輪郭処理 (Contour Processing)
 計算幾何 (Computational Geometry)
 平面再分割 (Planar Subdivisions) 
 モーション解析と物体追跡 (Motion Analysis and Object Tracking)
 背景統計量の累積 (Accumulation of Background Statistics)
 モーションテンプレート (Motion Templates)
 物体追跡 (Object Tracking)
 オプティカルフロー (Optical Flow)
 推定器 (Estimators) 
 パターン認識 (Pattern Recognition)
 物体検出 (Object Detection) 
 カメラキャリブレーションと3次元再構成 (Camera Calibration and 3D Reconstruction)
 カメラキャリブレーション (Camera Calibration)
 姿勢推定 (Pose Estimation)
 エピポーラ幾何 (Epipolar Geometry)
機械学習
単純ベイズ分類器 (Naive Bayes Classifier)
k近傍法 (K Nearest Neighbors)
サポートベクターマシン (SVM)
決定木 (Decision Trees)
ブースティング (Boosting)
Random forest (Random forest)
EMアルゴリズム (Expectation-Maximization)
ニューラルネットワーク (Neural Networks)
ユーザインタフェース 
 シンプルGUI (Simple GUI)
 画像の読み込みと保存 (Loading and Saving Images)
 ビデオ入出力 (Video I/O)
 OpenGL/Direct3D相互運用

OpenCVの機能はいくつかのライブラリモジュールに分割して実装されている。モノリシックな1ファイル（worldモジュール）にビルドすることも可能であるが、通常は必要なものだけ個別のモジュールとしてビルドする。

ビデオ入出力モジュールではWebカメラに代表されるUVCデバイスを扱うことができる。モジュールをビルドする際に、サポートするバックエンドとしてFFmpeg、、Video for Windows、DirectShow、Media Foundation、などを選択することができる。

OpenCV 2.1 でSSE拡張命令を使用した最適化コードが実装されている。OpenCV 2.4.3でIntel TBBやOpenMP、Appleの、Windowsの同時実行ランタイムなどを利用した並列化cv::parallel_forが実装されている。OpenCV 3.0でIntel IPPのサブセットがIPPCVとして寄贈され、デフォルトで使用されるようになった。OpenCV 3.1ではクロスプラットフォームなSIMDアクセラレーションのためのUniversal Intrinsicsが導入され、従来からのSSE (x86) 命令のサポートに加え、AVX (x86) 命令やNEON (ARM) 命令のサポートも加わっている。

OpenCV 2.2 でCUDAを使ったアクセラレータであるgpuモジュール、OpenCV 2.4.3でOpenCLを使ったアクセラレータであるoclモジュールが追加された。gpuモジュールを有効にするためには、OpenCVをWITH_CUDA=ON構成でビルドする必要がある。また、oclモジュールを有効にするためには、OpenCVをWITH_OPENCL=ON構成でビルドする必要がある。なおOpenCV 2.4.11時点で、公式のWindows用ビルド済みバイナリではCUDAは有効にされていないが、OpenCLは有効にされている。またgpuモジュールおよびoclモジュールはともに、従来のCPUベースのOpenCV機能と比べて、対応するチャンネルフォーマットに関して制約がある。そのほか、gpuモジュールを使用するためには、CUDAに対応したNVIDIA製GPUを、そしてoclモジュールを使用するためには、OpenCL 1.1に対応したハードウェアを用意する必要がある。

なお、OpenCV 3.0ではgpuモジュールはcudaモジュールに改称され、また独立したoclモジュールは廃止されてOpenCVの各モジュールに透過API (Transparent API, T-API) として分散・融合されている。OpenCV 3.0にはOpenCLの相互運用を可能とするラッパーAPIも用意されており、OpenCL-C言語でカスタムカーネルを記述できるほか、OpenCL 1.2サポートを有効にしてOpenCVをビルドすることで、OpenCL 1.2対応のプラットフォームおよびデバイス上でOpenCL 1.2の機能（カーネルの分割コンパイル＆リンクなど）を使えるようになる。また、オプションとしてOpenCL 2.0もしくはAMD (HSA) 拡張のShared Virtual Memoryもサポートしている。

各種言語バインディング（ラッパー） 
公式に提供されているOpenCV APIとして、C/C++用インターフェイスのほか、Java、Python、MATLABバインディングが存在するが、そのほかにも非公式の各種言語向けのラッパーが存在する。
 Java用ラッパー
 JavaCV - OpenCV, FFmpeg, libdc1394, PGR FlyCapture, OpenKinect, videoInput, ARToolKitPlus のラッパー。バージョン1.0でOpenCV 3.0に対応。GPL v2ライセンスとApacheライセンスに対応。
 .NET用ラッパー
 SharperCV - 商用利用不可、開発終了。
 OpenCVDotNet - GPL v2ライセンス、OpenCV 1.0対応、2007年のバージョン0.7を最後に更新停止。
 Emgu CV - GPL v3ライセンスもしくは商用ライセンス、OpenCV 2.4.10/3.4.3/4.5.5に対応。Mono対応、Windowsストアアプリ対応。
 OpenCvSharp - 3条項BSDライセンス、OpenCV 2.4.10/3.4.4/4.5.1に対応。Mono対応、.NET Core対応、UWPアプリ対応。
 OpenCV.NET - BSDスタイルライセンス (MIT)、Mono対応。
 その他
ruby-opencv - Ruby 1.9.3/2.xおよびOpenCV 2.4.10に対応。BSDライセンス。
HSPCV - Hot Soup Processor 3.1以降およびOpenCV 1.0に対応。Hot Soup Processorに付属。BSDライセンス。
GoCV - Go 1.20.4およびOpenCV 4.7.0に対応。

関連項目 

 画像処理
 顔認識
 機械学習
 :en:Mathematical morphology
 アクセラレータ用バックエンド
 CUDA
 OpenCL

参照

外部リンク 

OpenCV リファレンスマニュアル（日本語訳）とサンプルプログラム集 (OpenCV 2.4まで)
OpenCV Wiki - Willow GarageによるOpenCV Wiki
OpenCV SourceForge
Introduction to programming with OpenCV - コードの例がある。

コンピュータビジョン
オープンソースソフトウェア
画像処理ソフト
グラフィックライブラリ