用户警告:SymbolDatabase.GetPrototype() 已弃用。请改用 message_factory.GetMessageClass()

问题描述 投票:0回答:1

我有这段代码,我使用 MediaPipe 和 OpenCV 来标记手指:

import cv2
import mediapipe as mp
from mediapipe import solutions

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=2,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5,
)
mp_drawing = mp.solutions.drawing_utils

finger_indices = [
    mp_hands.HandLandmark.THUMB_TIP,
    mp_hands.HandLandmark.INDEX_FINGER_TIP,
    mp_hands.HandLandmark.MIDDLE_FINGER_TIP,
    mp_hands.HandLandmark.RING_FINGER_TIP,
    mp_hands.HandLandmark.PINKY_TIP,
]


def label_fingers(frame, fingers, hand_landmarks, frame_width, frame_height):
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 1.0
    color = (255, 0, 0)
    thickness = 2
    line_type = cv2.LINE_AA

    for idx, finger in enumerate(finger_indices):
        landmark = hand_landmarks.landmark[finger]
        x = int(landmark.x * frame_width)
        y = int(landmark.y * frame_height)
        text = str(fingers[idx])
        org = (x, y)
        cv2.putText(frame, text, org, font, font_scale, color, thickness, line_type)


async def process_video_stream(frame, fingers):
    frame = cv2.resize(frame, (600, 400))
    frame = cv2.flip(frame, 1)
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(rgb_frame)

    if result.multi_hand_landmarks:
        frame_height, frame_width = frame.shape[:2]
        for hand_landmarks in result.multi_hand_landmarks:
            mp_drawing.draw_landmarks(
                frame,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS,
                solutions.drawing_styles.get_default_hand_landmarks_style(),
                solutions.drawing_styles.get_default_hand_connections_style(),
            )
            label_fingers(frame, fingers, hand_landmarks, frame_width, frame_height)

    return frame

代码运行良好,但我收到以下警告消息:

/home/khalid/.local/lib/python3.10/site-packages/google/protobuf/symbol_database.py:55: UserWarning: SymbolDatabase.GetPrototype() is deprecated. Please use message_factory.GetMessageClass() instead. SymbolDatabase.GetPrototype() will be removed soon.
  warnings.warn('SymbolDatabase.GetPrototype() is deprecated. Please '

我不知道代码中的何处调用了已弃用的

SymbolDatabase.GetPrototype()
函数,因此我可以用新的
message_factory.GetMessageClass()
方法替换它。如何找到并更新这个已弃用的函数用法?

python mediapipe
1个回答
0
投票

错误不在代码中,而是在作为 mediapipe 安装的一部分安装的 protobuf 库中。我最近在使用 Face Landmark 检测时也遇到了这个错误,解决这个问题的方法是管理 mediapipe 和 protobuf 的版本。对我有用的是 mediapipe 版本 0.10.11 和 protobuf 版本 3.20.3

更多信息可以在此 github 问题链接上找到:https://github.com/google-ai-edge/mediapipe/issues/5361

© www.soinside.com 2019 - 2024. All rights reserved.