51번째 줄:
51번째 줄:
'''이미지를 받아 해당 얼굴을 찾는다.'''
'''이미지를 받아 해당 얼굴을 찾는다.'''
faces = detector(img) # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
faces = detector(img) # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
−
try:
+
for face in faces:
−
face = faces[0] # 인식된 얼굴 중 첫번째.
# 인식이 잘 되었는지 확인. 네모 그리기. 기존 이미지에 덧씌워 보여준다.
# 인식이 잘 되었는지 확인. 네모 그리기. 기존 이미지에 덧씌워 보여준다.
img = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
img = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
59번째 줄:
58번째 줄:
lineType=cv2.LINE_AA # 선의 타입 지정
lineType=cv2.LINE_AA # 선의 타입 지정
)
)
−
except: # 얼굴이 없으면 faces[0]에서 인덱스 에러가 뜬다. 그럴 땐 그냥 패스!
−
pass
cv2.imshow('window', img) # 창에 해당하는 이미지를 띄운다.
cv2.imshow('window', img) # 창에 해당하는 이미지를 띄운다.
−
cv2.waitKey(1) # 1ms만큼 대기 해야 창이 제대로 열린다.
+
cv2.waitKey(1) # 이게 있어야 창이 제대로 열린다.
+
</syntaxhighlight>
</syntaxhighlight>
|-
|-
80번째 줄:
78번째 줄:
'''이미지를 받아 얼굴의 특징점을 찾는다.'''
'''이미지를 받아 얼굴의 특징점을 찾는다.'''
faces = detector(img) # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
faces = detector(img) # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
−
try:
+
for face in faces:
−
face = faces[0] # 인식된 얼굴 중 첫번째.
dlib_shape = predictor(img, face) # 특징점을 리턴받는다.
dlib_shape = predictor(img, face) # 특징점을 리턴받는다.
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()]) # 연산을 위해 배열로 저장.
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()]) # 연산을 위해 배열로 저장.
for s in shape_2d: # 해당 좌표에 원 그리기. 68개의 특징점을 찾는다.
for s in shape_2d: # 해당 좌표에 원 그리기. 68개의 특징점을 찾는다.
cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
−
except:
+
−
pass
cv2.imshow('window', img) # 창에 해당하는 이미지를 띄운다.
cv2.imshow('window', img) # 창에 해당하는 이미지를 띄운다.
−
cv2.waitKey(1) # 1ms만큼 대기 해야 창이 제대로 열린다.
+
cv2.waitKey(1) # 이게 있어야 창이 제대로 열린다.
</syntaxhighlight>앞으로의 목표는 많은 얼굴에 대해서도 찾는 것...
</syntaxhighlight>앞으로의 목표는 많은 얼굴에 대해서도 찾는 것...
102번째 줄:
98번째 줄:
'''1. 이미지를 받아 얼굴의 중심점을 찾는다. 2. 그 지점에 이미지를 불러온다.'''
'''1. 이미지를 받아 얼굴의 중심점을 찾는다. 2. 그 지점에 이미지를 불러온다.'''
faces = detector(img) # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
faces = detector(img) # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
−
try:
+
blind_image = img.copy()
−
face = faces[0] # 인식된 얼굴 중 첫번째.
+
for face in faces:
−
dlib_shape = predictor(img, face) # 특징점을 리턴받는다.
+
try:
−
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()]) # 연산을 위해 배열로 저장.
+
dlib_shape = predictor(img, face) # 특징점을 리턴받는다.
−
center_x, center_y = np.mean(shape_2d, axis=0).astype(np.int) # 중심점을 찾는다.
+
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()]) # 연산을 위해 배열로 저장.
−
overlay = cv2.imread(address, cv2.IMREAD_UNCHANGED) # 이미지를 불러온다. 알파채널까지 읽기 위한 옵션.
+
center_x, center_y = np.mean(shape_2d, axis=0).astype(np.int) # 중심점을 찾는다.
−
# 얼굴 경계 찾기.
+
overlay = cv2.imread(address, cv2.IMREAD_UNCHANGED) # 이미지를 불러온다. 알파채널까지 읽기 위한 옵션.
−
min_coords = np.min(shape_2d, axis=0) # 각 열에 대해 가장 작은 값들.
+
# 얼굴 경계 찾기.
−
max_coords = np.max(shape_2d, axis=0)
+
min_coords = np.min(shape_2d, axis=0) # 각 열에 대해 가장 작은 값들.
−
face_size = max(max_coords - min_coords)
+
max_coords = np.max(shape_2d, axis=0)
−
# 덮을 이미지가 얼굴 인식에 따라 급격하게 변하기 때문에, 이를 중화하기 위한 코드.
+
face_size = max(max_coords - min_coords)
−
face_sizes.append(face_size)
+
# 덮을 이미지가 얼굴 인식에 따라 급격하게 변하기 때문에, 이를 중화하기 위한 코드.
−
if len(face_sizes) > 10:
+
face_sizes.append(face_size)
−
del face_sizes[0]
+
if len(face_sizes) > 10:
−
mean_face_size = int(np.mean(face_sizes) * 2.0) # 얼굴을 적절히 덮기 위한 숫자보정.
+
del face_sizes[0]
−
origin_image = img.copy()
+
mean_face_size = int(np.mean(face_sizes) * 2.0) # 얼굴을 적절히 덮기 위한 숫자보정.
−
# 다음 사용하는 함수는 아랫쪽에 정의되어 있다.
+
# 다음 사용하는 함수는 아랫쪽에 정의되어 있다.
−
result = overlay_transparent(x=center_x, y=center_y - 25, # 얼굴의 중심을 찾고 숫자로 보정해준다.
+
blind_image = overlay_transparent(x=center_x, y=center_y - 25, # 얼굴의 중심을 찾고 숫자로 보정해준다.
−
background_img=origin_image, # 기존 이미지.
+
background_img=blind_image, # 기존 이미지.
−
img_to_overlay_t=overlay, # 덮을 이미지.
+
img_to_overlay_t=overlay, # 덮을 이미지.
−
overlay_size=(mean_face_size, mean_face_size))
+
overlay_size=(mean_face_size, mean_face_size))
−
cv2.imshow('window', result) # 창에 해당하는 이미지를 띄운다.
+
except: # 이상하게 얼굴 2개를 인식하게 되는 순간 에러가 난다....왤까...
−
except:
+
pass # 근데, 에러가 나도 1,2 프레임 뿐인지, 그냥 pass처리하면 잘 나온다;;
−
cv2.imshow('window', img) # 얼굴 인식이 안되면 이미지를 그냥 띄우기
+
'''이유를 찾았다.
−
pass
+
OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-czu11tvl\opencv\modules\core\src\arithm.cpp:230: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'cv::binary_op'
−
cv2.waitKey(1) # 1ms만큼 대기 해야 창이 제대로 열린다.
+
위 에러는 덮어씌우는 이미지가 해당 창 밖으로 나갈 때 발생하는 에러이다.
+
'''
+
cv2.imshow('window', blind_image) # 창에 해당하는 이미지를 띄운다.
+
cv2.waitKey(1) # 이게 있어야 창이 제대로 열린다.
</syntaxhighlight>
</syntaxhighlight>
|-
|-
169번째 줄:
168번째 줄:
</syntaxhighlight>
</syntaxhighlight>
|}
|}
+
[[분류:딥러닝 트레킹]]