Python & OpenCVで物体認識(動画編)
久しぶりの投稿。大学の自由課題で作ったPython と OpenCVを使った物体認識のサンプル(処理速度すごく遅い)。
環境は macOS High Sierra, Python3.6.1, OpenCV 3.3.0
簡単な解説
OpenCVにはカスケード識別器なるものが用意されていて、人とかの検知が比較的楽にできるそうな。
詳しいことは、↓
qiita.com
(haarcascade_upperbody.xml は OpenCVに一緒に同梱されているので、上手く見つけて、ソースコードと動画が入ったディレクトリに一緒に入れておいて)
サンプルコード
#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倍位の速度で再生すると、こんな感じ↓
OpenCVで動体認識楽しい ✌︎ ('ω' ✌︎ )三 ✌︎ ('ω') ✌︎ 三( ✌︎ ' ω') ✌︎
— Kawashima(クリスマス仕様) (@kawashima2201) 2017年12月11日
(動画はTopGun 発艦シーン,音が無いのはご愛嬌笑) pic.twitter.com/lgLXEUuLSi
取り敢えず、今回はココまで....
(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()