172 lines
6.2 KiB
Python
172 lines
6.2 KiB
Python
#!/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) |