OpenCVによる画像処理入門

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

【学習内容の構成】

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

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

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

1. OpenCVとは

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

1.1 OpenCVの主な機能

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

1.2 ライセンスと対応環境

OpenCVはApache 2 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と組み合わせて使用されることも多い。