茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

Python入門:OpenCVで顔検出

OpenCVで顔検出

仮想環境を構築する

pipでインストール

pip install opencv-python

画像から顔検出

from pathlib import Path
import cv2

# 検知器のパス
CASCADE_BASE_DIR = Path("./Lib/site-packages/cv2/data/")
cascade_files = [file for file in CASCADE_BASE_DIR.glob('*.xml')]
print(f'{"-"*50}\n 検知器一覧\n{"-"*50}')
[print(f'{i} : {file.name}') for i,file in enumerate(cascade_files)]
cascade_path =  cascade_files[5]
print('-' * 50)

# 顔画像のパス
img_path = "./images/ai_face_001.jpg"
src = cv2.imread(img_path, 1) # 0: gray, 1: color(default), -1: original

cascade = cv2.CascadeClassifier(str(cascade_path))
rect = cascade.detectMultiScale(src)
print(f'検出範囲:{rect}')

bgr = (0, 255, 0) # (B, G, R)
if len(rect) > 0:
    for x, y, w, h in rect:
        cv2.rectangle(src, (x,y), (x+w,y+h), bgr)

cv2.imshow('FaceDetect', src)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果

f:id:sireline:20210118151655p:plain

--------------------------------------------------
 検知器一覧
--------------------------------------------------
0 : haarcascade_eye.xml
1 : haarcascade_eye_tree_eyeglasses.xml
2 : haarcascade_frontalcatface.xml
3 : haarcascade_frontalcatface_extended.xml
4 : haarcascade_frontalface_alt.xml
5 : haarcascade_frontalface_alt2.xml
6 : haarcascade_frontalface_alt_tree.xml
7 : haarcascade_frontalface_default.xml
8 : haarcascade_fullbody.xml
9 : haarcascade_lefteye_2splits.xml
10 : haarcascade_licence_plate_rus_16stages.xml
11 : haarcascade_lowerbody.xml
12 : haarcascade_profileface.xml
13 : haarcascade_righteye_2splits.xml
14 : haarcascade_russian_plate_number.xml
15 : haarcascade_smile.xml
16 : haarcascade_upperbody.xml
--------------------------------------------------
検知器Path: Lib\site-packages\cv2\data\haarcascade_frontalface_alt2.xml
検出範囲:[[ 63  51 154 154]]

カメラから顔検出

from pathlib import Path
import cv2

# 検知器のパス
CASCADE_BASE_DIR = Path("./Lib/site-packages/cv2/data/")
cascade_files = [file for file in CASCADE_BASE_DIR.glob('*.xml')]
print(f'{"-"*50}\n 検知器一覧\n{"-"*50}')
[print(f'{i} : {file.name}') for i,file in enumerate(cascade_files)]
cascade_path =  cascade_files[7]
print('-' * 50)
print(f'検知器Path: {cascade_path}')

cascade = cv2.CascadeClassifier(str(cascade_path))
bgr = (0, 255, 0)

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    rect = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
    if len(rect) > 0:
        for x, y, w, h in rect:
            cv2.rectangle(frame, (x,y), (x+w,y+h), bgr)
    cv2.imshow('FaceDetect', frame)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()