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がリリースされた後、メンテナンスされていない。
2018年11月にOpenCV 4.0がリリースされた。C++11規格準拠コンパイラが必須となり、またC APIは廃止された。Graph API (G-API) やQRコード検出機能などが追加された。OpenCLが使えないプラットフォーム向けに、Vulkanバックエンドの実験的サポートが追加された。
2023年5月現在、4.x系列の開発が続けられている。
機能.
実装分野は次の通り。
OpenCVの機能はいくつかのライブラリモジュールに分割して実装されている。モノリシックな1ファイル（worldモジュール）にビルドすることも可能であるが、通常は必要なものだけ個別のモジュールとしてビルドする。
ビデオ入出力モジュールではWebカメラに代表されるを扱うことができる。モジュールをビルドする際に、サポートするバックエンドとしてFFmpeg、、Video for Windows、DirectShow、Media Foundation、などを選択することができる。
OpenCV 2.1 でSSE拡張命令を使用した最適化コードが実装されている。OpenCV 3.0でIntel IPPのサブセットがIPPCVとして寄贈され、デフォルトで使用されるようになった。そのほか、Intel TBBやOpenMPを利用した並列化も実装されている。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をcodice_1構成でビルドする必要がある。また、oclモジュールを有効にするためには、OpenCVをcodice_2構成でビルドする必要がある。なお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バインディングが存在するが、そのほかにも非公式の各種言語向けのラッパーが存在する。