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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:11:04