【Python】OpenCV(cv2)の使い方を解説

目次から探す

画像処理の応用

画像処理の応用では、特徴点検出とマッチング、顔検出と顔認識、動画処理などがあります。

これらの技術を使って、さらに高度な画像処理を行うことができます。

特徴点検出とマッチング

特徴点検出とは、画像の中から特徴的な点を見つけ出すことです。

特徴点マッチングは、異なる画像間で同じ物体やシーンの特徴点を対応付ける際にとても有用です。

これにより、画像間の類似度や物体の位置関係を求めることができます。

SIFT

SIFT(Scale-Invariant Feature Transform)は、スケール不変な特徴点検出アルゴリズムです。

以下のコードは、SIFTを使って特徴点を検出し、画像に描画する例です。


import cv2
# 画像の読み込み
img = cv2.imread('sample.jpg', cv2.IMREAD_GRAYSCALE)
# SIFTのインスタンス生成
sift = cv2.SIFT_create()
# 特徴点の検出
keypoints = sift.detect(img, None)
# 特徴点の描画
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)
# 画像の表示
cv2.imshow('SIFT', img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
色の変化が大きい箇所(柄の境目や輪郭)が特異点として多く検出されている

ORB

ORB(Oriented FAST and Rotated BRIEF)は、高速で回転不変な特徴点検出アルゴリズムです。

以下のコードは、ORBを使って特徴点を検出し、画像に描画する例です。


import cv2
# 画像の読み込み
img = cv2.imread('sample.jpg', cv2.IMREAD_GRAYSCALE)
# ORBのインスタンス生成
orb = cv2.ORB_create()
# 特徴点の検出
keypoints = orb.detect(img, None)
# 特徴点の描画
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)
# 画像の表示
cv2.imshow('ORB', img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
アルゴリズムによって検出する特異点のパターンが異なる

顔検出と顔認識

顔検出は、画像中に存在する顔を検出する技術です。

顔認識は、検出された顔が誰の顔であるかを特定する技術です。

今回はぱくたそさんのフリー画像を使って紹介しています。

Haar Cascade

Haar Cascadeは、顔検出のためのアルゴリズムです。

以下のコードは、Haar Cascadeを使って顔を検出し、画像に矩形を描画する例です。

コードの実行にはhaarcascade_frontalface_default.xmlが必要なので、OpenCVのリポジトリからダウンロード、Pythonソースファイルと同じフォルダに配置しておいてください。


import cv2
# 画像の読み込み
img = cv2.imread('sample.jpg')
# グレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 顔検出用のカスケード分類器を読み込む
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 顔の検出
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 検出された顔に矩形を描画
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 5)
# 画像の表示
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
顔の部分が検出されている(複数の顔認識も可能)

DNNモジュールを使用した顔認識

DNN(Deep Neural Network)モジュールを使用して、顔認識を行うことができます。

以下のコードは、DNNモジュールを使って顔認識を行い、認識された顔に名前を表示する例です。

コードの実行にはhaarcascade_frontalface_default.xml deploy.prototxt res10_300x300_ssd_iter_140000.caffemodelが必要です。
それぞれOpenCVのリポジトリからダウンロード、Pythonソースファイルと同じフォルダに配置しておいてください。


import cv2
# 画像の読み込み
img = cv2.imread('sample.jpg')
# 顔検出用のカスケード分類器を読み込む
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 顔認識用のモデルを読み込む
model = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10_300x300_ssd_iter_140000.caffemodel')
# 顔認識の処理
# 省略
# 認識された顔に名前を表示
# 省略
# 画像の表示
cv2.imshow('Face Recognition', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

動画処理

動画処理では、動画の読み込みと表示、動画の保存、動画のフレーム処理を行います。

動画の読み込みと表示

動画ファイルを読み込み、フレームごとに表示する方法は以下の通りです。


import cv2
# 動画ファイルの読み込み
cap = cv2.VideoCapture('sample.mp4')
# 動画のフレームごとの処理
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 画像の表示
    cv2.imshow('Video', frame)
    # キー入力待ち
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 終了処理
cap.release()
cv2.destroyAllWindows()

動画の保存

動画を保存する方法は以下の通りです。


import cv2
# 動画ファイルの読み込み
cap = cv2.VideoCapture('sample.mp4')
# 動画ファイルの保存設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 30.0, (640, 480))
# 動画のフレームごとの処理
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 画像の表示
    cv2.imshow('Video', frame)
    # 動画の保存
    out.write(frame)
    # キー入力待ち
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 終了処理
cap.release()
out.release()
cv2.destroyAllWindows()

動画のフレーム処理

動画のフレームごとに画像処理を行う方法は以下の通りです。


import cv2
# 動画ファイルの読み込み
cap = cv2.VideoCapture('sample.mp4')
# 動画のフレームごとの処理
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 画像処理
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 画像の表示
    cv2.imshow('Video', gray)
    # キー入力待ち
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 終了処理
cap.release()
cv2.destroyAllWindows()

これらの応用技術を組み合わせることで、さまざまな画像処理や動画処理を行うことができます。

1 2 3

この記事のページ一覧
  1. 現在のページ
目次から探す