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()
実行結果
-------------------------------------------------- 検知器一覧 -------------------------------------------------- 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()