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

前情提要


家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如厕习惯,我计划搭建一个基于视频监控和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.mzph.cn/news/901865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI插件开发】Notepad++ AI插件开发实践:支持多平台多模型

引言 上篇文章我们的Notepad插件介绍到Dock窗口集成&#xff0c;本篇将继续完善插件功能&#xff0c;主要包括两个部分&#xff1a; 支持多平台、多模型支持多种授权验证、接口类型 一、多平台 原先的配置项很简单&#xff1a; // PluginConf.h class PlatformConf { publ…

【C#】Socket通信的使用

在C#中&#xff0c;Socket通信是一种用于实现网络通信的底层技术。通过Socket&#xff0c;程序可以在网络上与其他设备进行数据交换。以下是如何使用C#中的System.Net.Sockets命名空间来实现Socket通信的详细步骤。 1. Socket通信的基本概念 Socket: 一个Socket是网络通信的端…

2024年第九届团队程序设计天梯赛c++题解L1-L3-1(附PTA网址)

L1-1 编程解决一切 5分 L1-097 编程解决一切 - 团体程序设计天梯赛-练习集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验

▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计&#xff0c;一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率&#xff0c;可以想象这样一条 0-1 的数轴&#xff0c;数轴上的每一段相当于一种商品&#xff0c;概率之和为1。 抽奖时&#xff0c;我们会生…

OpenCV 图形API(43)颜色空间转换-----将 BGR 图像转换为 LUV 色彩空间函数BGR2LUV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为LUV色彩空间。 该函数将输入图像从BGR色彩空间转换为LUV。B、G和R通道值的传统范围是0到255。 输出图像必须是8位无符…

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…

维港首秀!沃飞长空AE200亮相香港特别行政区

4月13日-16日&#xff0c;第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂&#xff0c;沃飞长空携旗下AE200批产构型登陆国际舞台&#xff0c;以前瞻性的创新技术与商业化应用潜力&#xff0c;吸引了来自全球17个国家及地区的行业领袖…

Openfein实现远程调用的方法(实操)

文章目录 环境准备一、URL中接收参数二、接收一个参数三、接收多个参数四、传递对象五、传递JSON格式数据 环境准备 下面的配置&#xff0c;服务调用方加入即可。 依赖导入&#xff1a; <!-- openfeign依赖--><dependency><groupId>org.springframe…

Bright+Data网页解锁器:旅游行业数据革命的“隐形引擎”

在数字经济浪潮中&#xff0c;旅游行业正经历前所未有的变革。当消费者指尖滑动间完成跨国酒店预订&#xff0c;当航空公司每秒调整万次舱位价格&#xff0c;背后是一场无声的数据战争。而在这场战争中&#xff0c;BrightData网页解锁器正成为旅游企业破局的关键武器——它像一…

OpenCV 图形API(38)图像滤波-----Sobel 算子操作函数Sobel()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::gapi::Sobel 函数是 OpenCV 的 G-API 模块中用于执行 Sobel 算子操作的一个函数&#xff0c;主要用于图像的边缘检测。Sobel 算子通过计算图…

CS5346 - Interactivity in Visualization 可视化中的交互

文章目录 Visualization representation interactionInteraction &#xff08;交互&#xff09;Benefits (好处)Typical Interaction Techniques&#xff08;交互技术&#xff09;SelectFilteringAbstract / Elaborate几何放缩&#xff08;Geometric zoom)语义放缩&#xff0…

第十六届蓝桥杯大赛软件赛省赛 C++ 大学 B 组 部分题解

赛时参加的是Python组&#xff0c;这是赛后写的题解&#xff0c;还有两题暂时还不会&#xff0c;待更新 题目链接题目列表 - 洛谷 | 计算机科学教育新生态 A 移动距离 答案&#xff1a;1576 C 可分解的正整数 Python3 import itertools from functools import cmp_to_ke…

Vue 解决 Error: please transfer a valid prop path to form item!

在 Vue.js 中使用表单验证库&#xff08;如 VeeValidate 或 Element UI 的表单组件时&#xff09;&#xff0c;遇到错误信息 "please transfer a valid prop path to form item!" 通常指的是在表单项的属性绑定中&#xff0c;路径&#xff08;prop path&#xff09;不…

在 Visual Studio Code 中安装通义灵码 - 智能编码助手

高效的编码工具对于提升开发效率和代码质量至关重要。 通义灵码作为一款智能编码助手&#xff0c;为开发者提供了全方位的支持。 本文将详细介绍如何在 Visual Studio Code&#xff08;简称 VSCode&#xff09;中安装通义灵码&#xff0c;以及如何进行相关配置以开启智能编码…

SQL 解析 with as dual sysdate level

目录 sql的运行顺序 with as EXTRACT ​编辑 dual sysdate level ​编辑 ​编辑 Oracle中的日期存储 核心部分 拆解字符串并计算最小值 关联子查询 NVL 函数 REGEXP_SUBSTR() sql的运行顺序 <select id="getTrendList" parameterType="java.uti…

快手OneRec 重构推荐系统:从检索排序到生成统一的跃迁

文章目录 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成会话列表2.4 利用奖励模型进行迭代偏好对齐2.4.1 训练奖励模型2.4.2 迭代偏好对齐 3. 总结 昨天面试的时候聊到了OneRec&#xff0c;但是由于上次看这篇文章已经是一个月之前&#xff0c;忘得差不多了&#xff0c…

软考高级系统架构设计师-第11章 系统架构设计

【本章学习建议】 根据考试大纲&#xff0c;本章不仅考查系统架构设计师单选题&#xff0c;预计考12分左右&#xff0c;而且案例分析和论文写作也是必考&#xff0c;对应第二版教材第7章&#xff0c;属于重点学习的章节。 软考高级系统架构设计师VIP课程https://edu.csdn.net/…

selenium之文件下载

Selenium 自动化测试&#xff1a;轻松搞定文件下载 在 Web 自动化测试中&#xff0c;经常会遇到需要验证文件下载功能的场景。例如&#xff0c;测试报告的导出、用户上传文件的下载、PDF 文档的生成与下载等等。Selenium 本身并没有直接处理文件下载的内置方法&#xff0c;但我…

基于迁移学习实现肺炎X光片诊断分类

大家好&#xff0c;我是带我去滑雪&#xff01; 肺炎是全球范围内致死率较高的疾病之一&#xff0c;尤其是在老年人、免疫系统较弱的患者群体中&#xff0c;更容易引发严重并发症。传统上&#xff0c;肺炎的诊断依赖于医生的临床经验以及影像学检查&#xff0c;尤其是X光片&…