OpenCVによる画像処理入門
OpenCVライブラリの基礎知識、Pythonによるカメラ画像の取得と表示の実装。
【学習内容の構成】
- OpenCV:コンピュータビジョンと機械学習のライブラリで、2500以上のアルゴリズムを提供
- 配列:画像データを表現する要素の並びで、次元と形による構造の理解
- カメラ操作:cv2.VideoCaptureによる画像取得とcv2.imshowによる表示
- RGB成分:画像のB、G、R各成分の個別表示と理解
- 前提:Pythonプログラミングの基礎知識、pipによるパッケージインストール
- 意義:コンピュータビジョン技術の実践的理解、画像処理アプリケーション開発の基盤
YouTube動画:https://youtu.be/0JOdLablP7Y
1. OpenCVとは
OpenCV(Open Source Computer Vision Library)は、コンピュータビジョン(画像認識や画像処理)と機械学習のためのオープンソースライブラリである。2500以上のアルゴリズムを提供し、幅広い画像処理・認識タスクに対応している。
1.1 OpenCVの主な機能
OpenCVが提供する主な機能は以下の通りである。
- 顔認識および物体認識
- 人間の動きの分類
- カメラの動きの追跡
- オブジェクトの動きの追跡
- 3次元モデルの抽出
- ステレオカメラからの3次元点群の生成
- イメージスティッチング(複数画像の結合)
- 類似画像の検索
- 赤目の除去
- 眼球運動の追跡
- AR(拡張現実)の機能
1.2 ライセンスと対応環境
OpenCVはApache 2 Licenseで提供されており、商用利用も含めて自由に使用できる。
対応プログラミング言語は以下の通りである。
- C++
- Python
- Java
- MATLAB
対応するオペレーティングシステムおよびプラットフォームは以下の通りである。
- Windows
- Linux
- Mac OS
- iOS
- Android
1.3 インストール方法
本教科書のプログラム例を実行するには、OpenCVとNumPyのインストールが必要である。インストールはPythonのパッケージ管理ツールpipを使用して行う。
pip install opencv-python
pip install numpy
1.4 学習リソース
OpenCVを学習するための主な公式リソースは以下の通りである。
- 公式チュートリアル: https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html
- 公式ドキュメント: https://docs.opencv.org
- 公式フォーラム: https://forum.opencv.org
- 無料のOpenCV Bootcamp: https://opencv.org/university/free-opencv-course/
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()
このプログラムの処理の流れは以下の通りである。
cv2.VideoCapture(0)でカメラオブジェクトvを生成する。引数の0はデフォルトカメラを指定する。v.read()でカメラからフレームを読み出す。戻り値は読み出しの成功を示すフラグretとフレームデータfである。- 読み出したフレーム
fは配列として格納される。 cv2.imshow()で画像をウィンドウに表示する。cv2.waitKey(0)でキー入力があるまで待機する。引数0は無制限に待機することを意味する。v.release()でカメラの使用を終了する。cv2.destroyAllWindows()で表示されているすべてのウィンドウを閉じる。
3. 配列
OpenCVで扱う画像データは配列として表現される。配列の概念を理解することは、画像処理において重要である。
3.1 配列の基礎
配列は要素の並びである。各要素には添字(インデックス)が付けられており、添字は0から始まる。
例えば、1次元配列[8 5 4 1 3]では、各要素の添字は以下のようになる。
- 添字0: 8
- 添字1: 5
- 添字2: 4
- 添字3: 1
- 添字4: 3
3.2 配列の次元
配列には次元という概念がある。Pythonでは、配列を以下のように表示する。
- 1次元配列:
[要素の並び] - 2次元配列:
[[要素の並び] ... [要素の並び]] - 3次元配列:
[[[要素の並び] ... [要素の並び]] ... [[要素の並び] ... [要素の並び]]]
画像データは通常、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次元配列である。
- 第1次元: 画像の高さ(行数)
- 第2次元: 画像の幅(列数)
- 第3次元: 色成分(B, G, R)
配列の添字を用いて、特定の色成分にアクセスできる。
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()
このプログラムの処理の流れは以下の通りである。
while v.isOpened()でカメラが開いている間、処理を繰り返す。- ループ内で
v.read()により各フレームを読み出す。 cv2.imshow()で読み出したフレームを表示する。cv2.waitKey(1)で1ミリ秒待機する。この待機時間により、適切なフレームレートで表示が更新される。- 'q'キーが押された場合、ループを抜けて処理を終了する。
ビデオ表示では、このようなループ処理が必要である。単一フレームの表示とは異なり、連続的にフレームを取得・表示することで、動画として認識される。
6. その他のコンピュータビジョンライブラリ
OpenCV以外にも、コンピュータビジョンに関連する多様なライブラリが存在する。用途に応じて、これらのライブラリを使い分けることが有効である。
6.1 コンピュータビジョンに関わるライブラリ類(補足)
- 顔検知・顔識別: InsightFace、DeepFace
- 物体認識: YOLO(YOLOv10、YOLOv11、YOLOv26)、Detectron2
- 文字認識: EasyOCR、PaddleOCR
これらのライブラリは、特定のタスクに特化した機能を提供しており、OpenCVと組み合わせて使用されることも多い。