OpenCV
[openCV] mp_draw 코드 수정해서 출력 수정하기
선호하는
2024. 12. 24. 07:00
서론
hand_landmarks.landmark에서 특정 포인트를 찍을 때, 불편한 점이 있다. 이 지점의 값이 몇인지, 이름이 무엇인지 모른다는 것이다. 이걸 확인하기 위한 방법은 라이브러리 코드를 직접 확인하는 것이다.
설명
1. enum 확인하기
앞선 글에서, 클릭 이벤트 처리를 위한 enum을 선언했었다. 이와 같이, HandLandmark도 enum이 선언되어 있다.
mediapipe.python.solutions.hands.HandLandmark 경로에 선언되어 있다.
class HandLandmark(enum.IntEnum):
"""The 21 hand landmarks."""
WRIST = 0
THUMB_CMC = 1
THUMB_MCP = 2
THUMB_IP = 3
THUMB_TIP = 4
INDEX_FINGER_MCP = 5
INDEX_FINGER_PIP = 6
INDEX_FINGER_DIP = 7
INDEX_FINGER_TIP = 8
MIDDLE_FINGER_MCP = 9
MIDDLE_FINGER_PIP = 10
MIDDLE_FINGER_DIP = 11
MIDDLE_FINGER_TIP = 12
RING_FINGER_MCP = 13
RING_FINGER_PIP = 14
RING_FINGER_DIP = 15
RING_FINGER_TIP = 16
PINKY_MCP = 17
PINKY_PIP = 18
PINKY_DIP = 19
PINKY_TIP = 20
2. mp_draw.draw_landmarks() 수정하기
HandLandmark를 확인해도, 정확히 이 위치가 어디인지 헷갈릴 수가 있다. cv2.putText()를 사용해서, 현재 좌표의 index를 확인할 수 있다.
아래 코드는 draw_landmarks 함수의 마지막 부분이다. 주석에서 볼 수 있듯이, 랜드마크에 선과 원을 그리는 작동을 한다.
# Draws landmark points after finishing the connection lines, which is
# aesthetically better.
if is_drawing_landmarks and landmark_drawing_spec:
for idx, landmark_px in idx_to_coordinates.items():
drawing_spec = landmark_drawing_spec[idx] if isinstance(
landmark_drawing_spec, Mapping) else landmark_drawing_spec
# White circle border
circle_border_radius = max(drawing_spec.circle_radius + 1,
int(drawing_spec.circle_radius * 1.2))
cv2.circle(image, landmark_px, circle_border_radius, WHITE_COLOR,
drawing_spec.thickness)
# Fill color into the circle
cv2.circle(image, landmark_px, drawing_spec.circle_radius,
drawing_spec.color, drawing_spec.thickness)
# ---------------------------------------------------------------------
# 코드 추가 부분
cv2.putText(image, f'{idx}', landmark_px, cv2.FONT_HERSHEY_PLAIN, 2, (0,0,0))
# ---------------------------------------------------------------------
이 함수를 수정하면, 다음과 같이 이미지 출력이 가능하다.
번호만 나와서 보기 불편할 수도 있다.
해당 라이브러리 코드에 HandLandmark를 import해서 enum타입을 재정의한 다음, 해당 idx를 key로 가진 값을 출력해주면 보기 편하다.
# 함수 바깥 부분
from mediapipe.python.solutions.hands import HandLandmark
hand_landmark_dict = {value.value: key for key, value in HandLandmark.__members__.items()}
# ---------------------------------------------------------------------
# 코드 추가 부분
cv2.putText(image, f'{hand_landmark_dict[idx]}', landmark_px, cv2.FONT_HERSHEY_PLAIN, 2, (0,0,0))
# ---------------------------------------------------------------------
이렇게 수정할 경우, 다음과 같이 이미지 출력이 가능하다.