OpenCV

OpenCV（オープンシーヴィ、英: Open Source Computer Vision Library）とはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリ。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、Video4Linux（英語版）、Video for Windows、DirectShow、Media Foundation、OpenNI（英語版）などを選択することができる。 OpenCV 2.1 でSSE拡張命令を使用した最適化コードが実装されている。OpenCV 2.4.3でIntel TBBやOpenMP、AppleのGCD（英語版）、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ではPPC64（英語版）（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 - 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に対応。 OpenCV 4.4では、Objective-CとSwift用のバインディングが公式に取り込まれた。 [脚注の使い方] ^ C++の最初の国際標準規格「ISO/IEC 14882:1998」通称C++98が制定されたのは1998年のことであり、2000年代初頭はまだ規格に完全準拠した処理系が少なく、移植性の高いコードをC++で記述するのは困難だった。また、ロボティクスのような組み込み環境向けのソフトウェア開発ではCを使うことはできるものの、C++は使えないことも多かった。 ^ a b c Releases | opencv.org ^ GitHub - opencv/opencv: Open Source Computer Vision Library ^ License - OpenCV ^ 橋本直「特集 拡張現実感 (AR) 基礎3: 開発用ツール」『情報処理』第51巻第4号、情報処理学会、2010年4月、382ページ。  ^ “第1回　OpenCVとは？ 最新3.0の新機能概要とモジュール構成：OpenCV入門【3.0対応】（1/2 ページ）”. ＠IT. 2023年5月3日閲覧。 ^ Intel Acquires Computer Vision for IOT, Automotive | Intel Newsroom ^ Intel acquires Itseez | opencv.org ^ About | opencv.org ^ a b c Platforms - OpenCV ^ ARM - OpenCV ^ SourceForge.net: Open Computer Vision Library, Internet Archive ^ ChangeLog_v10-v21#1.0 · opencv/opencv Wiki · GitHub ^ Introduction to Java Development — OpenCV 2.4.13.0 documentation ^ OpenCV - Browse /opencv-win at SourceForge.net ^ Tags · opencv/opencv | GitHub ^ Releases · opencv/opencv | GitHub ^ OpenCV 3.0 Latest news and the Roadmap, Kirill Kornyakov, Itseez, ICVS 2013 ^ OpenCV 3.1 - OpenCV ^ ChangeLog#version:3.4.20 · opencv/opencv Wiki · GitHub ^ ChangeLog#version:4.0.0 · opencv/opencv Wiki · GitHub ^ Where Is OpenCV 5? A Call To Keep OpenCV Free To All - OpenCV ^ 第4回　初めてのOpenCV開発 ― Visual Studio／CMake／NuGetでプロジェクト作成【OpenCV 3.0／3.1】：OpenCV入門【3.0対応】（1/3 ページ） - ＠IT ^ “OpenCV: Video I/O with OpenCV Overview”. docs.opencv.org. 2021年1月7日閲覧。 ^ 第8回　初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 3.1.0】：OpenCV入門【3.0対応】 - ＠IT ^ OpenCV2.0 から OpenCV2.1 の変更点（ChangeLog） | OpenCV.jp ^ ChangeLog#version:2.4.3 · opencv/opencv Wiki | GitHub ^ OpenCV 3.0 - OpenCV ^ OpenCV: Universal intrinsics ^ ChangeLog#version:3.3.1 · opencv/opencv Wiki · GitHub ^ OpenCV 2.2 Released - ROS robotics news ^ OpenCV 2.4.3 released - OpenCV ^ GPU Module Introduction — OpenCV 2.4.11.0 documentation ^ OpenCL Module Introduction — OpenCV 2.4.11.0 documentation ^ OpenCV: OpenCV modules ^ OpenCL - OpenCV ^ opencv/opencl_core.hpp at 3.0.0 · opencv/opencv | GitHub ^ opencv/ocl.cpp at 3.0.0 · opencv/opencv | GitHub ^ 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[リンク切れ] - コードの例がある。（英語）