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> |
| |} | | |} |
| + | [[분류:딥러닝 트레킹]] |