오늘은 웹캠 영상에서 검출된 얼굴들에 모자이크 효과를 넣어보도록 하겠습니다. 다음과 같은 절차를 거쳐서 얼굴들에 모자이크 효과를 넣을 것입니다.
1) 우선 cvlib 라이브러리의 얼굴 검출 모델(딥러닝 기반)을 이용해서 영상의 각 프레임 내 얼굴들을 검출합니다.
2) 얼굴 부분을 잘라내서 크기를 축소시킨 다음에 다시 원래 사이즈로 확대시켜서 모자이크 효과를 준 것을 다시 프레임에 붙여넣습니다. 얼굴 부분의 해상도를 확 줄인 다음에 다시 확대시키기 때문에 모자이크 처리된 것처럼 보이게 됩니다.
제가 작성한 python 코드는 다음과 같습니다. 이 코드를 실행하기 위해서는 cvlib과 opencv-python 패키지가 필요하니 설치가 안 되어 있다면 설치해주세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# import necessary packages
import cvlib as cv
import cv2
# open webcam
webcam = cv2.VideoCapture(0)
if not webcam.isOpened():
print("Could not open webcam")
exit()
# loop through frames
while webcam.isOpened():
# read frame from webcam
status, frame = webcam.read()
if not status:
print("Could not read frame")
exit()
# apply face detection
face, confidence = cv.detect_face(frame)
print(face)
print(confidence)
# loop through detected faces
for idx, f in enumerate(face):
(startX, startY) = f[0], f[1]
(endX, endY) = f[2], f[3]
'모자이크 효과 주기: 얼굴 부분을 줄였다가 다시 원크기로 복구시키면 모자이크처럼 됨.'
face_region = frame[startY:endY, startX:endX]
M = face_region.shape[0]
N = face_region.shape[1]
face_region = cv2.resize(face_region, None, fx=0.05, fy=0.05, interpolation=cv2.INTER_AREA)
face_region = cv2.resize(face_region, (N, M), interpolation=cv2.INTER_AREA)
frame[startY:endY, startX:endX] = face_region
# display output
cv2.imshow("Real-time face detection", frame)
# press "Q" to stop
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# release resources
webcam.release()
cv2.destroyAllWindows()
|
cs |
위 코드를 실행하면 웹캠을 통해 촬영되는 영상에서 검출되는 얼굴들이 모자이크 처리됩니다.
꽤 괜찮게 얼굴들이 검출되어 모자이크 처리되었죠? 얼굴 각도가 너무 틀어졌을 때는 검출에 실패하는 경우도 있긴 하지만요. cvlib에서 제공하는 얼굴 검출 모델이 opencv 라이브러리에서 제공하는 Haar cascade 방식의 얼굴 검출기보다 훨씬 정확합니다. 속도도 real-time으로 적용할 수 있을만큼 빠르고요.
b스카이비전의 추천글
☞ [ubuntu+python] 웹캠 영상 실시간 물체(객체) 검출
'Dev > python' 카테고리의 다른 글
[python] os.name의 리턴 nt, posix의 의미 (0) | 2020.10.05 |
---|---|
[python] 리스트 요소 순서 뒤집는 3가지 방법 (0) | 2020.10.04 |
[python] range 함수로 범위 자료형 만들기 (0) | 2020.09.30 |
[python] print 함수 내에서 값들을 연결시킬 때 콤마(,)를 사용할 때와 덧셈(+)을 사용할 때의 차이 (0) | 2020.09.29 |
[python] (M, N, 3) 형태의 넘파이행렬을 (M*N, 3)으로 바꾸려면? (0) | 2020.09.23 |
[python] 채워진 사각형 그리는 방법, cv2.rectangle 함수 활용 (0) | 2020.09.10 |
[python] 단방향 또는 양방향으로 화살표 있는 선 그리기, cv2.arrowedLine 함수 활용 (0) | 2020.09.09 |
[python] 사진에 카툰(cartoon) 효과주기, cv2.stylization 함수 (2) | 2020.09.09 |