얼굴탐지(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()