基于OpenCV+MediaPipe的手部追踪Python代码运行报错求助
报错解决方案
核心报错原因
你遇到的(-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'错误,本质是cv2.VideoCapture读取摄像头帧失败,返回的img为空值,无法执行色彩空间转换。附带的MSMF警告是Windows平台下OpenCV默认调用媒体框架的兼容性提示。
具体解决步骤
- 修正摄像头索引
绝大多数设备的默认内置摄像头索引为0,将代码中cap = cv2.VideoCapture(1)的参数改为0,如果使用外置摄像头可依次尝试1、2等索引值。 - 增加空帧判断逻辑
读取帧后先判断是否读取成功,失败则跳过当前循环,避免对空值做处理。 - 替换视频输入后端消除警告
Windows平台下创建VideoCapture时指定cv2.CAP_DSHOW作为后端,可解决MSMF异步回调终止的警告,兼容性更好。 - 检查摄像头权限与占用
确认系统隐私设置中允许桌面应用访问摄像头,且没有其他软件正在占用当前调用的摄像头设备。
修改后可运行的完整代码
import cv2 import mediapipe as mp import time # 替换索引为0,指定CAP_DSHOW后端提升Windows兼容性 cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) mpHands = mp.solutions.hands hands = mpHands.Hands() mpDraw = mp.solutions.drawing_utils pTime = 0 cTime = 0 while True: success, img = cap.read() # 增加空帧判断,读取失败直接跳过当前循环 if not success: continue imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB) if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id, lm in enumerate(handLms.landmark): h, w, c = img.shape cx, cy = int(lm.x * w), int(lm.y * h) print(id, cx, cy) cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS) cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3) cv2.imshow("Image", img) # 增加退出逻辑:按q键关闭窗口 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头资源、销毁窗口 cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Aryan GS
相关产品推荐
相关产品推荐

