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

集成姿态估计的Django接口pose_feed为何在Mac系统无法访问?

问题修复方案

1 修复前端路径错误

你的home.html中图片资源路径配置错误,未指向正确的姿态估计流路由,修改如下:

<html>
  <head>
    <title>Video Live Stream</title>
  </head>
  <body>
    <h1>Video Live Stream</h1>
    <img src="{% url 'pose_feed' %}">
  </body>
</html>

2 开启Mac摄像头权限

Mac系统默认限制应用的摄像头访问权限,你需要先给运行Django服务的终端/IDE开启权限:

  • 打开系统设置>隐私与安全性>摄像头
  • 勾选你使用的终端(终端.app/iTerm2)或Python IDE(PyCharm/VSCode等)
  • 重启对应应用后再启动Django服务

3 适配Mac的摄像头调用逻辑

Mac下cv2.VideoCapture默认后端兼容性差,且无打开失败的错误提示,容易静默卡死,修改cameras.py代码如下:

import cv2
import mediapipe as mp
import time

class PoseWebCam(object):
    def __init__(self):
        # 指定Mac系统的AVFoundation摄像头后端,避免默认兼容问题
        self.cap = cv2.VideoCapture(0, cv2.CAP_AVFOUNDATION)
        # 增加摄像头打开校验,失败直接抛出异常避免无响应
        if not self.cap.isOpened():
            raise RuntimeError("摄像头打开失败,请检查权限或设备占用情况")
        # 简化MediaPipe导入路径,避免层级过深导致的导入异常
        self.mpPose = mp.solutions.pose
        self.pose = self.mpPose.Pose(static_image_mode=False, min_detection_confidence=0.5, min_tracking_confidence=0.5)
        self.mpDraw = mp.solutions.drawing_utils
        self.pTime = 0

    def __del__(self):
        # 显式释放摄像头资源,避免进程残留占用摄像头
        self.cap.release()
        cv2.destroyAllWindows()

    def get_frame(self):
        success, img = self.cap.read()
        # 增加帧读取校验,避免空帧导致后续处理卡死
        if not success or img is None:
            return b''
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        results = self.pose.process(imgRGB)

        if results.pose_landmarks:
            self.mpDraw.draw_landmarks(img, results.pose_landmarks, self.mpPose.POSE_CONNECTIONS)
            for id, lm in enumerate(results.pose_landmarks.landmark):
                h, w,c = img.shape
                cx, cy = int(lm.x*w), int(lm.y*h)
                cv2.circle(img, (cx, cy), 5, (255,0,0), cv2.FILLED)

        cTime = time.time()
        fps = 1/(cTime-self.pTime)
        self.pTime = cTime

        cv2.putText(img, str(int(fps)), (50,50), cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0), 3)
        frame_flip = cv2.flip(img,1)
        ret, jpeg = cv2.imencode('.jpg', frame_flip)
        return jpeg.tobytes()

4 调整Django启动参数

Django默认runserver是单线程模式,处理视频流请求时容易阻塞,启动时增加多线程和禁用自动重载参数,避免多进程抢摄像头:

python manage.py runserver 0.0.0.0:8000 --threaded --noreload

内容的提问来源于stack exchange,提问作者Sungeun Choi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:27:04