mediapipe 얼굴 인식

Happy_JG·2023년 10월 24일
0

머신러닝

목록 보기
15/16

anaconda prompt

mediapipe

Mediapipe는 구글이 개발한 오픈 소스 프레임워크로, 컴퓨터 비전 및 머신 러닝을 활용하여 비디오 및 오디오 데이터에서 다양한 작업을 수행하는 데 사용됩니다. Mediapipe는 주로 실시간 비디오 및 오디오 처리, 손동작 감지, 얼굴 감지, 물체 추적, 자세 추정 등과 같은 다양한 응용 분야에서 활용된다.

conda create -n opencv python=3.8

activate opencv

pip install opencv-python scikit-learn numpy pandas jupyter matplotlib mediapipe

jupyter notebook


카메라를 키는 코드

import mediapipe as mp
import cv2

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()

얼굴에서 특징점을 찾을 수 있는 기능 불러오기

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()

찾은 특징점을 표현하기

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()

특징점 그리기 속성 추가

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

mp_drawing = mp.solutions.drawing_utils

drawing_spec = mp_drawing.DrawingSpec(thickness = 1, color = (0,0,255))

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()

얼굴에서 특징점 찾기 세부 설정

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

mp_drawing = mp.solutions.drawing_utils

drawing_spec = mp_drawing.DrawingSpec(thickness = 1, color = (0,0,255))

face_mesh = mp_face_mesh.FaceMesh(
    min_detection_confidence = 0.5,
    min_tracking_confidence = 0.5
)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()

카메라에서 불러온 사진에서 얼굴 특징점 찾기

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

mp_drawing = mp.solutions.drawing_utils

drawing_spec = mp_drawing.DrawingSpec(thickness = 1, color = (0,0,255))

face_mesh = mp_face_mesh.FaceMesh(
    min_detection_confidence = 0.5,
    min_tracking_confidence = 0.5
)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
        
    results = face_mesh.process(img) 

    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()

얼굴의 특징점(478개)을 감지했을 때 얼굴에 점찍기

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

mp_drawing = mp.solutions.drawing_utils

drawing_spec = mp_drawing.DrawingSpec(thickness = 1, color = (0,0,255))

face_mesh = mp_face_mesh.FaceMesh(
    min_detection_confidence = 0.5,
    min_tracking_confidence = 0.5
)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
        
    results = face_mesh.process(img)

    if results.multi_face_landmarks is not None:
        for res in results.multi_face_landmarks:
            mp_drawing.draw_landmarks(img, res, mp_face_mesh.FACEMESH_TESSELATION)

    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()


얼굴 특징을 나타내는 478개의 점 중 코에 점찍기

import mediapipe as mp
import cv2

mp_face_mesh = mp.solutions.face_mesh

mp_drawing = mp.solutions.drawing_utils

drawing_spec = mp_drawing.DrawingSpec(thickness = 1, color = (0,0,255))

face_mesh = mp_face_mesh.FaceMesh(
    min_detection_confidence = 0.5,
    min_tracking_confidence = 0.5
)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        break
        
    results = face_mesh.process(img)

    if results.multi_face_landmarks is not None:
        #print(results.multi_face_landmarks)
        #for res in results.multi_face_landmarks:
        #    mp_drawing.draw_landmarks(img, res, mp_face_mesh.FACEMESH_TESSELATION)
        
        face_landmarks = results.multi_face_landmarks[0]
        x = int(face_landmarks.landmark[8].x * img.shape[1])
        y = int(face_landmarks.landmark[8].y * img.shape[0])
        print(x,y)
        
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49:
        break

cap.release()
cv2.destroyAllWindows()


호랑이 필터

import mediapipe as mp
import cv2

# 얼굴에서 특징점을 찾을 수 있는 기능 불러오기
mp_face_mesh = mp.solutions.face_mesh
# 찾은 특징점 표현하기
mp_drawing = mp.solutions.drawing_utils
# 특징점 그리기 속성
drawing_spec = mp_drawing.DrawingSpec(thickness = 1, color = (0,0,255))
# 얼에서 특징점 찾기 속성
face_mesh = mp_face_mesh.FaceMesh(
    min_detection_confidence = 0.5, # 얼굴 검출 확률(자체 판단) 50% 이상인 것들만 출력하기
    min_tracking_confidence = 0.5 # 특징점 검출 확률(자체 판단) 50% 이상인 것들만 출력하기
)

tiger = cv2.imread('images/tiger.png')
tiger = cv2.resize(tiger,(200,200))
mask2gray = cv2.cvtColor(tiger , cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)
mask_b_inv = cv2.bitwise_not(mask_b)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret :
        break

    # 카메라에서 불러온 사진에서 얼굴 특징점 찾
    results = face_mesh.process(img)

    # 얼굴의 특징점을 감지했을 때 실행하겠다
    if results.multi_face_landmarks is not None :
        # print(results.multi_face_landmarks)
        # for res in results.multi_face_landmarks :
            # mp_drawing.draw_landmarks(img, res, mp_face_mesh.FACEMESH_TESSELATION)
        # 478개 점을 사용하기가 편함
        face_landmarks = results.multi_face_landmarks[0]
        # 코의 좌표 찾기
        x = int(face_landmarks.landmark[4].x * img.shape[1])
        y = int(face_landmarks.landmark[4].y * img.shape[0])
        # cv2.circle(img, (x,y), 20, (0,0,255), cv2.FILLED)
        # 이미지를 집어넣을 중심 좌표(코의 위치) > x,y
        # 마스크 이미지의 크기 > 123,132(tiger.shape)
        try : 
            sub_img = img[ y-100 : y+100 , x-100 : x+100 ]
            img_bg = cv2.bitwise_and(sub_img, sub_img, mask = mask_b)
            img_fg = cv2.bitwise_and(tiger,tiger, mask = mask_b_inv)
            bg_fg = cv2.add(img_bg,img_fg)
            img[ y-100 : y+100 , x-100 : x+100 ] = bg_fg
        except:
            pass
    cv2.imshow('video',img)
    if cv2.waitKey(33) == 49 :
        break
cap.release()
cv2.destroyAllWindows()

profile
hello!

0개의 댓글

관련 채용 정보