在施工工地围墙处安装摄像头,在系统内设定警戒区域,通过监管平台设定监管对象(人或其他物体),一旦发现可疑人员翻越围墙,系统会自动发出报警信息,并联动现场的声光报警装置,向可疑人员发出驱离警告。 通过安防监控摄像头监测围墙周围是否有人员进出攀爬、翻越,当发现攀爬、翻越行为时,系统及时触发告警。 在操场、教学大楼等部位设立该报警模式。 当区域内人群密度达到系统预定值后,系统会触发告警。

对此我们基于 黑匣HEX边缘计算设备 写了一个摄像头行人越界检测项目
此项目只是简单的视频报警提示,可以用串口模块对接喇叭进行语音警告
项目代码如下

-- 行人范围检测配置
local CONFIG = {
    CAMERA_ID = 0,          -- 摄像头ID
    CAMERA_TYPE = 0,        -- 采集类型
    CAMERA_RES = 640,       -- 采集分辨率
    MODEL_PATH = "yolov5cs.rknn",  -- 模型路径
    NUM_CLASSES = 2,        -- 类别数
    CONF_THRESH = 0.45,     -- 置信度阈值
    NMS_THRESH = 0.25,      -- NMS阈值
    MAX_DETECTIONS = 100,   -- 最大检测数
    SAFE_AREA = {           -- 安全区域范围(可根据实际调整)
        x_min = 50,
        x_max = 270,
        y_min = 50,
        y_max = 270
    },
    FONT_SCALE = 0.5,       -- 字体大小
    FONT_THICKNESS = 1,     -- 字体粗细
    REFRESH_RATE = 0.001,     -- 刷新率(秒)
    WARNING_COLOR = {255, 0, 0},    -- 警告颜色(红色)
    SAFE_COLOR = {0, 255, 0},       -- 安全颜色(绿色)
    BOUNDARY_COLOR = {255, 255, 0}  -- 边界颜色(黄色)
}

-- 初始化摄像头和模型
local function initialize()
    local camera_ok = CameraInit(CONFIG.CAMERA_ID, CONFIG.CAMERA_TYPE, CONFIG.CAMERA_RES)
    if not camera_ok then
        print("Error: Failed to initialize camera")
        return false
    end
    
    local model_ok = YoloLoadModel(CONFIG.MODEL_PATH, CONFIG.NUM_CLASSES)
    if not model_ok then
        print("Error: Failed to load model")
        return false
    end
    
    print("System initialized successfully")
    return true
end



-- 检测行人是否在安全区域内
local function is_in_safe_area(detection)
    local center_x = detection.box_x + detection.box_w / 2
    local center_y = detection.box_y + detection.box_h / 2
    
    return center_x >= CONFIG.SAFE_AREA.x_min and 
           center_x <= CONFIG.SAFE_AREA.x_max and
           center_y >= CONFIG.SAFE_AREA.y_min and 
           center_y <= CONFIG.SAFE_AREA.y_max
end

-- 主检测循环
local function run_detection()
    if not initialize() then return end
    
    local warning_triggered = false
    local last_warning_time = 0
    local warning_cooldown = 3  -- 警告冷却时间(秒)
    
    while true do
        local start_time = getMicroTime()
        
        -- 获取帧并进行检测
        local frame = CameraGetLatestFrameSquare()
        local detections = YoloDetectImg(frame, CONFIG.NMS_THRESH, CONFIG.CONF_THRESH, CONFIG.MAX_DETECTIONS)
        
        local in_safe_area_count = 0
        local total_pedestrians = 0
        
        -- 处理检测结果
        if detections and #detections > 0 then
            for i, det in ipairs(detections) do
                -- 只处理行人类别(假设行人cls_id=0,根据实际模型调整)
                if det.cls_id == 0 then
                    total_pedestrians = total_pedestrians + 1
                    local in_safe = is_in_safe_area(det)
                    
                    -- 更新安全区域内人数统计
                    if in_safe then
                        in_safe_area_count = in_safe_area_count + 1
                    end
                    
                    -- 设置框颜色和标签
                    local color, label
                    if in_safe then
                        color = CONFIG.WARNING_COLOR
                        label = string.format("WARNING! %d", in_safe_area_count)
                    else
                        color = CONFIG.SAFE_COLOR
                        label = "SAFE"
                    end
                    
                    -- 绘制检测框
                    drawRectangle(frame, det.box_x, det.box_y, det.box_w, det.box_h, 
                                color[1], color[2], color[3], 2)
                    
                    -- 在框上方绘制标签
                    drawText(frame, label, 
                            det.box_x, det.box_y - 5, 
                            CONFIG.FONT_SCALE, 
                            color[1], color[2], color[3], 
                            CONFIG.FONT_THICKNESS)
                    
                    -- 打印检测信息
                    print(string.format("Pedestrian[%d]: confidence=%.3f, box=(%d,%d,%d,%d), in_safe_area=%s",
                        i, det.prop, det.box_x, det.box_y, det.box_w, det.box_h,
                        tostring(in_safe)))
                end
            end
        end
        
        -- 触发警告逻辑
        local current_time = getMilliTime()
        if in_safe_area_count > 0 then
            if not warning_triggered or (current_time - last_warning_time) >= warning_cooldown then
                print(string.format("WARNING! %d person(s) entered restricted area!", in_safe_area_count))
                warning_triggered = true
                last_warning_time = current_time
            end
        else
            warning_triggered = false
        end
        
        -- 在画面顶部显示统计信息
        local stats_text = string.format("Total: %d | In Restricted Area: %d", 
                                       total_pedestrians, in_safe_area_count)
        drawText(frame, stats_text, 10, 20, CONFIG.FONT_SCALE, 
                255, 255, 255, CONFIG.FONT_THICKNESS)
        
        -- 绘制安全区域边界
        drawRectangle(frame, 
            CONFIG.SAFE_AREA.x_min, CONFIG.SAFE_AREA.y_min,
            CONFIG.SAFE_AREA.x_max - CONFIG.SAFE_AREA.x_min,
            CONFIG.SAFE_AREA.y_max - CONFIG.SAFE_AREA.y_min,
            CONFIG.BOUNDARY_COLOR[1], CONFIG.BOUNDARY_COLOR[2], CONFIG.BOUNDARY_COLOR[3], 2)
        
        -- 计算处理时间
        local end_time = getMicroTime()
        local process_time = (end_time - start_time) / 1000
        print(string.format("Detection time: %.2fms", process_time))
        
        -- -- 显示结果
        -- imshow("Pedestrian Detection", frame)
        -- waitKey(1)
        StreamPushFrame(frame)
        sleep(CONFIG.REFRESH_RATE)
    end
end
StartMJPEGServer(5656)
-- 启动检测
run_detection()
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐