duan8Detection/ROI/validate_roi_setup.py
2026-01-07 15:40:08 +08:00

172 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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)