甘肃省网站建设_网站建设公司_HTTPS_seo优化
2025/12/21 15:13:05 网站建设 项目流程

我来帮你开发这个家庭宠物行为监测工具。这是一个结合智能视觉技术的综合项目,我会提供模块化代码、文档和知识点总结。

代码实现

项目结构

pet_monitor/

├── config.py # 配置文件

├── capture.py # 图像采集模块

├── detector.py # 行为识别模块

├── analyzer.py # 行为分析模块

├── reporter.py # 报告生成模块

├── notifier.py # 推送模块

├── main.py # 主程序

└── requirements.txt # 依赖文件

核心代码

# config.py - 配置文件

import os

class Config:

# 摄像头配置

CAMERA_ID = 0

FRAME_WIDTH = 640

FRAME_HEIGHT = 480

# YOLO模型配置

MODEL_PATH = "yolov8n.pt"

CONF_THRESHOLD = 0.5

# 行为识别类别 (COCO数据集)

PET_CLASSES = ['cat', 'dog']

FOOD_BOWL_CLASS = 'bowl'

WATER_BOWL_CLASS = 'cup' # 用水杯代表水盆

ACTIVITY_ZONE_CLASS = 'chair' # 用椅子代表活动区域

# 行为判定阈值

EATING_DURATION = 3 # 进食持续3秒以上

DRINKING_DURATION = 2 # 饮水持续2秒以上

# 报告配置

REPORT_INTERVAL = 3600 # 1小时生成一次报告

STATS_WINDOW = 86400 # 24小时统计数据

# 邮件推送配置

SMTP_SERVER = "smtp.qq.com"

SMTP_PORT = 587

SENDER_EMAIL = "your_email@qq.com"

SENDER_PASSWORD = "your_auth_code"

RECEIVER_EMAIL = "receiver@qq.com"

# capture.py - 图像采集模块

import cv2

from config import Config

class CameraCapture:

def __init__(self):

self.cap = None

def start_capture(self):

"""启动摄像头采集"""

try:

self.cap = cv2.VideoCapture(Config.CAMERA_ID)

self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, Config.FRAME_WIDTH)

self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, Config.FRAME_HEIGHT)

if not self.cap.isOpened():

raise Exception("无法打开摄像头")

return True

except Exception as e:

print(f"摄像头启动失败: {e}")

return False

def get_frame(self):

"""获取一帧图像"""

if self.cap and self.cap.isOpened():

ret, frame = self.cap.read()

return frame if ret else None

return None

def stop_capture(self):

"""停止采集"""

if self.cap:

self.cap.release()

# detector.py - 行为识别模块

from ultralytics import YOLO

import cv2

from config import Config

class BehaviorDetector:

def __init__(self):

self.model = YOLO(Config.MODEL_PATH)

self.class_names = self.model.names

def detect_objects(self, frame):

"""检测图像中的物体"""

try:

results = self.model(frame, conf=Config.CONF_THRESHOLD)

detections = []

for result in results:

boxes = result.boxes

if boxes is not None:

for box in boxes:

x1, y1, x2, y2 = box.xyxy[0].cpu().numpy()

conf = box.conf[0].cpu().numpy()

cls = int(box.cls[0].cpu().numpy())

class_name = self.class_names[cls]

detections.append({

'bbox': [int(x1), int(y1), int(x2), int(y2)],

'confidence': float(conf),

'class': class_name,

'class_id': cls

})

return detections

except Exception as e:

print(f"目标检测失败: {e}")

return []

# analyzer.py - 行为分析模块

import time

from collections import defaultdict

class BehaviorAnalyzer:

def __init__(self):

self.pet_status = {} # 宠物状态跟踪

self.behavior_log = [] # 行为日志

self.last_cleanup = time.time()

def analyze_behaviors(self, detections, timestamp):

"""分析宠物行为"""

behaviors = []

pet_boxes = [d for d in detections if d['class'] in ['cat', 'dog']]

food_boxes = [d for d in detections if d['class'] == 'bowl']

water_boxes = [d for d in detections if d['class'] == 'cup']

activity_boxes = [d for d in detections if d['class'] == 'chair']

# 分析每只宠物的行为

for pet in pet_boxes:

pet_id = f"{pet['class']}_{timestamp}"

behavior = self._check_pet_behavior(pet, food_boxes, water_boxes, activity_boxes, timestamp)

if behavior:

behaviors.append(behavior)

self.behavior_log.append({

'timestamp': timestamp,

'pet_type': pet['class'],

'behavior': behavior['type'],

'duration': behavior.get('duration', 0)

})

return behaviors

def _check_pet_behavior(self, pet, food_boxes, water_boxes, activity_boxes, timestamp):

"""检查单个宠物的具体行为"""

px1, py1, px2, py2 = pet['bbox']

pet_center = ((px1 + px2) // 2, (py1 + py2) // 2)

# 检查进食行为

for bowl in food_boxes:

bx1, by1, bx2, by2 = bowl['bbox']

bowl_center = ((bx1 + bx2) // 2, (by1 + by2) // 2)

if self._is_near(pet_center, bowl_center, threshold=80):

key = f"eating_{pet['class']}"

current_time = time.time()

if key not in self.pet_status:

self.pet_status[key] = {'start_time': current_time, 'count': 0}

elif current_time - self.pet_status[key]['start_time'] >= Config.EATING_DURATION:

self.pet_status[key]['count'] += 1

self.pet_status[key]['start_time'] = current_time

return {'type': 'eating', 'pet': pet['class'], 'duration': Config.EATING_DURATION}

# 检查饮水行为(类似进食逻辑)

for cup in water_boxes:

cx1, cy1, cx2, cy2 = cup['bbox']

cup_center = ((cx1 + cx2) // 2, (cy1 + cy2) // 2)

if self._is_near(pet_center, cup_center, threshold=60):

key = f"drinking_{pet['class']}"

current_time = time.time()

if key not in self.pet_status:

self.pet_status[key] = {'start_time': current_time, 'count': 0}

elif current_time - self.pet_status[key]['start_time'] >= Config.DRINKING_DURATION:

self.pet_status[key]['count'] += 1

self.pet_status[key]['start_time'] = current_time

return {'type': 'drinking', 'pet': pet['class'], 'duration': Config.DRINKING_DURATION}

# 检查活动行为

for chair in activity_boxes:

chx1, chy1, chx2, chy2 = chair['bbox']

if px1 > chx1 and px2 < chx2 and py1 > chy1 and py2 < chy2:

return {'type': 'activity', 'pet': pet['class'], 'location': 'activity_zone'}

return None

def _is_near(self, point1, point2, threshold=50):

"""判断两点距离是否小于阈值"""

import math

distance = math.sqrt((point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)

return distance < threshold

def get_statistics(self, window_seconds=86400):

"""获取统计信息"""

from datetime import datetime, timedelta

cutoff_time = time.time() - window_seconds

recent_logs = [log for log in self.behavior_log if log['timestamp'] > cutoff_time]

stats = defaultdict(lambda: defaultdict(int))

for log in recent_logs:

pet_type = log['pet_type']

behavior = log['behavior']['type']

stats[pet_type][behavior] += 1

return dict(stats)

# reporter.py - 报告生成模块

import pandas as pd

from datetime import datetime

from config import Config

class ReportGenerator:

def generate_daily_report(self, stats):

"""生成日报"""

report_lines = []

report_lines.append("=== 家庭宠物行为监测日报 ===")

report_lines.append(f"报告时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

report_lines.append("")

for pet_type, behaviors in stats.items():

report_lines.append(f"【{pet_type.upper()}】")

total_events = sum(behaviors.values())

report_lines.append(f"总行为次数: {total_events}")

for behavior, count in behaviors.items():

percentage = (count / total_events * 100) if total_events > 0 else 0

report_lines.append(f"- {behavior}: {count}次 ({percentage:.1f}%)")

report_lines.append("")

return "\n".join(report_lines)

def save_report_csv(self, stats, filename="pet_behavior_report.csv"):

"""保存CSV格式报告"""

data = []

for pet_type, behaviors in stats.items():

for behavior, count in behaviors.items():

data.append({'pet_type': pet_type, 'behavior': behavior, 'count': count})

df = pd.DataFrame(data)

df.to_csv(filename, index=False, encoding='utf-8-sig')

return filename

# notifier.py - 推送模块

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from config import Config

class EmailNotifier:

def send_report(self, report_content, subject="宠物行为监测报告"):

"""发送邮件报告"""

try:

msg = MIMEMultipart()

msg['From'] = Config.SENDER_EMAIL

msg['To'] = Config.RECEIVER_EMAIL

msg['Subject'] = subject

body = MIMEText(report_content, 'plain', 'utf-8')

msg.attach(body)

server = smtplib.SMTP(Config.SMTP_SERVER, Config.SMTP_PORT)

server.starttls()

server.login(Config.SENDER_EMAIL, Config.SENDER_PASSWORD)

server.sendmail(Config.SENDER_EMAIL, Config.RECEIVER_EMAIL, msg.as_string())

server.quit()

return True

except Exception as e:

print(f"邮件发送失败: {e}")

return False

# main.py - 主程序

import time

from capture import CameraCapture

from detector import BehaviorDetector

from analyzer import BehaviorAnalyzer

from reporter import ReportGenerator

from notifier import EmailNotifier

from config import Config

def main():

# 初始化模块

camera = CameraCapture()

detector = BehaviorDetector()

analyzer = BehaviorAnalyzer()

reporter = ReportGenerator()

notifier = EmailNotifier()

# 启动摄像头

if not camera.start_capture():

print("无法启动摄像头,程序退出")

return

print("宠物行为监测系统启动成功!")

last_report_time = time.time()

try:

while True:

# 获取帧

frame = camera.get_frame()

if frame is None:

continue

# 目标检测

detections = detector.detect_objects(frame)

# 行为分析

current_time = time.time()

behaviors = analyzer.analyze_behaviors(detections, current_time)

# 定期生成报告

if current_time - last_report_time >= Config.REPORT_INTERVAL:

stats = analyzer.get_statistics(Config.STATS_WINDOW)

report = reporter.generate_daily_report(stats)

reporter.save_report_csv(stats)

# 发送邮件

if notifier.send_report(report):

print(f"报告已发送: {time.strftime('%Y-%m-%d %H:%M:%S')}")

else:

print("报告发送失败")

last_report_time = current_time

# 显示实时信息(可选)

if behaviors:

print(f"检测到行为: {[b['type'] for b in behaviors]}")

time.sleep(0.1) # 控制循环频率

except KeyboardInterrupt:

print("程序被用户中断")

finally:

camera.stop_capture()

print("程序已退出")

if __name__ == "__main__":

main()

# requirements.txt

opencv-python>=4.5.0

ultralytics>=8.0.0

pandas>=1.3.0

README文件

家庭宠物行为监测工具

这是一个基于智能视觉技术的家庭宠物行为监测系统,能够自动识别宠物的进食、饮水和活动情况,并生成健康报告推送给主人。

项目特色

- 智能识别:使用YOLOv8深度学习模型识别宠物行为

- 实时监控:24小时不间断监测宠物活动状态

- 健康报告:自动生成日报,统计行为频率和时长

- 远程推送:通过邮件发送分析报告到手机

安装部署

1. 克隆项目并安装依赖

pip install -r requirements.txt

2. 下载YOLOv8模型文件到项目目录

3. 配置config.py文件

- 设置摄像头ID和分辨率

- 配置邮箱SMTP信息

- 调整行为识别阈值

使用方法

python main.py

系统将自动启动摄像头,开始监测宠物行为。每小时生成一次报告并发送到指定邮箱。

模块说明

- capture.py:摄像头图像采集

- detector.py:YOLO目标检测识别

- analyzer.py:行为分析和状态跟踪

- reporter.py:健康报告生成

- notifier.py:邮件推送服务

注意事项

- 确保摄像头正常工作且有足够光线

- 首次使用需要训练宠物适应摄像头环境

- 邮箱需开启SMTP服务并获取授权码

使用说明

系统启动后将自动执行以下流程:图像采集→目标检测→行为分析→数据统计→报告生成→邮件推送。

关键配置参数说明:EATING_DURATION控制进食判定时长,CONF_THRESHOLD调整检测精度,REPORT_INTERVAL设置报告频率。建议根据实际环境微调阈值以获得最佳效果。

如需扩展功能,可在analyzer.py中添加新行为类型,或在reporter.py中自定义报告格式。系统支持多种宠物类型识别,可通过修改PET_CLASSES配置添加新宠物品种。

核心知识点卡片

智能视觉技术应用

- 目标检测:YOLOv8模型实时识别宠物、食盆、水盆等物体

- 行为识别:基于空间位置关系判断进食、饮水、活动状态

- 图像预处理:摄像头采集与分辨率优化配置

模块化程序设计

- 单一职责:每个模块专注特定功能,便于维护扩展

- 接口清晰:标准化数据传递格式,降低耦合度

- 异常处理:全面捕获硬件故障、网络异常等边界情况

行为数据分析算法

- 状态跟踪:记录宠物行为持续时间与频次

- 统计分析:计算行为占比、趋势变化等健康指标

- 时间窗口:支持自定义统计周期(日/周/月)

健康报告生成机制

- 数据聚合:整合多维度行为数据形成综合评估

- 可视化表达:结构化文本展示关键健康指标

- 自动化推送:定时邮件发送减少人工干预

系统集成技术

- 多线程协调:并行处理图像采集与分析任务

- 配置驱动:外部参数文件管理环境差异

- 跨平台兼容:支持Windows/Linux/macOS部署运行

关注我,有更多实用程序等着你!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询