OpenCV 얼굴탐지 및 텍스트 출력

tpids·2024년 7월 11일

OpenCV

목록 보기
6/8

얼굴탐지(FaceDetection) 및 텍스트 출력

# 주피터 내에서 설치
# !pip install ~

# anaconda prompt 창 설치
# pip install ~ (최신버전)
# pip install 모듈명 == 버전 (원하는 버전 설치)

# 모듈 삭제
# pip uninstall 모듈명

# 설치된 모듈 확인
# pip list

# *설치가 진행이 완료되어도, 주피터 내에서 import 인식 안되는 경우
# 커널 restart
# 주피터 재실행
# vscode 일 경우 컴퓨터 재부팅
import cvlib as cv # 얼굴 탐지하는 기능(도구)
import cv2
import matplotlib.pyplot as plt
# !pip install tensorflow==2.16.2

이미지에서 얼굴탐지

# cv2.imshow() 출력하기
img = cv2.imread('./data/cute.png')
faces, conf = cv.detect_face(img)
print(faces) # 얼굴 탐지 내용 3ro [[(좌상단좌표),(우하단좌표)]] [[(좌상단좌표),(우하단좌표)]] [[(좌상단좌표),(우하단좌표)]]
print(conf)
cv2.imshow('cute',img) # 이미지 디스플레이
cv2.waitKey(0)
cv2.destroyAllWindows()
# 얼굴 영역 부분 사각형 도형 출력하기
import numpy as np
img_bg = np.zeros((480,640,3)) # 해당 크기의 배열 생성 후 0으로 채워
line_color = [0,255,0]
line_thick = 4
# cv2.rectangle(배경이미지, 좌상단(x,y), 우하단(x,y), 색상, 두께)
cv2.rectangle(img_bg, (0,240), (240,480), line_color, line_thick)
cv2.rectangle(img_bg, (360,240), (600,480), line_color, cv2.FILLED) # 속이 꽉찬 사각형

cv2.imshow('img_bg',img_bg)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 0번째 사람의 정보 접근
# 좌상단 좌표 print
# 우하단 좌표 print

print(faces[0])

print('좌상단좌표(x,y):',(faces[0][0],faces[0][1]))
print('우하단좌표(x,y):',(faces[0][2],faces[0][3]))

#
[244, 110, 333, 217]
좌상단좌표(x,y): (244, 110)
우하단좌표(x,y): (333, 217)
# cv2.imshow() 출력하기
import cv2
import numpy as np
import cvlib as cv

img = cv2.imread('./data/cute.png')
faces, conf = cv.detect_face(img)

color = [0,255,255]
line_th =3

# cv2.putText(배경, 텍스트, 위치, 글꼴, ...)
for i in range(len(faces)):
    # i >> 0,1,2
    cv2.putText(img, f'{conf[i]}', (faces[i][0],faces[i][1]-10), cv2.FONT_HERSHEY_PLAIN, 2, color, 2)
    cv2.rectangle(img, (faces[i][0],faces[i][1]), (faces[i][2],faces[i][3]), color, line_th)

cv2.imshow('cute',img) # 이미지 디스플레이
cv2.waitKey(0)
cv2.destroyAllWindows()
# cv2.imshow() 출력하기
import cv2
import numpy as np
import cvlib as cv

img = cv2.imread('./data/cute.png')
faces, conf = cv.detect_face(img)

color = [0,255,255]
line_th =3

# cv2.putText(배경, 텍스트, 위치, 글꼴, ...)
for (x,y,x2,y2),c in zip(faces, conf):
    # i >> 0,1,2
    cv2.putText(img, f'{c:.2f}', (x,y-10), cv2.FONT_HERSHEY_PLAIN, 2, color, 2)
    cv2.rectangle(img, (x,y), (x2,y2), color, line_th)

cv2.imshow('cute',img) # 이미지 디스플레이
cv2.waitKey(0)
cv2.destroyAllWindows()
(x,y,x2,y2),c = list(zip(faces,conf))[0]
print(x)
print(y)
print(x2)
print(y2)
print(c)

#
244
110
333
217
0.9993456
  • 카메라에서 얼굴 탐지 출력하기
# 카메라 기능 연결하고 윈도우창 띄우기
import cv2
cap = cv2.VideoCapture(0)
color = [0,255,255]
line_th =3
cnt = 0
    
while True:
    try:
        ch, frame = cap.read() # ch: 성공여부, frame: 받아온 이미지(프레임)

        # cv2.flip(대상이미지, 전환될 방향) #1 : 좌우반전
        flip_frame = cv2.flip(frame, 1)
        # 실패할 경우 while 멈추기
        if not ch:
            print('동영상 재생 끝 or 읽기 실패')
            break

        # 얼굴 탐지(찾기)
        faces, conf = cv.detect_face(flip_frame)

        # cv2.putText(배경, 텍스트, 위치, 글꼴, ...)
        for (x,y,x2,y2),c in zip(faces, conf):
            # i >> 0,1,2
            cv2.putText(flip_frame, f'{c:.2f}', (x,y-10), cv2.FONT_HERSHEY_PLAIN, 2, color, 2)
            cv2.rectangle(flip_frame, (x,y), (x2,y2), color, line_th)

        # 제대로 읽을 경우
        cv2.imshow('video', frame)
        # q라고 하는 알파벳을 클릭> 동영상 윈도우창 꺼짐
        key = cv2.waitKey(33)
        if key == ord('q'):
            print('사용자에 의해서 영상이 종료')
            break
        # 사진 찍기, 프레임 저장하기
        if key == ord('w'):
            cnt += 1 # cnt + 1
            print(f'./data/face_img{cnt}.png 사진 저장')
            cv2.imwrite(f'./data/face_img{cnt}.png', flip_frame, params=[cv2.IMWRITE_PNG_COMPRESSION,0])
    except:
        print("카메라 읽기 실패 또는 영상 끝")
        cap.release() # 카메라 연결 자원 해제
        cv2.destroyAllWindow()
        
cap.release() # 카메라 연결 자원 해제
cv2.destroyAllWindows()
import matplotlib.pyplot as plt
for i in range(1,3):
    img = cv2.imread(f'./data/face_img{i}.png')
    # plt -> cvt
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.subplot(1,2,i)
    plt.imshow(img)
# 얼굴 인식이 안됬을때, 에러가 발생하는 경우가 존재
# 카메라 읽도록 재실행 연결
# 인식이 안될 경우는 카메라 꺼지도록 설정
# try-except : 예외처리
try:
    print(gdsg) # 실행 > 선언되지 않은 변수라고 에러 발생 NameError: name 'gdsg' is not defined
except:
    print("선언되지 않은 변수입니다!")
# print(gdsg)
  • 얼굴영역 자동 모자이크 처리하기(비식별화 처리기능 구현하기)
# 선행 학습
# 모자이크 기능 opencv
# 특정 영역의 주변 픽셀 정보(표준 편차 정보)의 변화에 따른 흐림 설정

# cv2.imshow() 출력하기
img = cv2.imread('./data/cute.png')
img_crop = img[:100,:100]
img_blur = cv2.GaussianBlur(img_crop, ksize=(0,0), sigmaX=13)
# img_blur2 = cv2.GaussianBlur(img, ksize=(0,0), sigmaX=8)

# 전체 이미지 특정 영역 [:100,:100] 접근해서 블러처리된 값을 대입
img[:100,:100] = img_blur

cv2.imshow('cute',img) # 이미지 디스플레이
# cv2.imshow('cute_blur1',img_blur) # 이미지 디스플레이
# cv2.imshow('cute_blur8',img_blur2) # 이미지 디스플레이

cv2.waitKey(0)
cv2.destroyAllWindows()
  • 탐지된 얼굴 1개에 대해서 모자이크 처리해보기!
img = cv2.imread('./data/cute.png')
faces, conf = cv.detect_face(img)
# x-열(가로), y-행(세로)

for x,y,x2,y2 in faces:
    img_crop = img[y:y2,x:x2]
    img_blur = cv2.GaussianBlur(img_crop, ksize=(0,0), sigmaX=13)

    # 전체 이미지 특정 영역 y:y2, x:x2 접근해서 블러처리된 값을 대입
    img[y:y2, x:x2] = img_blur # 변형된 픽셀값

cv2.imshow('cute',img) # 이미지 디스플레이
# cv2.imshow('crop',img_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 카메라 인식된 얼굴 블러처리하기
# 카메라 기능 연결하고 윈도우창 띄우기
import cv2
cap = cv2.VideoCapture(0)
color = [0,255,255]
line_th =3
cnt = 0
    
while True:
    try:
        ch, frame = cap.read() # ch: 성공여부, frame: 받아온 이미지(프레임)

        # cv2.flip(대상이미지, 전환될 방향) #1 : 좌우반전
        flip_frame = cv2.flip(frame, 1)
        # 실패할 경우 while 멈추기
        if not ch:
            print('동영상 재생 끝 or 읽기 실패')
            break

        # 얼굴 탐지(찾기)
        faces, conf = cv.detect_face(flip_frame)

        # cv2.putText(배경, 텍스트, 위치, 글꼴, ...)
        for x,y,x2,y2 in faces:
            img_crop = img[y:y2,x:x2]
            img_blur = cv2.GaussianBlur(img_crop, ksize=(0,0), sigmaX=13)

            # 전체 이미지 특정 영역 y:y2, x:x2 접근해서 블러처리된 값을 대입
            img[y:y2, x:x2] = img_blur # 변형된 픽셀값

        # 제대로 읽을 경우
        cv2.imshow('video', frame)
        # q라고 하는 알파벳을 클릭> 동영상 윈도우창 꺼짐
        key = cv2.waitKey(33)
        if key == ord('q'):
            print('사용자에 의해서 영상이 종료')
            break
        # 사진 찍기, 프레임 저장하기
        if key == ord('w'):
            cnt += 1 # cnt + 1
            print(f'./data/face_img{cnt}.png 사진 저장')
            cv2.imwrite(f'./data/face_img{cnt}.png', flip_frame, params=[cv2.IMWRITE_PNG_COMPRESSION,0])
    except:
        print("카메라 읽기 실패 또는 영상 끝")
        cap.release() # 카메라 연결 자원 해제
        cv2.destroyAllWindow()
        
cap.release() # 카메라 연결 자원 해제
cv2.destroyAllWindows()
profile
개발자

0개의 댓글