OpenCVで簡単リアルタイム物体検出

OpenCVを使った物体検出

こんにちは。

AI coordinatorの清水秀樹です。

映像からただ単に物体検出を試してみたいだけなら、すぐにでも試せる方法を紹介します。

SSD_kerasを使った物体検出は環境準備が大変であるのに対して、OpenCVインストール時に初めから準備されているカスケードファイルを使えば、すぐにでも物体検出が始められます。

手軽に始めてみたい方は、ぜひ当記事を参考にしてください。

 

テスト環境

macOS Sierra

Anaconda3-4.2.0-MacOSX-x86_64

opencv3 3.1.0

 

物体検出を試してみる

まず手始めに、胴体を検出できるカスケードファイル(haarcascades/haarcascade_fullbody.xml)を使用して試してみます。

成功するとこんな感じで動画が見れるはずです。

# -*- coding: UTF-8 -*-
#http://qiita.com/Algebra_nobu/items/a488fdf8c41277432ff3
import cv2
import os


#人の認識
f_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_fullbody.xml')


# カメラの起動
cap = cv2.VideoCapture('適当な動画のパスを指定してください')

while(True):

    # 動画ストリームからフレームを取得
    ret, frame = cap.read()
    
    #物体認識(人)の実行
    facerect = f_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(1, 1))
    
    #検出した人を囲む矩形の作成
    for rect in facerect:
        cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
        
        text = 'p'
        font = cv2.FONT_HERSHEY_PLAIN
        cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (255, 255, 255), 2, cv2.LINE_AA)
        
    # 表示
    cv2.imshow("Show FLAME Image", frame) 

    # qを押したら終了。
    k = cv2.waitKey(1)
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

四角枠の上に”p”を表示しています。

cv2.putText()メソッドを使用すると、画面上に表示できるようです。

この方法については「Raspberry Pi 深層学習でリアルタイム顔認識(Keras・Open CV)」の記事で紹介されていたものをそのまま活用しました。

 

続いて、人の顔(haarcascades/haarcascade_frontalface_alt.xml)と目(haarcascade_eye.xml)の物体検出を試してみました。

# -*- coding: UTF-8 -*-
#http://qiita.com/Algebra_nobu/items/a488fdf8c41277432ff3
import cv2
import os


#顔の認識
f_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_alt.xml')
#目の認識
e_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')


# カメラの起動
cap = cv2.VideoCapture('適当な動画を指定してください')

while(True):

    # 動画ストリームからフレームを取得
    ret, frame = cap.read()

    #物体認識(顔認識)の実行
    facerect = f_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
    #物体認識(目認識)の実行
    eyerect = e_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
    
    #検出した顔を囲む矩形の作成
    for rect in facerect:
        cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
        
        text = 'face'
        font = cv2.FONT_HERSHEY_PLAIN
        cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (255, 255, 255), 2, cv2.LINE_AA)
    
    #検出した目を囲む矩形の作成
    for rect in eyerect:
        cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (0, 255, 0), thickness=2)
        
        text = 'eye'
        font = cv2.FONT_HERSHEY_PLAIN
        cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (0, 255, 0), 2, cv2.LINE_AA)
        
    # 表示
    cv2.imshow("Show FLAME Image", frame) 

    # qを押したら終了。
    k = cv2.waitKey(1)
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

顔はそれなりに検出できるようですが、目はイマイチな感じですね。

精度を上げたければ、自分でカスケードファイルを作成するしかなそうです。

 

anacondaインストール後にOpenCVをインストールすれば、直ぐにでも映像からの物体検出ができますので、ぜひチャレンジしてみてください。

 

それではまた。

 

トップページへ

あなたにオススメの記事

コメント

  1. この記事へのコメントはありません。

PAGE TOP