1a135cdda7
支持本地视频测试
72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
# app.py
|
|
import streamlit as st
|
|
import cv2
|
|
from datetime import datetime
|
|
from fish_tracker import FishTracker
|
|
from history_manager import FishHistoryManager
|
|
|
|
|
|
def main():
|
|
st.set_page_config(layout="wide")
|
|
st.title("🐟 观赏鱼健康监控系统(笔记本版)")
|
|
|
|
# 初始化模型(只加载一次)
|
|
if 'tracker' not in st.session_state:
|
|
st.session_state.tracker = FishTracker()
|
|
if 'history' not in st.session_state:
|
|
st.session_state.history = FishHistoryManager()
|
|
|
|
tracker = st.session_state.tracker
|
|
history = st.session_state.history
|
|
|
|
# 视频显示区域
|
|
frame_placeholder = st.empty()
|
|
alert_placeholder = st.empty()
|
|
report_placeholder = st.empty()
|
|
|
|
# 打开摄像头
|
|
cap = cv2.VideoCapture(0)
|
|
if not cap.isOpened():
|
|
st.error("❌ 无法打开摄像头,请检查设备权限。")
|
|
return
|
|
|
|
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
|
|
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
|
|
|
|
try:
|
|
while True:
|
|
ret, frame = cap.read()
|
|
if not ret:
|
|
st.warning("摄像头读取失败")
|
|
break
|
|
|
|
# 处理帧
|
|
output_frame, alerts, track_stats = tracker.process_frame(frame)
|
|
|
|
now = datetime.now()
|
|
history.update(track_stats, now)
|
|
report_path = history.maybe_generate_report(now)
|
|
|
|
# 转为 RGB 显示(Streamlit 要求)
|
|
rgb_frame = cv2.cvtColor(output_frame, cv2.COLOR_BGR2RGB)
|
|
frame_placeholder.image(rgb_frame, channels="RGB", width="stretch")
|
|
|
|
# 显示告警
|
|
if alerts:
|
|
alert_text = "\n\n".join(alerts)
|
|
alert_placeholder.warning(alert_text)
|
|
else:
|
|
alert_placeholder.empty()
|
|
|
|
# 显示报告生成信息
|
|
if report_path:
|
|
report_placeholder.success(f"✅ 今日报告已生成:{report_path}")
|
|
|
|
except KeyboardInterrupt:
|
|
pass
|
|
finally:
|
|
cap.release()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |