I want to remove the thumb from the Hand landmark tracking Mediapipe model to only track my 4 fingers without the thumb. How can I do that?
Here's what I have done so far and I was able to remove the unwanted CONNECTIONS by defining a custom connections list. But still landmark dots/points visible. How can I remove them?. Thank You.
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
handConnection = [(5, 9), (10, 11), (5, 6), (15, 16), (13, 17), (18, 19),
(6, 7), (0, 17), (9, 10), (0, 5), (14, 15),
(11, 12), (19, 20), (9, 13), (17, 18), (13, 14), (7, 8)]
cap = cv2.VideoCapture(1)
def main():
hands = mp_hands.Hands(
min_detection_confidence=0.7, min_tracking_confidence=0.7)
hand_landmark_drawing_spec = mp_drawing.DrawingSpec(thickness=5, circle_radius=5)
hand_connection_drawing_spec = mp_drawing.DrawingSpec(thickness=10, circle_radius=10)
while cap.isOpened():
ret, image = cap.read()
image = cv2.flip(image, 1)
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
results_hand = hands.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results_hand.multi_hand_landmarks:
for hand_landmarks in results_hand.multi_hand_landmarks:
mp_drawing.draw_landmarks(
image=image,
landmark_list=hand_landmarks,
connections=handConnection,
landmark_drawing_spec=hand_landmark_drawing_spec,
connection_drawing_spec=hand_connection_drawing_spec)
keypress = cv2.waitKey(1)
if keypress == ord('c'):
break
cv2.imshow("Img", image)
hands.close()
cap.release()
main()
You could just change the drawing function. To do that, open drawing_utils.py
, go to draw_landmarks()
and at the beginning of the for loop that iterates over the landmarks (for idx, landmark in enumerate(landmark_list.landmark):
) and those two lines (where in the square bracket you would put the indices that you want to skip
if idx in [0, 1, 2, 3, 4]:
continue
so instead of this:
for idx, landmark in enumerate(landmark_list.landmark):
if ((landmark.HasField('visibility') and
landmark.visibility < _VISIBILITY_THRESHOLD) or
(landmark.HasField('presence') and
landmark.presence < _PRESENCE_THRESHOLD)):
continue
landmark_px = _normalized_to_pixel_coordinates(landmark.x, landmark.y,
image_cols, image_rows)
if landmark_px:
idx_to_coordinates[idx] = landmark_px
you should have this:
for idx, landmark in enumerate(landmark_list.landmark):
if idx in [10, 11, 7, 3, 4]:
continue
if ((landmark.HasField('visibility') and
landmark.visibility < _VISIBILITY_THRESHOLD) or
(landmark.HasField('presence') and
landmark.presence < _PRESENCE_THRESHOLD)):
continue
landmark_px = _normalized_to_pixel_coordinates(landmark.x, landmark.y,
image_cols, image_rows)
if landmark_px:
idx_to_coordinates[idx] = landmark_px