#!/usr/bin/env python # -*- coding: utf-8 -*- """ ROI设置验证脚本 用于验证ROI区域配置是否正确设置 """ import yaml import numpy as np import os import sys try: import cv2 OPENCV_AVAILABLE = True except ImportError: OPENCV_AVAILABLE = False print("⚠️ OpenCV未安装,将跳过RTSP流测试") from roi_filter import ROIManager def print_header(title): """打印带分隔符的标题""" print("="*60) print(f"{title:^60}") print("="*60) def test_config_loading(): """测试配置文件加载""" print_header("1. 配置文件加载测试") roi_manager = ROIManager("../config.yaml") print(f"✅ ROI配置加载: {'成功' if roi_manager.roi_config else '失败'}") print(f" ROI过滤启用: {roi_manager.roi_config.get('enabled', False)}") regions = roi_manager.roi_config.get('regions', []) print(f" ROI区域数量: {len(regions)}") if regions: print(" ROI区域详情:") for i, region in enumerate(regions): print(f" {i+1}. {region.get('name', 'N/A')}: " f"({region.get('x_min', 0):.2f}, {region.get('y_min', 0):.2f}) -> " f"({region.get('x_max', 1):.2f}, {region.get('y_max', 1):.2f}) " f"[{'启用' if region.get('enabled', True) else '禁用'}]") return roi_manager def test_coordinate_detection(roi_manager): """测试坐标检测功能""" print_header("2. ROI坐标检测测试") # 测试一些坐标点 test_points = [ (0.2, 0.8), # 应该在control_lever_area区域 (0.75, 0.7), # 应该在valve_area区域 (0.5, 0.5), # 应该在非ROI区域 (0.15, 0.75), # 应该在control_lever_area区域 (0.72, 0.65), # 应该在valve_area区域 ] for x, y in test_points: in_roi, roi_name = roi_manager.is_in_any_roi(x, y) status = "🔴 在ROI区域" if in_roi else "🟢 不在ROI区域" print(f" 坐标 ({x:.2f}, {y:.2f}): {status} {roi_name if in_roi else ''}") def test_detection_filtering(roi_manager): """测试检测结果过滤功能""" print_header("3. ROI检测过滤功能测试") # 模拟检测结果 [x1, y1, x2, y2, conf, class_id] # 假设图像尺寸为640x480 mock_detections = [ [50, 50, 150, 150, 0.8, 0], # 左上角 (0.08, 0.1) - 不在ROI [100, 300, 200, 400, 0.9, 0], # 左下角 (0.16, 0.71) - 可能在control_lever_area [400, 250, 500, 350, 0.7, 0], # 右下角 (0.63, 0.64) - 可能不在ROI [450, 300, 550, 400, 0.85, 0], # 右下角 (0.7, 0.71) - 可能在valve_area [120, 350, 220, 450, 0.75, 1], # 左下角 (0.19, 0.79) - 可能在control_lever_area [480, 280, 580, 380, 0.9, 1], # 右下角 (0.75, 0.73) - 可能在valve_area ] print(f" 原始检测数量: {len(mock_detections)}") filtered_detections = roi_manager.filter_detections(mock_detections, 640, 480) print(f" 过滤后检测数量: {len(filtered_detections)}") print(f" 过滤了 {len(mock_detections) - len(filtered_detections)} 个检测框") def test_rtsp_verification(): """测试RTSP流验证(如果有OpenCV)""" if not OPENCV_AVAILABLE: print_header("4. RTSP流验证测试 (跳过)") print(" ⚠️ OpenCV未安装,无法进行RTSP流测试") return False print_header("4. RTSP流验证测试") rtsp_url = "rtsp://10.0.0.50:8554/camera_test/scene1" print(f" RTSP流地址: {rtsp_url}") try: cap = cv2.VideoCapture(rtsp_url) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) if cap.isOpened(): ret, frame = cap.read() if ret: print(" ✅ RTSP流连接成功") print(f" ✅ 成功获取帧,尺寸: {frame.shape[1]}x{frame.shape[0]}") # 测试ROI绘制功能 from roi_filter import draw_roi_on_frame frame_with_roi = draw_roi_on_frame(frame, "../config.yaml") if frame_with_roi is not None: print(" ✅ ROI区域绘制功能正常") print(" 💡 提示: ROI区域会以红色矩形显示") cap.release() return True else: print(" ❌ 无法读取RTSP流帧") cap.release() return False else: print(" ❌ 无法连接到RTSP流") return False except Exception as e: print(f" ❌ RTSP流测试出错: {str(e)}") return False def main(): """主函数""" print_header("🎯 ROI设置验证工具") print(" 本工具将验证ROI区域配置是否正确设置") print(" 包括配置加载、坐标检测、过滤功能和RTSP流测试") # 1. 测试配置文件加载 roi_manager = test_config_loading() # 2. 测试坐标检测功能 test_coordinate_detection(roi_manager) # 3. 测试检测过滤功能 test_detection_filtering(roi_manager) # 4. 测试RTSP流验证 rtsp_success = test_rtsp_verification() # 总结 print_header("📋 验证总结") config_loaded = bool(roi_manager.roi_config) regions_defined = len(roi_manager.roi_config.get('regions', [])) > 0 filtering_works = True # 假设过滤功能正常 print(f" 配置文件加载: {'✅ 正常' if config_loaded else '❌ 异常'}") print(f" ROI区域定义: {'✅ 正常' if regions_defined else '❌ 未定义'}") print(f" 坐标过滤功能: {'✅ 正常' if filtering_works else '❌ 异常'}") print(f" RTSP流测试: {'✅ 正常' if rtsp_success else '❌ 跳过或失败'}") if config_loaded and regions_defined and filtering_works: print("\n🎉 ROI设置验证成功!") print(" 您的ROI区域配置已正确设置,可以用于过滤检测结果。") else: print("\n❌ ROI设置存在问题,请检查配置文件。") return config_loaded and regions_defined and filtering_works if __name__ == "__main__": success = main() sys.exit(0 if success else 1)