如何将OpenCV行人检测代码的视频源替换为桌面屏幕源?
桌面屏幕实时行人检测方案(整合mss+OpenCV HOG)
直接上可运行的整合代码,核心解决mss捕获图像与OpenCV格式兼容的问题:
import cv2 import mss import numpy as np # 初始化HOG行人检测器 hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 初始化屏幕捕获对象 with mss.mss() as sct: # 设置捕获区域,monitor=1对应主屏幕,也可自定义区域(如{"top": 0, "left": 0, "width": 1920, "height": 1080}) monitor = sct.monitors[1] while True: # 捕获屏幕画面 sct_img = sct.grab(monitor) # 将mss的RGBA格式图像转换为OpenCV兼容的BGR格式 frame = np.array(sct_img) frame = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR) # 行人检测,可调整参数平衡速度与精度 boxes, weights = hog.detectMultiScale(frame, winStride=(4, 4), padding=(8, 8), scale=1.05) # 绘制检测框 for (x, y, w, h) in boxes: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示检测结果 cv2.imshow("Screen Pedestrian Detection", frame) # 按下q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): cv2.destroyAllWindows() break
关键修改说明
- 格式转换:mss捕获的图像是RGBA格式的numpy数组,而OpenCV默认使用BGR格式,必须通过
cv2.COLOR_RGBA2BGR完成转换,否则会出现颜色失真 - 循环逻辑替换:把原视频检测代码中
cap.read()的读取逻辑,替换为mss.grab()的屏幕捕获循环,实现实时帧获取 - 参数调优:
detectMultiScale的winStride、padding、scale可按需调整:增大winStride和scale能提升检测速度,缩小参数则提升检测精度
常见问题排查
- 检测速度慢:可以缩小捕获区域(比如只检测屏幕特定区域),或者调大
scale参数(如1.1) - 画面无显示:多显示器环境下,
monitors[0]是所有屏幕拼接区域,monitors[1]是主屏幕,需确认参数对应正确 - 检测框不准确:尝试减小
scale值,或者调整padding参数优化检测范围
内容的提问来源于stack exchange,提问作者Mark_us
相关产品推荐
相关产品推荐

