공부를 함시다/Python

[Python] 얼굴 인식 후 배경 흐리게 처리하기

갈룩시노테7 2024. 10. 20. 22:17
반응형

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

 

이미지 검색과 블러 처리를 위해 먼저 두 라이브러리를 import 해줍니다.

import cv2

# 세그멘테이션 모듈 불러오기 (블러 처리용)
from cvzone.SelfiSegmentationModule import SelfiSegmentation as ssm

 

배경과 사람을 분리할 떄 필요한 새그맨테이션 객체와 얼굴을 감지할 기본적인 Haar Cascade 데이터를 로드해줍니다.

# 세그멘테이션 모듈 객체 생성
segmentor = ssm()

# 사전 훈련된 Haar Cascade 분류기 파일 로드
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

 

웹캠을 불러와 데이터 분석에 필요한 그레이스케일로 이미지를 변경합니다. 

먼저 detectMultiScale로 변환한 이미지에서 얼굴이 검출되는지 확인합니다.

 

얼굴값이 검출될 경우 원본 이미지 객체를 하나 더 생성하여 흐리게 처리하고,

그 위에 배경을 제거한 얼굴 이미지를 합칩니다.

while cap.isOpened :
    # 웹캠에서 프레임 읽기
    ret, img = cap.read()
    
    # 그레이스케일 이미지로 변환
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 얼굴 인식
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    
    if len(faces) :
        img_blur = cv2.GaussianBlur(img, (51, 51), 0)  # 원본 이미지 블러 처리
        img = segmentor.removeBG(img, imgBg=img_blur) # 블러 처리 실행

 

마지막으로 검출된 얼굴 주변에 파란색 사각형이 출력될 수 있도록 설정한 뒤

동영상 출력 및, Q키를 누르면 종료되는 기본적인 기능들을 추가합니다.

  # 얼굴 주변에 사각형 그리기
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

    # 결과 이미지 출력
    cv2.imshow('Face Detection', img)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 리소스 해제
cap.release()
cv2.destroyAllWindows()

 

 

아래는 전체 코드입니다.

더보기
import cv2

# 세그멘테이션 모듈 불러오기 (블러 처리용)
from cvzone.SelfiSegmentationModule import SelfiSegmentation as ssm

# 세그멘테이션 모듈 객체 생성
segmentor = ssm()

# 사전 훈련된 Haar Cascade 분류기 파일 로드
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 웹캠 캡처 객체 생성
cap = cv2.VideoCapture(0)

while cap.isOpened :
    # 웹캠에서 프레임 읽기
    ret, img = cap.read()
    
    # 그레이스케일 이미지로 변환
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 얼굴 인식
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    
    if len(faces) :
        img_blur = cv2.GaussianBlur(img, (51, 51), 0)  # 원본 이미지 블러 처리
        img = segmentor.removeBG(img, imgBg=img_blur) # 블러 처리 실행

    # 얼굴 주변에 사각형 그리기
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

    # 결과 이미지 출력
    cv2.imshow('Face Detection', img)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 리소스 해제
cap.release()
cv2.destroyAllWindows()
반응형