BodyBalanceEvaluation/backend/test_camera_performance.py

217 lines
7.5 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 python3
# -*- coding: utf-8 -*-
"""
相机启动性能测试脚本
"""
import sys
import os
import time
import logging
from typing import Dict, Any
# 添加项目路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from devices.utils.config_manager import ConfigManager
from devices.camera_manager import CameraManager
# 设置日志级别为DEBUG以查看详细信息
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
def test_camera_startup_performance():
"""
测试相机启动性能
"""
print("=" * 60)
print("相机启动性能测试")
print("=" * 60)
try:
# 初始化配置管理器
print("\n1. 初始化配置管理器...")
config_start = time.time()
config_manager = ConfigManager()
config_time = (time.time() - config_start) * 1000
print(f"配置管理器初始化完成 (耗时: {config_time:.1f}ms)")
# 创建相机管理器
print("\n2. 创建相机管理器...")
manager_start = time.time()
camera_manager = CameraManager(None, config_manager)
manager_time = (time.time() - manager_start) * 1000
print(f"相机管理器创建完成 (耗时: {manager_time:.1f}ms)")
# 测试多次初始化以获得平均性能
print("\n3. 执行相机初始化性能测试...")
test_rounds = 3
init_times = []
for i in range(test_rounds):
print(f"\n--- 第 {i+1} 轮测试 ---")
# 如果之前已连接,先断开
if camera_manager.is_connected:
disconnect_start = time.time()
camera_manager.disconnect()
disconnect_time = (time.time() - disconnect_start) * 1000
print(f"断开连接耗时: {disconnect_time:.1f}ms")
time.sleep(0.5) # 等待设备完全断开
# 执行初始化
init_start = time.time()
success = camera_manager.initialize()
init_time = (time.time() - init_start) * 1000
if success:
print(f"✓ 初始化成功 (总耗时: {init_time:.1f}ms)")
init_times.append(init_time)
# 测试校准性能
calibrate_start = time.time()
calibrate_success = camera_manager.calibrate()
calibrate_time = (time.time() - calibrate_start) * 1000
if calibrate_success:
print(f"✓ 校准成功 (耗时: {calibrate_time:.1f}ms)")
else:
print(f"✗ 校准失败 (耗时: {calibrate_time:.1f}ms)")
# 测试第一帧获取时间
if camera_manager.cap:
first_frame_start = time.time()
ret, frame = camera_manager.cap.read()
first_frame_time = (time.time() - first_frame_start) * 1000
if ret and frame is not None:
print(f"✓ 首帧获取成功 (耗时: {first_frame_time:.1f}ms, 帧大小: {frame.shape})")
del frame # 释放内存
else:
print(f"✗ 首帧获取失败 (耗时: {first_frame_time:.1f}ms)")
else:
print(f"✗ 初始化失败 (耗时: {init_time:.1f}ms)")
time.sleep(1) # 测试间隔
# 性能统计
print("\n" + "=" * 60)
print("性能统计结果")
print("=" * 60)
if init_times:
avg_init_time = sum(init_times) / len(init_times)
min_init_time = min(init_times)
max_init_time = max(init_times)
print(f"初始化性能统计 ({len(init_times)} 次成功测试):")
print(f" 平均耗时: {avg_init_time:.1f}ms")
print(f" 最快耗时: {min_init_time:.1f}ms")
print(f" 最慢耗时: {max_init_time:.1f}ms")
# 性能评估
if avg_init_time < 1000: # 1秒以内
print(f" 性能评级: 优秀 ⭐⭐⭐")
elif avg_init_time < 3000: # 3秒以内
print(f" 性能评级: 良好 ⭐⭐")
elif avg_init_time < 5000: # 5秒以内
print(f" 性能评级: 一般 ⭐")
else:
print(f" 性能评级: 需要优化 ❌")
else:
print("❌ 所有初始化测试都失败了")
# 获取设备信息
if camera_manager.is_connected:
print("\n设备信息:")
device_info = camera_manager.get_device_info()
for key, value in device_info.items():
print(f" {key}: {value}")
# 清理资源
print("\n4. 清理资源...")
cleanup_start = time.time()
camera_manager.cleanup()
cleanup_time = (time.time() - cleanup_start) * 1000
print(f"资源清理完成 (耗时: {cleanup_time:.1f}ms)")
except Exception as e:
print(f"\n❌ 测试过程中发生错误: {e}")
import traceback
traceback.print_exc()
def test_streaming_startup():
"""
测试流媒体启动性能
"""
print("\n" + "=" * 60)
print("流媒体启动性能测试")
print("=" * 60)
try:
config_manager = ConfigManager()
camera_manager = CameraManager(None, config_manager)
# 初始化相机
print("\n1. 初始化相机...")
if not camera_manager.initialize():
print("❌ 相机初始化失败,无法进行流媒体测试")
return
# 测试流媒体启动
print("\n2. 启动流媒体...")
streaming_start = time.time()
streaming_success = camera_manager.start_streaming()
streaming_time = (time.time() - streaming_start) * 1000
if streaming_success:
print(f"✓ 流媒体启动成功 (耗时: {streaming_time:.1f}ms)")
# 等待几秒钟收集帧数据
print("\n3. 收集性能数据...")
time.sleep(3)
# 获取统计信息
stats = camera_manager.get_stats()
print(f"\n流媒体性能统计:")
for key, value in stats.items():
print(f" {key}: {value}")
# 停止流媒体
print("\n4. 停止流媒体...")
stop_start = time.time()
camera_manager.stop_streaming()
stop_time = (time.time() - stop_start) * 1000
print(f"✓ 流媒体停止完成 (耗时: {stop_time:.1f}ms)")
else:
print(f"❌ 流媒体启动失败 (耗时: {streaming_time:.1f}ms)")
# 清理
camera_manager.cleanup()
except Exception as e:
print(f"\n❌ 流媒体测试过程中发生错误: {e}")
import traceback
traceback.print_exc()
def main():
"""
主函数
"""
print("相机性能测试工具")
print("测试目标优化相机启动时间目标从10+秒降低到3秒以内")
# 执行基本启动性能测试
test_camera_startup_performance()
# 执行流媒体启动性能测试
test_streaming_startup()
print("\n" + "=" * 60)
print("测试完成!")
print("=" * 60)
if __name__ == '__main__':
main()