OpenCV

概要 
画像処理・画像解析および機械学習等の機能を持つC++、Java、Python、MATLAB用ライブラリAbout | opencv.org。様々なプラットフォームすなわち複数のオペレーティングシステム (OS) やCPUアーキテクチャに対応するクロスプラットフォームなライブラリであり、macOSやFreeBSD等全てのPOSIXに準拠したUnix系OS、Linux、Windows、Android、iOS等をサポートしているPlatforms - OpenCV。Androidへの移植は2010年に始まり、バージョン2.3で正式に利用可能となった。iOS対応の完全な統合は2012年にリリースされた2.4.2で利用可能となった。

当初からPowerPC系プロセッサなどにも対応していたものの、もともとインテルが開発していたこともあって、x86系プロセッサへの対応と最適化が主流だった。しかし、ARMアーキテクチャを採用したモバイルデバイスの台頭に伴い、ARM系プロセッサへの対応と最適化にも取り組まれているARM - OpenCV。

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

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

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

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

2024年1月現在、4.x系列の開発が続けられている。またOpenCV 5の開発について、2023年10月に資金調達のためのクラウドファンディングが立ち上げられたWhere Is OpenCV 5? A Call To Keep OpenCV Free To All - OpenCV。

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

 画像処理 (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モジュール）にビルドすることも可能であるが第4回　初めてのOpenCV開発 ― Visual Studio／CMake／NuGetでプロジェクト作成【OpenCV 3.0／3.1】：OpenCV入門【3.0対応】（1/3 ページ） - ＠IT、通常は必要なものだけ個別のモジュールとしてビルドする。

ビデオ入出力モジュールではWebカメラに代表されるUVCデバイスを扱うことができる。モジュールをビルドする際に、サポートするバックエンドとしてFFmpeg、、Video for Windows、DirectShow、Media Foundation、などを選択することができる第8回　初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 3.1.0】：OpenCV入門【3.0対応】 - ＠IT。

OpenCV 2.1OpenCV2.0 から OpenCV2.1 の変更点（ChangeLog） | OpenCV.jp でSSE拡張命令を使用した最適化コードが実装されている。OpenCV 2.4.3でIntel TBBやOpenMP、Appleの、Windowsの同時実行ランタイムなどを利用した並列化cv::parallel_forが実装されているChangeLog#version:2.4.3 · opencv/opencv Wiki | GitHub。OpenCV 3.0でIntel IPPのサブセットがIPPCVとして寄贈され、デフォルトで使用されるようになったOpenCV 3.0 - OpenCV。OpenCV 3.1ではクロスプラットフォームなSIMDアクセラレーションのためのUniversal Intrinsicsが導入されOpenCV: Universal intrinsics、従来からのSSE (x86) 命令のサポートに加え、AVX (x86) 命令やNEON (ARM) 命令のサポートも加わっている。OpenCV 3.3.1では（64ビットPowerPC）アーキテクチャへの最適化もVSX命令への対応によって実現されているChangeLog#version:3.3.1 · opencv/opencv Wiki · GitHub。

OpenCV 2.2OpenCV 2.2 Released - ROS robotics news でCUDAを使ったアクセラレータであるgpuモジュール、OpenCV 2.4.3OpenCV 2.4.3 released - OpenCVでOpenCLを使ったアクセラレータであるoclモジュールが追加された。gpuモジュールを有効にするためには、OpenCVをWITH_CUDA=ON構成でビルドする必要があるGPU Module Introduction — OpenCV 2.4.11.0 documentation。また、oclモジュールを有効にするためには、OpenCVをWITH_OPENCL=ON構成でビルドする必要があるOpenCL Module Introduction — OpenCV 2.4.11.0 documentation。なお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: OpenCV modulesOpenCL - OpenCV。OpenCV 3.0にはOpenCLの相互運用を可能とするラッパーAPIも用意されており、OpenCL-C言語でカスタムカーネルを記述できるほか、OpenCL 1.2サポートを有効にしてOpenCVをビルドすることで、OpenCL 1.2対応のプラットフォームおよびデバイス上でOpenCL 1.2の機能（カーネルの分割コンパイル＆リンクなど）を使えるようになるopencv/opencl_core.hpp at 3.0.0 · opencv/opencv | GitHub。また、オプションとしてOpenCL 2.0もしくはAMD (HSA) 拡張のShared Virtual Memoryもサポートしているopencv/ocl.cpp at 3.0.0 · opencv/opencv | GitHub。

 各種言語バインディング（ラッパー） 
公式に提供されている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 - OpenCV 2.4.10/3.4.4/4.5.1に対応。ライセンスはOpenCVに準ずる(3条項BSDライセンス[4.4以前]、Apacheライセンス[4.5以降]) 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に対応。

OpenCV 4.4では、Objective-CとSwift用のバインディングが公式に取り込まれたChangeLog#version:4.4.0 · opencv/opencv Wiki · GitHub。

 脚注 

 注釈 

 出典 

 関連項目 

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

 外部リンク 

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

Category:コンピュータビジョン
Category:オープンソースソフトウェア
Category:画像処理ソフト
Category:グラフィックライブラリ
Category:C++でプログラムされた自由ソフトウェア