カメラで上体、顔、目を検知する | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

タイトルまでは良かったのですが

実際やってみて全然関係ないところを目だと認識したり

結果はイマイチでしたが、以下にそのコードを記します

コード

# -*- coding: UTF-8 -*-
import cv2
import os
from os.path import join as join
 
C_Path = 'C:/Users/nakano/Anaconda3/Library/etc/haarcascades'
#顔検知
f_cascade = cv2.CascadeClassifier(join(C_Path, 'haarcascade_frontalface_alt.xml'))
#目検知
e_cascade = cv2.CascadeClassifier(join(C_Path, 'haarcascade_eye.xml'))
# 上体検知 
b_cascade = cv2.CascadeClassifier(join(C_Path, 'haarcascade_upperbody.xml'))
# カメラ起動
cap = cv2.VideoCapture(0)
 
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))
    #物体検知(上体検知)実行
    bodyrect = b_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)
    #検出した上体を囲む矩形作成(赤)
    for rect in bodyrect:
        cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (0, 0, 255q), thickness=2)
       
        text = 'body'
        font = cv2.FONT_HERSHEY_PLAIN
        cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (0, 0, 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()