我尝试使用此代码能够实时获取面部位置的 x 和 y 坐标。我从在线mediapipe解决方案获得了代码。 运行此代码时,实际上会检测到面部,并且其所有特征都在显示帧上指示为红点。 我希望能够以整数形式获取面部坐标,以便稍后使用它们通过伺服电机跟踪位置,有什么办法可以做到这一点吗?
# face detection
import cv2
import mediapipe as mp
import time
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
# capture video
cap = cv2.VideoCapture(2)
prevTime = 0
with mp_face_detection.FaceDetection( model_selection=1,
min_detection_confidence=0.65) as face_detection:
while True:
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
break
#Convert the BGR image to RGB.
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = face_detection.process(image)
# Draw the face detection annotations on the image.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detections:
for detection in results.detections:
mp_drawing.draw_detection(image, detection)
print(detection) # I can get the score, x, y,..
cv2.imshow('BlazeFace Face Detection', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
我尝试在for循环中打印变量person,我可以清楚地看到其中有x和y坐标,但我未能提取这些特定信息。 关于如何更好地操纵这个变量有什么想法吗? 我将使用检测到的面部数量、它们的位置坐标和置信度。
看
print(detection)
的结果结构:
label_id: 0
score: 0.8402262330055237
location_data {
format: RELATIVE_BOUNDING_BOX
relative_bounding_box {
xmin: 0.4553905725479126
ymin: 0.6456842422485352
width: 0.24106884002685547
height: 0.32147008180618286
}
relative_keypoints {
x: 0.45961669087409973
y: 0.7614946961402893
}
[...]
}
这些字段是
mediapipe.framework.formats.detection_pb2.Detection
类型输出的属性。
我假设面部坐标指的是它的边界框坐标。
您可以像这样访问这些坐标:
relative_bbox = detection.location_data.relative_bounding_box
my_relative_bbox_list = [relative_bbox.xmin,relative_bbox.ymin,relative_bbox.width,relative_bbox.height]