OpenCV入門

OpenCVライブラリの基礎知識,Pythonによるカメラ画像の取得と表示の実装。

【学習内容の構成】

  1. OpenCV:コンピュータビジョンと機械学習のライブラリで,2500以上のアルゴリズムを提供
  2. 配列:画像データを表現する要素の並びで,次元と形による構造の理解
  3. カメラ操作:cv2.VideoCaptureによる画像取得とcv2.imshowによる表示
  4. RGB成分:画像のB,G,R各成分の個別表示と理解

スライド資料:[PDF], [パワーポイント]

YouTube動画:https://youtu.be/0JOdLablP7Y

【サイト内の関連ページ】

OpenCV サンプル Python プログラム: 別ページで説明。

1. OpenCVとは

OpenCV(Open Source Computer Vision Library)は,コンピュータビジョン(画像認識や画像処理)と機械学習のためのオープンソースライブラリである。2500以上のアルゴリズムを提供し,画像処理および認識のタスクに対応する。

1.1 OpenCVの主な機能

OpenCVが提供する主な機能は以下の通りである。

1.2 ライセンスと対応環境

OpenCVはApache 2 License(バージョン4.5.0以降。それ以前は3-clause BSD License)で提供されており,商用利用を含めて使用できる。

対応プログラミング言語は以下の通りである。

対応するオペレーティングシステムおよびプラットフォームは以下の通りである。

1.3 インストール方法

本教科書のプログラム例を実行するには,OpenCVとNumPyのインストールが必要である。インストールはPythonのパッケージ管理ツールpipを使用して行う。

pip install opencv-python
pip install numpy

1.4 学習リソース

OpenCVを学習するための主な公式リソースは以下の通りである。

2. OpenCVのPythonプログラム例

ここでは,OpenCVを使用してカメラから画像を取得し,表示する基本的なプログラム例を示す。

2.1 カメラから1枚の画像を取得して表示するプログラム

import cv2

# カメラオブジェクトを生成
v = cv2.VideoCapture(0)

# フレームを読み出す
ret, f = v.read()

# 画像を表示
cv2.imshow("Camera", f)

# キー入力を待つ
cv2.waitKey(0)

# カメラの使用を終了
v.release()

# ウィンドウを閉じる
cv2.destroyAllWindows()

このプログラムの処理の流れは以下の通りである。

  1. cv2.VideoCapture(0)でカメラオブジェクトvを生成する。引数の0はデフォルトカメラを指定する。
  2. v.read()でカメラからフレームを読み出す。戻り値は読み出しの成功を示すフラグretとフレームデータfである。
  3. 読み出したフレームfは配列として格納される。
  4. cv2.imshow()で画像をウィンドウに表示する。
  5. cv2.waitKey(0)でキー入力があるまで待機する。引数0は無制限に待機することを意味する。
  6. v.release()でカメラの使用を終了する。
  7. cv2.destroyAllWindows()で表示されているすべてのウィンドウを閉じる。

3. 配列

OpenCVで扱う画像データは配列として表現される。配列の概念を理解することは,画像処理において重要である。

3.1 配列の基礎

配列は要素の並びである。各要素には添字(インデックス)が付けられており,添字は0から始まる。

例えば,1次元配列[8 5 4 1 3]では,各要素の添字は以下のようになる。

3.2 配列の次元

配列には次元という概念がある。Pythonでは,配列を以下のように表示する。

画像データは通常,2次元配列(グレースケール画像)または3次元配列(カラー画像)として表現される。

3.3 配列の形と次元の取得

Pythonでは,配列の内容,形,次元数を以下のように取得できる。

import cv2

v = cv2.VideoCapture(0)
ret, f = v.read()

# 配列の内容を表示
print(f)

# 配列の形を取得
print(f.shape)  # 例: (480, 640, 3)

# 配列の次元数を取得
print(f.ndim)   # 例: 3

v.release()

この例では,カメラから取得した画像fは3次元配列である。f.shape(480, 640, 3)のような形を返し,これは高さ480ピクセル,幅640ピクセル,3つの色成分を持つことを意味する。f.ndimは配列の次元数を返し,この場合は3となる。

4. 画像のB, G, Rの3成分

カラー画像は,B(青),G(緑),R(赤)の3つの色成分から構成される。OpenCVでは,画像データは3次元配列として表現され,各ピクセルの色情報はこれら3つの成分の組み合わせで表される。

4.1 画像データの構造

OpenCVで取得したカラー画像は,以下の構造を持つ3次元配列である。

配列の添字を用いて,特定の色成分にアクセスできる。

4.2 各色成分の表示

以下のプログラム例では,カメラから取得した画像全体と各色成分を個別に表示する。

import cv2

v = cv2.VideoCapture(0)
ret, f = v.read()

# 画像全体を表示
cv2.imshow("All", f)

# B成分を表示
cv2.imshow("B", f[:, :, 0])

# G成分を表示
cv2.imshow("G", f[:, :, 1])

# R成分を表示
cv2.imshow("R", f[:, :, 2])

cv2.waitKey(0)
v.release()
cv2.destroyAllWindows()

配列のスライス表記f[:, :, 0]f[:, :, 1]f[:, :, 2]は,それぞれB成分,G成分,R成分を取り出すことを意味する。ここで,:は「すべて」を意味し,f[:, :, 0]は「すべての行,すべての列における第3次元のインデックス0の要素」すなわちB成分を取得する。

5. OpenCVでカメラの表示

カメラからの映像を連続的に表示するには,フレームを繰り返し読み出して表示する処理が必要である。

5.1 ビデオ表示のプログラム例

以下のプログラムは,カメラからの映像をリアルタイムで表示する。

import cv2

v = cv2.VideoCapture(0)

# カメラが開いている間ループ
while v.isOpened():
    # フレームを読み出す
    ret, f = v.read()

    # フレームが正しく読み出せない場合は終了
    if not ret:
        break

    # 画像を表示
    cv2.imshow("Video", f)

    # 1ミリ秒待ち、'q'キーが押されたらループを抜ける
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

このプログラムの処理の流れは以下の通りである。

  1. while v.isOpened()でカメラが開いている間,処理を繰り返す。
  2. ループ内でv.read()により各フレームを読み出す。
  3. cv2.imshow()で読み出したフレームを表示する。
  4. cv2.waitKey(1)で1ミリ秒待機する。この待機時間により,フレームレートで表示が更新される。
  5. 'q'キーが押された場合,ループを抜けて処理を終了する。

ビデオ表示では,このようなループ処理が必要である。単一フレームの表示とは異なり,連続的にフレームを取得・表示することで,動画として認識される。

6. その他のコンピュータビジョンライブラリ

OpenCV以外にも,コンピュータビジョンに関連するライブラリが存在する。用途に応じて,これらのライブラリを使い分ける。

6.1 コンピュータビジョンに関わるライブラリ類(補足)

これらのライブラリは,特定のタスクに特化した機能を提供しており,OpenCVと組み合わせて使用されることもある。