aqui está meu código que desenha pontos de referência na mão usando mediapipe
import cv2
import time
import mediapipe as mp
mp_holistic = mp.solutions.holistic
holistic_model = mp_holistic.Holistic(
min_detection_confidence=0.5,
min_tracking_confidence=0.5
)
# Initializing the drawing utils for drawing the facial landmarks on image
mp_drawing = mp.solutions.drawing_utils
# (0) in VideoCapture is used to connect to your computer's default camera
capture = cv2.VideoCapture(0)
# Initializing current time and precious time for calculating the FPS
previousTime = 0
currentTime = 0
while capture.isOpened():
# capture frame by frame
ret, frame = capture.read()
# resizing the frame for better view
frame = cv2.resize(frame, (800, 600))
# Converting the from BGR to RGB
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Making predictions using holistic model
# To improve performance, optionally mark the image as not writeable to
# pass by reference.
image.flags.writeable = False
results = holistic_model.process(image)
image.flags.writeable = True
# Converting back the RGB image to BGR
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# Drawing the Facial Landmarks
# mp_drawing.draw_landmarks(
# image,
# results.face_landmarks,
# mp_holistic.FACEMESH_CONTOURS,
# mp_drawing.DrawingSpec(
# color=(255, 0, 255),
# thickness=1,
# circle_radius=1
# ),
# mp_drawing.DrawingSpec(
# color=(0, 255, 255),
# thickness=1,
# circle_radius=1
# )
# )
# Drawing Right hand Land Marks
mp_drawing.draw_landmarks(
image,
results.right_hand_landmarks,
mp_holistic.HAND_CONNECTIONS
)
for landmark in mp_holistic.HandLandmark:
print(landmark,landmark.value)
# Drawing Left hand Land Marks
mp_drawing.draw_landmarks(
image,
results.left_hand_landmarks,
mp_holistic.HAND_CONNECTIONS
)
# Calculating the FPS
currentTime = time.time()
fps = 1 / (currentTime - previousTime)
previousTime = currentTime
# Displaying FPS on the image
cv2.putText(image, str(int(fps)) + " FPS", (10, 70), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 2)
# Display the resulting image
cv2.imshow("Facial and Hand Landmarks", image)
# Enter key 'q' to break the loop
if cv2.waitKey(5) & 0xFF == ord('q'):
break
# When all the process is done
# Release the capture and destroy all windows
capture.release()
cv2.destroyAllWindows()
para a mão esquerda e direita, mas meu objetivo é: desenhar uma linha reta entre as mãos, para entender minha pergunta, vamos discutir a seguinte imagem:
a partir da figura podemos dizer, por exemplo, que a linha entre as mãos deve ser perfeitamente horizontal (então o ângulo deve ser zero, como se considerássemos a seguinte equação:
é fácil dizer que para que haja linhas perfeitamente horizontais, as coordenadas y devem ser iguais entre si, então, por favor, me ajude a descobrir como determinar as coordenadas e como desenhar uma linha entre dois pontos? Desenhar é fácil, pois cv2.line existe, mas e as coordenadas?
Você está usando a função Mediapipe interna
draw_landmarks
para manipular todos os desenhos. Esta função pega uma imagem, uma lista de marcos normalizada e conexões como entradas. No entanto, oNormalizedLandmarkList
tipo no Mediapipe não suporta mesclar várias listas de marcos, dificultando a passagem de marcos para ambas as mãos para a função e a localização de conexões.Uma abordagem alternativa é extrair as coordenadas dos marcos da mão e desenhar uma linha usando o
cv2.line
método, como você mencionou. Aqui está o código para implementar essa abordagem:Se você quiser selecionar outro ponto de referência diferente do
wrist
, confira este link para ver os índices de pontos de referência.