OpenCVとは?

概要

OpenCV(Open Source Computer Vision Library)は、オープンソースのコンピュータビジョンと機械学習のライブラリです。1999年にインテルによって開発が始まり、現在では全世界の研究者や開発者からの貢献を受けて進化を続けています。ゼロから構築すると膨大な時間と技術が必要となる機能をパッキングされたライブラリで、プログラムに詳しくない方でも気軽に画像処理を実装する事ができるライブラリです。

主な特徴

OpenCVは、C++、Python、Javaなどの言語に対応しており、Windows、Linux、Mac OS、iOS、Androidなどの多くのプラットフォームで利用することができます。そのため、デスクトップアプリケーションからモバイルアプリケーション、組み込みシステムまで、様々な環境でのデバイス制御・画像処理・機械学習等の実装を可能にしています。導入も非常に簡単で、プログラミングが詳しくない方でも利用しやすくなっています。

OpenCVの主要な機能

画像処理

OpenCVは、画像データを数学的に扱い、様々な画像処理を行うことができます。これには画像認識の精度向上のための情報削減(閾値による2値化/モノクロ化/トリミング等)や目標となる情報の強調(エッジ協調/シャープフィルタ/輪郭検出/ヒストグラム処理)、PCへの処理負荷の最適化などが含まれます。また、OpenCVは、画像のピクセルデータを効率的に操作するためにNumPyというライブラリと密接に連携しています。NumPyは、Pythonで大量の数値データを効率的に扱うためのライブラリで、多次元配列の操作や数学的な計算を高速に行うことができます。OpenCVの画像データはNumPyの配列として表現され、これにより画像の各ピクセルに対する操作を簡単かつ高速に行うことができます。

OpenCVのthreshold関数を使った画像の閾値処理
OpenCVのfindContours関数を使った画像の輪郭検出

カメラデバイスの制御

カメラ

OpenCVの機能の一部としてUVC (USB Video Class)に準じたカメラの制御や映像の取得を行う機能があります。OpenCVのVideoCaptureクラスを使用することで、簡単にUVCカメラ(USBカメラや内蔵カメラ)から映像を取得することができます。カメラからの映像は静止画として取得され、これらのフレームはOpenCVのさまざまな関数を使用して処理することができます。また、VideoCaptureクラスはカメラのプロパティ(フレームレート、解像度、明るさ、コントラストなど)を取得または設定するメソッドも提供しています。これにより、アプリケーションの要件に応じてカメラの動作を簡単に制御することができます。下記の具体例ではデバイス制御の基本となることを説明しています。

ライブ表示とフレームレートの制御
プロパティ設定におけるゲイン・露光時間の調整方法

静止画保存、動画保存

動画保存

OpenCVの機能の一部として、静止画保存や動画保存をすることができます。静止画保存については様々な画像形式(JPEG,PNG,BMP)をサポートしており、簡単に画像を保存することができます。また、JPEGの品質やPNGの圧縮レベルなど、画像保存に関するパラメータも調整することができます。 動画の保存については、cv2.VideoWriterクラスを利用します。このクラスを用いることで、保存するファイル名、コーデック(FourCCコード)、フレームレート、フレームサイズを指定し、動画ファイルを生成することが可能となります。これにより、カメラから送信される画像をリアルタイムで動画ファイルとして保存することができます。さらに、100fpsを超える高速カメラの映像も任意のフレームレートに設定可能なため、スローモーション動画として保存することも可能です。

動画を保存する際のビデオコーデックの選択方法
動画保存時の画像エフェクト追加方法

特徴検出と記述子抽出

特徴検出

OpenCVの機能の中に、特徴検出や記述子抽出という重要な機能が含まれています。特徴検出とは、画像から特定のパターンや形状などの「特徴」を検出する技術のことを指します。例えば、ある物体を認識したいとき、その物体がどのような形状をしているのか、どのような形状をしているのか、どのような色をしているのかなど、物体の「特徴」を把握することが重要です。これらの特徴を正確に把握することで、物体を他の物体と区別し、認識することが可能になります。特徴検出は、物体認識だけでなく、画像マッチング(2つの画像間で同じ特徴を見つけ出すこと)、パノラマ(複数の画像をつなぎ合わせて1つの大きな画像を作ること)、3D再構築(2D画像から3Dモデルを作ること)など、多くの用途で使用されます。 一方、記述子抽出は、検出された特徴点の周囲の画像パターンを数値的に表現するプロセスです。これらの記述子は、特徴点を一意に識別するための「指紋」のようなもので、画像間の特徴点のマッチングに使用されます。特徴点間のマッチング(2つの画像間で同じ特徴点を見つけ出すこと)や、物体認識(特徴記述子を用いて特定の物体を認識すること)など、多くの用途で使用されます。

OpenCVのFeature2Dクラスを使った特徴点抽出とマッチング
OpenCVのORB_create関数を使ったORB特徴点の抽出とマッチング

物体検出:顔検出、人物検出など

物体検出

OpenCVでは画像や動画の中から特定の物体(人の顔や人の全体像)を検出(位置と大きさを特定)することができます。物体検出は、画像認識の一部として、またはその前処理として広く利用されています。OpenCVでは、カスケード分類器というアルゴリズムが提供されており、これを使うことで顔検出を行うことができます。このアルゴリズムは、学習データ(顔の画像と非顔の画像)を用いて、顔の特徴(眼、鼻、口など)を学習し、それを基に新しい画像から顔を検出します。 人物検出では、画像や動画の中から人の全体像を検出することができます。これは、監視カメラの映像分析や自動運転車の歩行者検出などに使われます。OpenCVでは、HOG(Histogram of Oriented Gradients)特徴とSVM(Support Vector Machine)ベースの分類器を用いた人物検出のアルゴリズムが提供されています。HOG特徴は、画像の局所的な勾配方向のヒストグラムを特徴量として用い、これにより人の形状を表現します。SVMは、これらの特徴を基に人物と非人物を分類します。 以上の物体検出は画像中の特定の物体を検出するための基本的な手法であり、より高度な物体検出や物体認識のタスクにも応用されます。

OpenCVのCascadeClassifierクラスを使った顔検出
OpenCVのHOGDescriptor

映像分析

オプティカルフロー

映像分析とは動画ファイルから有用な情報を抽出し、解析することを指しています。よくある動画の各フレームを個別に解析する画像分析と異なり、物体の動きの追跡や異常行動の検出など連続性のある事象を考慮に入れた解析が求められます。OpenCVは、リアルタイムの映像処理と分析をするためのアルゴリズムと豊富な機能を持つライブラリを提供しています。その中でもよく使用されるオプティカルフロー背景差分に関して下記で説明します。

オプティカルフロー オプティカルフロー(Optical Flow)とは、映像中の物体やカメラの動きによって生じる画像間の視覚的な動きのパターンを指しており、連続する2つのフレーム間でのピクセルの動きをベクトルとして表現したものです。オプティカルフローは、物体の動きや形状や3次元構造などを推定するために使用されます。例えば、自動運転車では、オプティカルフローを用いて周囲の環境の動きを把握し、障害物などの検出に使われています。OpenCVでは、オプティカルフローを計算するための関数が提供されており、これらの関数を使用することで、動画中の物体の動きを追跡したり、動きに基づいた分析を行ったりすることが可能です。

OpenCVのcalcOpticalFlowPyrLK関数を使った光流法による動き検出

背景差分 背景差分は、動画のフレーム間での変化を検出するためのアルゴリズムです。特に、静止している背景に対する動的な物体の動きを検出するのに有効です。OpenCVでは、背景モデル(例えば、平均フィルタリングやガウシアン混合モデル)を用いて背景を推定し、それと各フレームとの差分を計算することで、動きのある物体を検出します。背景差分は、監視カメラの映像分析(侵入者検出など)や車載カメラの映像分析(前方の車両や歩行者の検出など)に広く使用されます。

OpenCVのBackgroundSubtractorクラスを使った動画の背景差分


機械学習

機械学習

OpenCVの機械学習モジュールには、K-meansクラスタリングという強力なアルゴリズムも含まれています。K-meansは、教師なしの学習アルゴリズムの一種で、データを指定された数(k)のクラスタに分割します。これは、画像のセグメンテーションや色量子化、画像圧縮など、多くの画像処理タスクで使用されます。

例えば、ユーザーが多くの果物の写真を持っていて、「リンゴ」「バナナ」「オレンジ」の3つのグループに分けたいとします。それぞれの果物がどのグループに属するかを一つ一つ手作業で分けるのは手間がかかります。K-meansを使うと、それぞれの果物の写真がどのグループに属するかを自動的に分けてくれます。 K-meansは、まず「リンゴ」「バナナ」「オレンジ」の3つのグループそれぞれの重心を決めます。そして、それぞれの果物の写真がどのグループの重心に一番近いかを見て、そのグループに分けます。これを何度も繰り返すことで、最終的に果物の写真が適切なグループに分けられます。このように、K-meansはたくさんのデータを自動的にグループ分けするのにとても便利なツールです。これを使えば、大量のデータを手作業で一つ一つ分ける必要がなくなり、時間を大幅に節約することができます。

カメラキャリブレーション

カメラキャリブレーション

OpenCVのカメラキャリブレーション機能は、カメラのレンズ歪みや視野を正確に把握し、画像解析や3D再構成における精度を向上させるための重要なツールです。カメラはレンズの形状や配置により画像に歪みが生じます。この歪みは、画像の中心から離れるほど通常大きくなります。OpenCVのカメラキャリブレーション機能は、このような歪みを補正するために使用されます。 歪みを補正するためのキャリブレーション(校正)では、通常、チェスボードなどの既知のパターンを使用します。このパターンをカメラで撮影し、その画像を解析することで、カメラの内部パラメータ(焦点距離、光学中心など)と外部パラメータ(カメラの3次元空間における位置と向き)を推定します。

OpenCVのcalibrateCamera関数を使ったカメラキャリブレーション

3D再構成:ステレオビジョン、ストラクチャード・ライトなど

3D

OpenCVは、3D再構成という機能も提供しています。これは、2D画像から3Dの情報を取り出すためのアルゴリズムで、ステレオビジョンストラクチャード・ライトといった手法を用いて行われます。 ステレオビジョンは、人間の視覚システムが物体の距離や座標を推定するのと同じ原理に基づいています(2つの異なる視点からの画像を比較することで、物体の深度情報を推定します)。OpenCVは、ステレオの画像を取得し、それらを整列させ、最後に深度マップ(各ピクセルが物体までの距離を表す画像)を生成するためのツールを提供しています。 一方、ストラクチャード・ライトは、特定のパターンの光を物体に投影し、その反射をカメラで捉えることで3D情報を取得する手法です。光のパターンが物体の形状によって歪むことから、その歪みを解析することで物体の3D形状を再構成します。 これらの技術は、VRや3Dモデリングなど、さまざまなアプリケーションで利用されています。OpenCVは、これらの高度な3D再構成技術を、開発者が容易に利用できるように提供しています。

OpenCVのStitcherクラスを使った画像のパノラマ合成(スキャンモードとパノラマモードの比較を追加)

OpenCVを利用するメリット

OpenCVは、その高度な機能と柔軟性により、様々な画像処理や機械学習などをするためのツールです。OpenCVを利用することで下記のようなメリットがあります。

カスタマイズ性 OpenCVはオープンソースライブラリであり、無料で利用することができます。また、ソースコードが公開されているため、必要に応じてカスタマイズすることも可能です。
高性能 OpenCVはC++で書かれており、最適化が行われているため、高速に動作します。また、一部の関数は並列処理が可能であり、マルチコアプロセッサを活用してさらなる高速化を図ることができます。
クロスプラットフォーム OpenCVはWindows、Linux、macOSなど、様々なオペレーティングシステムで動作します。また、Python、Java、C++など、複数のプログラミング言語から利用することができます。
ドキュメントの豊富さ OpenCVは世界中で広く利用されており、大規模なユーザーコミュニティが存在します。そのため、問題が発生した際には、オンラインで情報を検索したり、質問したりすることで、解決策を見つけやすいです。

注意点

OpenCVはBSDライセンスに基づいており、商用/非商用を問わず無償で使用することが可能です。BSDライセンスは、著作権の表示と免責条項を明記しておけば、再利用も再配布も自由です。 著作権・免責事項の表示さえしっかりと行っていれば、BSDライセンスを利用し、改変し、再配布することもでき、 商用のプログラムに取り入れることも可能です。なお、公式のOpenCVライセンス文書はこちらを参照してください。
https://opencv.org/license/

注意が必要なのは下記のOpenCV-Pythonというモジュールで開発中のライブラリが含まれているので、一部商用利用できないことがあります。
https://github.com/opencv/opencv-python/blob/master/LICENSE.txt

例えば、特許で保護されているSURFというアルゴリズムが含まれている場合、特許出願がされているため商用利用ができません。OpenCV-Pythonの中には特許で保護されているアルゴリズムは含まれていないようですが、詳細についてはGithubにあるReadMeにあるFrequently Asked Questions(よくある質問)をご覧ください。
https://github.com/opencv/opencv-python#frequently-asked-questions

ただし、実施する国や地域によってアルゴリズムごとに商用利用の可否や特許の確認が必要となることがありますので各自で調べてからご利用ください。