INFO: Created TensorFlow Lite XNNPACK delegate for CPU. <class 'numpy.ndarray'> Traceback (most recent call last): File "E:\Study\Project\Python\mediapipe\FaceMainPointCap.py", line 82, in <module> cv2.circle(annotated_image, (int(landmark[0]), int(landmark[1])), 2, (0, 255, 0), -1) TypeError: 'NormalizedLandmarkList' object is not subscriptable
时间: 2024-02-28 20:54:47 浏览: 259
这个错误是因为你尝试对一个`NormalizedLandmarkList`类型的对象进行索引,但是这个对象并不支持索引操作。`NormalizedLandmarkList`是Mediapipe中表示标准化关键点列表的类,它包含了多个`NormalizedLandmark`对象,每个`NormalizedLandmark`对象包含了一个关键点的坐标。因此,你需要先从`NormalizedLandmarkList`对象中获取每个关键点的坐标,然后再进行绘制操作。
具体地,你可以使用以下代码从`NormalizedLandmarkList`对象中获取关键点坐标:
```python
landmark_list = results.multi_face_landmarks[face_id] # 获取单个人脸的关键点列表
landmark = landmark_list.landmark[0] # 获取第一个关键点的坐标
image_height, image_width, _ = image.shape # 获取图像高度和宽度
x = int(landmark.x * image_width) # 将横坐标从归一化坐标转换为像素坐标
y = int(landmark.y * image_height) # 将纵坐标从归一化坐标转换为像素坐标
```
上述代码中,`face_id`表示人脸的索引,可以根据需要进行修改。`image_height`和`image_width`分别表示图像的高度和宽度,可以使用OpenCV的`cv2.imread()`函数读取图像后获取。`landmark.x`和`landmark.y`表示关键点在图像中的归一化坐标,范围在0到1之间,需要将其乘以图像的宽度和高度,才能转换为像素坐标。
然后,你可以使用上述代码获取的关键点坐标,进行绘制操作,例如:
```python
cv2.circle(annotated_image, (x, y), 2, (0, 255, 0), -1)
```
如果需要绘制关键点的索引,可以使用前面提到的方法,在关键点附近绘制索引。
阅读全文