반응형
- 본 내용은 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 :
얼굴을 인식한 뒤, 얼굴의 왼쪽 눈의 랜드마크를 통하여 위 아래 수직 거리와 수평 거리의 값을 구합니다.
이후 이 값을 나눠 자신의 눈이 얼마나 감겼는지 비율을 판단합니다.
랜드마크의 자세한 값 여기서 확인할 수 있습니다.
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
반응형