集成姿态估计的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
相关产品推荐
相关产品推荐

