我想使用 facemesh 顶点测量鼻尖和食指尖之间的距离

i want to measure the distance between nosetip and tip of index finger using facemesh vertices

提问人:CodeKimchi CK 提问时间:11/17/2023 最后编辑:Christoph RackwitzCodeKimchi CK 更新时间:11/19/2023 访问量:23

问:

我已将 facemesh 和 handmesh 实时放在一个帧中。

我一直在尝试获取每个面网格顶点的坐标,但遇到了麻烦。

我能够打印出整个坐标

print (results.multi_face_landmarks[0])

但它似乎包含整个顶点的坐标。

例如,我只想获取鼻尖的坐标,即 478 个顶点中的 4 个顶点。

将来,我想测量点和食指尖的距离,以提醒用户习惯性地触摸鼻子。

**无法确定整个坐标是否以表格或列表的形式保存和加载。

请帮我如何找到坐标。

这是我到目前为止的代码。我已将数学导入到将来计算距离。

import cv2
import numpy as np
import mediapipe as mp


#################################################################
import math

def calculate_distance(point1, point2):
    x1, y1, z1 = point1
    x2, y2, z2 = point2
    
    distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)
    return distance
##################################################################

cap = cv2.VideoCapture(0)

mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
mpHands = mp.solutions.hands

faceMesh = mpFaceMesh.FaceMesh(max_num_faces=2)
handsMesh = mpHands.Hands(max_num_hands=2)

drawSpecFace = mpDraw.DrawingSpec(thickness=1, circle_radius=1)
drawSpecHands = mpDraw.DrawingSpec(thickness=1, circle_radius=1)

both_detected = False  # Initialize detection flag


while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    results = faceMesh.process(imgRGB)
    if results.multi_face_landmarks:
        for faceLms in results.multi_face_landmarks:
            mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS, drawSpecFace, drawSpecFace)

            face = results.multi_face_landmarks[0]; 


    results2 = handsMesh.process(imgRGB)
    if results2.multi_hand_landmarks:
        for handLms in results2.multi_hand_landmarks:
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, drawSpecHands, drawSpecHands)

    # Check if both face and hands are detected
    if results.multi_face_landmarks and results2.multi_hand_landmarks:
        both_detected = True
        cv2.putText(img, "Why Are Your Hands Near Face?", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (34,139,34), 2, cv2.LINE_AA)
    else:
        both_detected = False




    print (results.multi_face_landmarks[0])





    cv2.imshow("Image", img)
    cv2.waitKey(1)

这是我到目前为止的结果:

1

Python 计算机视觉 坐标 MediaPipe 顶点

评论


答:

0赞 CodeKimchi CK 11/28/2023 #1

我自己也发现了。

results.multi_face_landmarks[0]

解析出整个坐标的结果。

为了获得顶点的一定协调性,

我只需要这样做。

results.multi_face_landmarks[0].landmark[x]

x 是您可以在面部网格映射图像上找到的顶点数。