Python & OpenCVで物体認識(動画編)

久しぶりの投稿。大学の自由課題で作ったPythonOpenCVを使った物体認識のサンプル(処理速度すごく遅い)。
環境は macOS High Sierra, Python3.6.1, OpenCV 3.3.0

簡単な解説

OpenCVにはカスケード識別器なるものが用意されていて、人とかの検知が比較的楽にできるそうな。
詳しいことは、↓
qiita.com

(haarcascade_upperbody.xmlOpenCVに一緒に同梱されているので、上手く見つけて、ソースコードと動画が入ったディレクトリに一緒に入れておいて)

サンプルコード
#coding: utf-8
import cv2
import numpy as np
body_cascade = cv2.CascadeClassifier("haarcascade_upperbody.xml")   # 上半身を検知
src = cv2.VideoCapture("TopGun.mp4")    # 動画を読み込み
while (src.isOpened()):
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break   # qを押したら終了
    ret,frame = src.read()  # ファイルの読み込み & フレームを取得
    g_frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)    # グレーにする
    FindPerson = body_cascade.detectMultiScale(g_frame) # 物体認識を実行
    for (x, y, w, h) in FindPerson: # 検出した人を四角で囲む
        # 四角で囲う
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 左から 画像, 左上の座標,右下の座標, 色, 太さ
        text = "Person"     # 一緒に表示する文字を設定
        font = cv2.FONT_HERSHEY_SIMPLEX # フォントを設定
        cv2.putText(frame,text,(x,y-10),font,1,(255,255,255),thickness=2) # カラー動画に埋め込み
    cv2.imshow("Window",frame) # 表示
src.release()
cv2.destroyAllWindows()

で、これを3倍位の速度で再生すると、こんな感じ↓

取り敢えず、今回はココまで....

(numpy 使ってなくね)

Numpy 使ったバージョン↓

#coding: utf-8
import cv2
import numpy as np
body_cascade = cv2.CascadeClassifier("haarcascade_upperbody.xml")   # 上半身を検知
src = cv2.VideoCapture("TopGun.mp4")    # 動画を読み込み
Edge = np.zeros(4, dtype=int)
while (src.isOpened()):
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break   # qを押したら終了
    ret,frame = src.read()  # ファイルの読み込み & フレームを取得
    FindPerson = body_cascade.detectMultiScale(frame) # 物体認識を実行
    for (Edge[0], Edge[1], Edge[2], Edge[3]) in FindPerson: # 検出した人を四角で囲む
        # 四角で囲う
        cv2.rectangle(frame, (Edge[0], Edge[1]), (Edge[0] + Edge[2], Edge[1] + Edge[3]), (255, 0, 0), 2) # 左から 画像, 左上の座標,右下の座標, 色, 太さ
        text = "Person"     # 一緒に表示する文字を設定
        font = cv2.FONT_HERSHEY_SIMPLEX # フォントを設定
        cv2.putText(frame,text,(Edge[0],Edge[1]),font,1,(255,255,255),thickness=2) # 動画に埋め込み
    cv2.imshow("Window",frame) # 表示
src.release()
cv2.destroyAllWindows()