개발

[개발] OpenCV 얼굴 모자이크

노트북 산 김에 공부 2023. 4. 25. 19:52

웹 캠에서 얼굴 영상을 받아오고, 출력 값으로 받아온 얼굴 이미지만 모자이크 처리해서 

모자이크 된 영상을 출력하는 프로그램을 작성하겠습니다.


import cv2 as cv
import sys

사람 얼굴을 검출하는 객체를 생성하기 위해 cv2 라이브러리를 불러오고, 예외처리를 위해 sys를 임포트 합니다.

face_cascade = cv.CascadeClassifier(cv.data.haarcascades +
                                     'haarcascade_frontalface_default.xml')

 OpenCV는 얼굴 검출을 위한 캐스케이드 분류기가 있습니다. 

캐스케이드는 유사 하르(haar-like) 특징을 사용하여 얼굴을 검출합니다. 

유사 하르란 간단히말해서. 하얀 영역 화소값에서 검정 영역 화소값을 빼면 사람의 얼굴 특징값을 얻을 수 있습니다. 

 

유사 하르

객체를 생성할 때 인자 값으로

cv.data.haarcascades + 'haarcascade_frontalface_default.xml' 을 줌으로써 미리 얼굴 이미지가 학습된 모델을 사용할 수 있습니다. 

cap = cv.VideoCapture(0, cv.CAP_DSHOW)

while True:
    ret, frame = cap.read()
    if not ret:
        break
        
    # 이미지 공간 축소
    frame = cv.resize(frame, dsize=(0,0), fx=1.0, fy=1.0, interpolation=cv.INTER_LINEAR)
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    
    # 특정 객체 검출
    faces = face_cascade.detectMultiScale(gray, 1.2)
        
    # 모자이크\
    for (x,y,w,h) in faces:
        #모자이크 처리할 위치만 따로 저장
        face_img = frame[y:y+h, x:x+w]

        # 해당 부분만 이미지 축소: 축소 비율 변경하여 모자이크 강도 변경 가능
        face_img = cv.resize(face_img, dsize=(0,0), fx=0.05, fy=0.5)

        # 해당 부분만 TIER_AREA 방식으로 확대 : 보간법 알고리즘 -> 선명도가 떨어져 뿌옇게 보임
        face_img = cv.resize(face_img, (w,h), interpolation=cv.INTER_AREA)

        # 원본 이미지에 모자이크 처리한 이미지를 워래 위치에 대체
        frame[y:y+h, x:x+w] = face_img
        
        cv.imshow('face', frame) # 출력
        
    
    key = cv.waitKey(1)
    if key==ord('q'): # q를 입력하면 종료
        break

cap.release()    # 안정적으로 종료
cv.destroyAllWindows()