Mediapipe Hands识别代码运行内存耗尽问题排查求助
问题:Mediapipe手部检测代码持续占用内存直至耗尽
我想要验证搭载OpenCV与Mediapipe库的开发环境是否正常运行,为此测试了如下代码:
import cv2 import mediapipe as mp mp_hands=mp.solutions.hands mp_drawing=mp.solutions.drawing_utils webcam = cv2.VideoCapture(0,cv2.CAP_DSHOW) while webcam.isOpened(): success, img = webcam.read() img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) results=mp_hands.Hands(max_num_hands=3,min_detection_confidence=0.7,min_tracking_confidence=0.6).process(img) cv2.imshow('test', img) results=[] print("passo") if cv2.waitKey(5) & 0xFF == ord("q"): break webcam.release() cv2.destroyAllWindows()
启动程序后,results=mp_hands.Hands(max_num_hands=3,min_detection_confidence=0.7,min_tracking_confidence=0.6).process(img)这一行会持续占用工作站内存直至耗尽。我使用Python 3.11与Mediapipe 0.10.5版本,已尝试更换摄像头、删除部分变量来降低内存占用,想咨询这是库的bug还是代码需要调整?
解决方案
这是代码逻辑问题,不是库的bug。
问题根源
你在while循环的每次迭代中都重新创建mp_hands.Hands()实例,该实例包含手部检测模型的权重、上下文状态等大量资源。循环不断生成新实例,旧实例的内存无法被Python垃圾回收机制及时回收,最终导致内存耗尽。
修复后的代码
import cv2 import mediapipe as mp mp_hands=mp.solutions.hands mp_drawing=mp.solutions.drawing_utils webcam = cv2.VideoCapture(0,cv2.CAP_DSHOW) # 将Hands实例化移到循环外,仅创建一次 with mp_hands.Hands(max_num_hands=3, min_detection_confidence=0.7, min_tracking_confidence=0.6) as hands: while webcam.isOpened(): success, img = webcam.read() if not success: print("无法读取摄像头帧") break img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # 循环内仅调用process方法 results=hands.process(img) cv2.imshow('test', cv2.cvtColor(img, cv2.COLOR_RGB2BGR)) # 转回BGR格式,保证画面颜色正常 print("passo") if cv2.waitKey(5) & 0xFF == ord("q"): break webcam.release() cv2.destroyAllWindows()
额外说明
- 使用
with语句管理Hands实例,能自动释放资源,避免潜在的内存泄漏 - 增加
success判断,防止摄像头读取失败时后续代码报错 - 显示画面时将RGB转回BGR,因为OpenCV默认使用BGR格式,否则显示画面会出现颜色失真
内容的提问来源于stack exchange,提问作者Emanuele Benatti
相关产品推荐
相关产品推荐

