Apple M1运行MediaPipe代码报CalculatorOptions无ext字段错误
问题根因
该报错由依赖版本不兼容触发,和M1硬件、手写代码的核心逻辑无直接关联:
- 适配Apple Silicon芯片的
mediapipe-silicon第三方移植包,对protobuf序列化库的版本有严格约束。当环境内protobuf版本高于3.20.x系列时,新版protobuf移除了旧版的扩展字段解析逻辑,就会抛出Message type "mediapipe.CalculatorOptions" has no field named "ext"错误。 - 你提供的代码本身存在缩进逻辑错误:
cv2.imshow()与cv2.waitKey()被写在while循环外部,就算依赖问题修复,程序也会因循环内持续读取摄像头帧但不做渲染、不处理退出逻辑,最终无响应崩溃。
修复方案
按以下步骤操作即可解决问题:
- 先清理当前环境内的冲突依赖,在终端执行命令:
pip uninstall -y mediapipe mediapipe-silicon protobuf opencv-python - 安装版本匹配的依赖组合,固定protobuf版本到兼容区间,二选一即可:
- 方案1:使用silicon移植版
pip install mediapipe-silicon==0.8.11 protobuf==3.20.3 opencv-python - 方案2:使用MediaPipe官方原生支持Apple Silicon的正式版(0.8.10及以上版本已原生支持M系列芯片,无需额外安装第三方移植包,稳定性更好)
pip install mediapipe==0.10.9 protobuf==3.20.3 opencv-python
- 方案1:使用silicon移植版
- 修正代码缩进错误,将帧渲染、退出判断、资源释放逻辑补全,修正后的可运行代码如下:
import cv2 import mediapipe as mp import time cap = cv2.VideoCapture(0) mpHands = mp.solutions.hands hands = mpHands.Hands() while True: success, img = cap.read() # 摄像头读取失败时直接跳出循环 if not success: break imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB) cv2.imshow("Image", img) # 按键盘q键即可退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 退出前释放摄像头资源、关闭所有窗口 cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Shmukli
相关产品推荐
相关产品推荐

