You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:36:08