OpenCV

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

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

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

## 歴史
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バックエンドの実験的サポートが追加された。

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

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

* 画像処理 (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 3.3.1では（64ビットPowerPC）アーキテクチャへの最適化もVSX命令への対応によって実現されている。

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 - 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用のバインディングが公式に取り込まれた。

## 脚注

### 注釈

### 出典

## 関連項目

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

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