基于黑匣HEX边缘计算设备的摄像头行人越界检测项目
在施工工地围墙处安装摄像头,在系统内设定警戒区域,通过监管平台设定监管对象(人或其他物体),一旦发现可疑人员翻越围墙,系统会自动发出报警信息,并联动现场的声光报警装置,向可疑人员发出驱离警告。通过安防监控摄像头监测围墙周围是否有人员进出攀爬、翻越,当发现攀爬、翻越行为时,系统及时触发告警。当区域内人群密度达到系统预定值后,系统会触发告警。对此我们基于 黑匣HEX边缘计算设备 写了一个摄像头行人越界
·
在施工工地围墙处安装摄像头,在系统内设定警戒区域,通过监管平台设定监管对象(人或其他物体),一旦发现可疑人员翻越围墙,系统会自动发出报警信息,并联动现场的声光报警装置,向可疑人员发出驱离警告。 通过安防监控摄像头监测围墙周围是否有人员进出攀爬、翻越,当发现攀爬、翻越行为时,系统及时触发告警。 在操场、教学大楼等部位设立该报警模式。 当区域内人群密度达到系统预定值后,系统会触发告警。
对此我们基于 黑匣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()
更多推荐
所有评论(0)