카테고리 없음

[Python] FaceMeshDetector를 이용한 눈 감김 탐지

갈룩시노테7 2024. 10. 27. 23:07
반응형

- 본 내용은 python 3.10 버전을 이용하여 진행하였습니다.

 

눈 위치 탐지를 위해 FaceMeshDetector 클래스를 불러옵니다.

import cv2
from cvzone.FaceMeshModule import FaceMeshDetector as fmd # FaceMeshDetector 클래스 불러오기

 

웹캠 기본 기능 및 FaceMeshDetector 객체를 생성합니다.

cap = cv2.VideoCapture(0)
detector = fmd(maxFaces=1, minDetectionCon=0.75) # FaceMeshDetector 객체 생성

while cap.isOpened : # 카메라가 연결되었을 경우
    ret, img = cap.read() # 카메라로부터 이미지를 읽어옴
    if ret :

 

얼굴을 인식한 뒤, 얼굴의 왼쪽 눈의 랜드마크를 통하여 위 아래 수직 거리와 수평 거리의 값을 구합니다.

이후 이 값을 나눠 자신의 눈이 얼마나 감겼는지 비율을 판단합니다.

랜드마크의 자세한 값 여기서 확인할 수 있습니다.

 

얼굴 특징 감지 가이드  |  Google AI Edge  |  Google AI for Developers

LiteRT 소개: 온디바이스 AI를 위한 Google의 고성능 런타임(이전 명칭: TensorFlow Lite)입니다. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 얼굴 특징 감지 가이드 컬렉션을 사용

ai.google.dev

 

        img,face = detector.findFaceMesh(img, draw = True) # 얼굴을 찾는 함수 실행
        if face: # 얼굴이 인식되었을 경우

            img = cv2.flip(img, 1) # 영상 반전시키기

            leftEyeVDis, info = detector.findDistance(face[0][23], face[0][27]) # 왼쪽 눈의 수직 거리 구하기
            leftEyeHDis, info = detector.findDistance(face[0][130], face[0][243]) # 왼쪽 눈의 수평 거리 구하기
            ratio = leftEyeVDis/leftEyeHDis # 수직 거리를 수평 거리로 나누기
            print(ratio) # 왼쪽 눈의 수직 거리 출력

 

만약 비율의 값이 0.6 이하일 경우 왼쪽 하단에 "Wake up!!!" 문구를 출력하도록 만들고,

Q를 누를 경우 종료되는 기능을 설정합니다.

            if ratio < 0.6:
                cv2.putText(img, text = "Wake up!!!", org = (10, 30), 
                fontFace=cv2.FONT_HERSHEY_SIMPLEX, 
                fontScale=1, 
                color=(0,0,255), 
                thickness = 2)

            cv2.imshow('view', img) # 이미지를 화면에 출력

    if cv2.waitKey(1) == ord('q') : # q를 누르면 종료
        break

 

ratio의 값을 조절하면서 자신의 눈 크기 맞도록 설정할 수 있습니다.

 

아래는 전체 코드입니다.

더보기
import cv2
from cvzone.FaceMeshModule import FaceMeshDetector as fmd # FaceMeshDetector 클래스 불러오기

cap = cv2.VideoCapture(0)
detector = fmd(maxFaces=1, minDetectionCon=0.75) # FaceMeshDetector 객체 생성

while cap.isOpened : # 카메라가 연결되었을 경우
    ret, img = cap.read() # 카메라로부터 이미지를 읽어옴
    if ret :

        img,face = detector.findFaceMesh(img, draw = True) # 얼굴을 찾는 함수 실행
        if face: # 얼굴이 인식되었을 경우

            img = cv2.flip(img, 1) # 영상 반전시키기

            leftEyeVDis, info = detector.findDistance(face[0][23], face[0][27]) # 왼쪽 눈의 수직 거리 구하기
            leftEyeHDis, info = detector.findDistance(face[0][130], face[0][243]) # 왼쪽 눈의 수평 거리 구하기
            ratio = leftEyeVDis/leftEyeHDis # 수직 거리를 수평 거리로 나누기
            print(ratio) # 왼쪽 눈의 수직 거리 출력
            
            if ratio < 0.6:
                cv2.putText(img, text = "Wake up!!!", org = (10, 30), 
                fontFace=cv2.FONT_HERSHEY_SIMPLEX, 
                fontScale=1, 
                color=(0,0,255), 
                thickness = 2)

            cv2.imshow('view', img) # 이미지를 화면에 출력

    if cv2.waitKey(1) == ord('q') : # q를 누르면 종료
        break

 

반응형