当前位置: 首页 > news >正文

猫咪如厕检测与分类识别系统系列【九】视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【上】

前情提要


家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如厕习惯,我计划搭建一个基于视频监控和AI识别的系统,自动识别猫咪进出厕所的行为,记录如厕时间和停留时长,并区分不同猫咪。这样即使我不在家,也能掌握猫咪的健康状态,更安心地照顾它们。
🎓 各位的关注与点赞是我持续分享的最大动力,衷心感谢大家的支持!
📢 欢迎正在攻读硕博学位的同学,或是对人工智能充满热情的朋友们,关注我的个人公众号。在这里,我将持续更新博士期间阅读的前沿论文解读、项目实战经验分享,以及我对AI技术趋势的思考与探讨。
✨ 无论你是科研工作者、工程开发者,还是AI初学者,都能在这里找到干货与灵感。让我们一起交流、成长、探索人工智能的无限可能!
在这里插入图片描述

已完成工作:

✅猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
✅猫咪如厕检测与分类识别系统系列【二】多图上传及猫咪分类特征提取更新
✅猫咪如厕检测与分类识别系统系列【三】 融合yolov11目标检测
✅猫咪如厕检测与分类识别系统系列【四】融合检测日志输出及前端展示界面制作
✅猫咪如厕检测与分类识别系统系列【五】信息存储数据库改进+添加猫咪页面制作+猫咪躯体匹配算法架构更新
✅猫咪如厕检测与分类识别系统系列【六】分类模型训练+混合检测分类+未知目标自动更新

✅猫咪如厕检测与分类识别系统系列【七】 当前阶段总结报告

✅猫咪如厕检测与分类识别系统系列【八】 检测推理事件整合+视频推流架构分析

计划工作:

✅ 猫咪管理功能:已完成猫咪照片上传与名称登记模块。
✅ 多图上传与分类特征提取:已支持批量上传猫咪图像并自动更新个体特征库。
✅ 目标检测与事件识别集成(YOLOv11): 基本实现
🔄 检测区域绘制功能:进行中,计划支持用户自定义如厕检测区域。
🔄 事件行为记录模块:进行中,将实现如厕进出时间、停留时长等事件记录功能。
⏳ 检测结果推流展示:进行中,计划支持算法结果实时推流。本章将实现页面MJPEG推理
⏳ 整体运行结果推流整合:待更新,计划集成检测图像与系统状态为统一视频流输出。


本小节将添加一个交互式区域标注功能 ,让你在前端网页上手动框选如厕区域,然后保存坐标用于检测。


在这里插入图片描述

✅ 实现方案

🔧 前端功能(HTML + JS)

  • 展示当前摄像头帧(或静态图)

  • 鼠标拖动绘制矩形框

  • 显示框的坐标 (x1, y1, x2, y2)

  • 提交后将坐标发送给 Flask 后端

🔧 后端 Flask

  • 接收坐标并保存为配置文件(如 region.json

  • inference.py 在启动时读取区域配置用于判断


🎯 示例页面流程

GET /set-region     → 展示摄像头图并支持标框
POST /set-region    → 提交区域坐标保存

  • /set-region 页面:可交互设置区域

  • 保存为 config/region.json

  • CatDetector 自动加载该区域

✅ 第一步:自动截图一帧用于标注

添加一个 Flask 路由 /snapshot,它会:

  • 从当前摄像头或 RTSP 获取一帧

  • 保存为 static/snapshot.jpg

  • 用作标注背景图


✅ 第二步:创建 /set-region 前端页面

  • 显示 snapshot.jpg

  • 鼠标框选区域

  • 显示坐标

  • 点击保存后写入 config/region.json


✅ 已完成后端部分:


✅ 说明

路由功能
/snapshot从摄像头读取一帧并保存为 static/snapshot.jpg
/set-region打开前端页面进行手动框选区域
/save-region接收 POST 坐标并保存为 config/region.json

🔜 下一步

添加对应的前端页面 templates/set_region.html,包含:

  • 显示图像

  • 鼠标框选

  • 提交保存区域坐标

✅ 前端标注页面 set_region.html 功能包括:

  1. 打开浏览器访问:http://localhost:5000/snapshot
  • 自动截取一帧作为标注背景
  1. 然后访问:http://localhost:5000/set-region
  • 鼠标拖动标记区域

  • 点击 “保存区域” 将坐标保存到 config/region.json

  1. 后续在 CatDetector 中读取并使用区域:
with open("config/region.json") as f:self.toilet_region = tuple(json.load(f).values())

然后在 CatDetector 中加上自动读取 region.json 的功能?这样可以完全替代硬编码区域 (100, 100, 400, 400)inference.py 自动加载区域配置的集成


📌 区域设置逻辑更新如下:

  • 启动时尝试读取 config/region.json

  • 如果存在 → 使用手动标注区域

  • 如果不存在 → 使用默认区域 (100, 100, 400, 400) 并打印警告


🚀 现在完整使用流程:

  1. 打开摄像头截图:http://localhost:5000/snapshot

  2. 打开手动标注:http://localhost:5000/set-region

  3. 框选区域并保存

  4. 系统将自动加载你框出的区域用于如厕判断


<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>设置如厕区域</title><style>canvas { border: 2px solid #333; cursor: crosshair; }#coords { margin-top: 10px; font-weight: bold; }</style>
</head>
<body>
<h2>🐱 设置如厕区域</h2>
<canvas id="canvas"></canvas>
<div id="coords">区域: (x1, y1) → (x2, y2)</div>
<button onclick="saveRegion()">保存区域</button><script>
const img = new Image();
img.src = "/static/snapshot.jpg";
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');let startX, startY, endX, endY, isDrawing = false;img.onload = () => {canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0);
};canvas.onmousedown = (e) => {isDrawing = true;startX = e.offsetX;startY = e.offsetY;
};canvas.onmousemove = (e) => {if (!isDrawing) return;endX = e.offsetX;endY = e.offsetY;ctx.drawImage(img, 0, 0);ctx.strokeStyle = 'red';ctx.lineWidth = 2;ctx.strokeRect(startX, startY, endX - startX, endY - startY);document.getElementById('coords').innerText = `区域: (${startX}, ${startY}) → (${endX}, ${endY})`;
};canvas.onmouseup = () => isDrawing = false;function saveRegion() {const region = {x1: Math.min(startX, endX),y1: Math.min(startY, endY),x2: Math.max(startX, endX),y2: Math.max(startY, endY)};fetch('/save-region', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(region)}).then(res => res.json()).then(data => {alert('✅ 区域保存成功!');});
}
</script>
</body>
</html>

可以将该文件保存为 templates/set_region.html。访问 /snapshot 截图后,再访问 /set-region 进行区域标注。
接下来实现在一个页面上 输入地址,然后截图,然后选择坐标,流程如下

✅ 输入 RTSP 地址

✅ 点击「截图」抓取摄像头画面

✅ 鼠标框选如厕区域

✅ 保存区域坐标
全部集成到 一个前端页面 中,交互非常清晰!


✅ 页面结构设计

功能区域描述
📥 输入框手动填写 RTSP 地址
🎬 截图按钮请求后端从该地址截图
🖼️ 图像显示区显示截图并支持框选区域
💾 保存按钮提交所框选的坐标(保存为 region.json)

🧪 使用方式:

  1. 访问 /set-region

  2. 输入 RTSP 地址(或摄像头路径)

  3. 点击【📸 截图】,自动生成并显示图片

  4. 用鼠标框选区域,点击【保存区域】

  5. 坐标将保存在 config/region.json


🧠 inference.py 会自动加载 region.json 并使用你选定的区域进行判断。
你现在已经拥有前端交互设置 + 实时应用识别 的完整闭环了!刚刚已经实现了手动标注如厕区域并保存为 config/region.json,现在你只需要确保 CatDetector 自动读取这个配置。


之前的 inference.py 中已经包含了这个逻辑 ✅:

def _load_region(self):try:with open("config/region.json") as f:data = json.load(f)return (data['x1'], data['y1'], data['x2'], data['y2'])except Exception as e:print("⚠️ 无法加载区域配置,使用默认区域 (100, 100, 400, 400)")return (100, 100, 400, 400)

只需要在 __init__ 中有这行就可以:

self.toilet_region = self._load_region()

最后,只要保证:

self.toilet_region = self._load_region()

就能让系统自动加载你刚刚前端标注并保存的区域了。



http://www.mrgr.cn/news/98747.html

相关文章:

  • Web三漏洞学习(其二:sql注入)
  • 树莓派超全系列教程文档--(28)boot文件夹内容
  • 【论文阅读】UniAD: Planning-oriented Autonomous Driving
  • 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?
  • 华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 【Java学习笔记】运算符
  • oracle查询锁表和解锁
  • 理解计算篇--正则表达式转NFA--理论部分
  • 【Java学习笔记】数据类型转换
  • Linux-ftp tftp vsftpd区别
  • 11-算法打卡-链表-删除链表的倒数第N个节点-leetcode(19)-第十一天
  • Redis高频面试题(含答案)
  • uniapp-商城-27-vuex 通用方法
  • MGR实现mysql高可用性
  • 4G/5G模组----概念+驱动+调试
  • 【八股】计算机网络
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(5):できます 完成了等 しか。。。ない 只有
  • 什么是进程?
  • 【回眸】Tessy集成测试软件使用指南(一)新手使用篇
  • 【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba)