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

基于Python计算机视觉识别应急门人员违规进入的技术咨询

应急门违规进入识别方案(Python+计算机视觉)

核心逻辑

核心是通过目标轨迹的方向判定区分合规外出与违规进入:预先定义门的边界线,将画面划分为「门内区」和「门外区」,跟踪人员的移动轨迹,若出现从「门外区」到「门内区」的穿越行为,即判定为违规进入。

具体实施步骤

  • 第一步:划定门的边界与区域
    在视频帧上标记一条虚拟边界线(对应门的物理出入口),通过坐标定义线的两端点(如line_start=(x1,y1)、line_end=(x2,y2)),以此区分门内、门外区域。
  • 第二步:目标检测与持续跟踪
    用你熟悉的目标检测模型(如YOLO系列)识别画面中的人员,搭配跟踪算法(如DeepSORT、ByteTrack)为每个人员分配唯一ID,持续记录其位置坐标,保证轨迹的连续性。
  • 第三步:轨迹方向判断
    保留每个跟踪目标的最近2-3个坐标点,计算其穿越边界线前后的区域归属:
    • 若目标之前在门外区、之后进入门内区,触发违规告警;
    • 若从门内区到门外区,判定为合规外出,忽略即可。
      可通过向量叉乘或区域坐标范围判断,快速确定点所属区域。
  • 第四步:违规事件处理
    检测到违规时,记录时间戳、截取当前帧保存,或联动硬件触发声光告警(若有需求)。

关键代码片段示例

import cv2
import numpy as np

# 自定义门的边界线(根据实际场景调整坐标)
line_start = (300, 100)
line_end = (300, 500)

# 判断点位于门线的哪一侧:1=门内,-1=门外
def get_region(point, line_s, line_e):
    cross_product = (line_e[0] - line_s[0])*(point[1] - line_s[1]) - (line_e[1] - line_s[1])*(point[0] - line_s[0])
    return 1 if cross_product > 0 else -1

# 存储跟踪目标的历史轨迹:key=跟踪ID,value=坐标点列表
track_history = {}

# 读取视频(可替换为实时摄像头流:cv2.VideoCapture(0))
cap = cv2.VideoCapture("door_monitor.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # --------------------------
    # 此处替换为实际目标检测代码(YOLO等)
    # 示例:模拟人员检测框,格式为(x1,y1,x2,y2)
    person_bboxes = [(240, 160, 290, 310), (360, 180, 410, 330)]
    # --------------------------

    # 处理每个检测到的人员
    for idx, bbox in enumerate(person_bboxes):
        track_id = idx + 1
        # 计算检测框中心作为跟踪点
        center = ((bbox[0]+bbox[2])//2, (bbox[1]+bbox[3])//2)

        # 更新轨迹历史
        if track_id not in track_history:
            track_history[track_id] = []
        track_history[track_id].append(center)

        # 用最近2个点判断方向
        if len(track_history[track_id]) >= 2:
            prev_point = track_history[track_id][-2]
            curr_region = get_region(center, line_start, line_end)
            prev_region = get_region(prev_point, line_start, line_end)

            # 判定违规:从门外到门内
            if prev_region == -1 and curr_region == 1:
                print(f"[告警] 检测到违规进入,跟踪ID: {track_id}")
                cv2.putText(frame, "UNAUTHORIZED ENTRY!", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)

    # 绘制门线便于可视化
    cv2.line(frame, line_start, line_end, (0,255,0), 2)
    cv2.imshow("Door Monitor", frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

优化建议

  • 场景校准:首次部署时需反复调整门线坐标,确保区域划分准确,避免因边界模糊导致误判。
  • 遮挡处理:若门附近有遮挡物,可延长轨迹判断窗口(如连续3帧确认方向一致),降低误报率。
  • 光照适配:室外门需考虑昼夜光照差异,可使用红外摄像头,或在检测前添加图像增强(如直方图均衡化)预处理。
  • 模型选型:优先选择轻量型检测模型(如YOLOv8n)搭配高效跟踪算法(如ByteTrack),保证实时性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:15:35