BodyBalanceEvaluation/backend/test_resolution_performance.py

214 lines
7.4 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
分辨率性能测试脚本
测试不同分辨率下相机配置的性能差异
"""
import sys
import os
import time
import logging
# 添加项目路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from devices.camera_manager import CameraManager
from devices.utils.config_manager import ConfigManager
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def test_resolution_performance(width, height, test_name):
"""
测试指定分辨率的性能
Args:
width: 宽度
height: 高度
test_name: 测试名称
Returns:
dict: 性能数据
"""
print(f"\n{'='*60}")
print(f"测试 {test_name}: {width}x{height}")
print(f"{'='*60}")
# 创建配置管理器并设置分辨率
config_manager = ConfigManager()
# 获取原始配置
original_config = config_manager.get_device_config('camera')
# 临时设置测试分辨率
test_config = {
'width': width,
'height': height
}
config_manager.set_camera_config(test_config)
try:
# 创建相机管理器
camera = CameraManager(None, config_manager)
# 测试初始化性能
start_time = time.time()
success = camera.initialize()
total_time = (time.time() - start_time) * 1000
if success:
print(f"✅ 初始化成功")
print(f"📊 总耗时: {total_time:.1f}ms ({total_time/1000:.1f}秒)")
# 获取实际分辨率
if camera.cap:
actual_width = int(camera.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
actual_height = int(camera.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"🎯 实际分辨率: {actual_width}x{actual_height}")
# 测试首帧获取
frame_start = time.time()
ret, frame = camera.cap.read() if camera.cap else (False, None)
frame_time = (time.time() - frame_start) * 1000
if ret and frame is not None:
print(f"🖼️ 首帧获取: {frame_time:.1f}ms, 帧大小: {frame.shape}")
else:
print(f"❌ 首帧获取失败")
frame_time = -1
# 清理资源
camera.cleanup()
return {
'resolution': f"{width}x{height}",
'success': True,
'total_time': total_time,
'frame_time': frame_time,
'actual_resolution': f"{actual_width}x{actual_height}" if camera.cap else "未知"
}
else:
print(f"❌ 初始化失败")
return {
'resolution': f"{width}x{height}",
'success': False,
'total_time': total_time,
'frame_time': -1,
'actual_resolution': "失败"
}
except Exception as e:
print(f"❌ 测试异常: {e}")
return {
'resolution': f"{width}x{height}",
'success': False,
'total_time': -1,
'frame_time': -1,
'actual_resolution': "异常",
'error': str(e)
}
finally:
# 恢复原始配置
try:
restore_config = {
'width': original_config['width'],
'height': original_config['height']
}
config_manager.set_camera_config(restore_config)
except Exception as e:
print(f"⚠️ 恢复配置失败: {e}")
def main():
"""
主测试函数
"""
print("🚀 开始分辨率性能测试")
# 测试不同分辨率
test_cases = [
(1280, 720, "当前分辨率"),
(640, 480, "标准VGA"),
(320, 240, "QVGA小分辨率"),
(160, 120, "极小分辨率")
]
results = []
for width, height, name in test_cases:
result = test_resolution_performance(width, height, name)
results.append(result)
# 等待一下,避免设备冲突
time.sleep(1)
# 输出汇总结果
print(f"\n{'='*80}")
print("📈 性能测试汇总")
print(f"{'='*80}")
print(f"{'分辨率':<15} {'状态':<8} {'初始化耗时':<12} {'首帧耗时':<10} {'实际分辨率':<15}")
print("-" * 80)
successful_results = []
for result in results:
status = "✅成功" if result['success'] else "❌失败"
init_time = f"{result['total_time']:.1f}ms" if result['total_time'] > 0 else "N/A"
frame_time = f"{result['frame_time']:.1f}ms" if result['frame_time'] > 0 else "N/A"
print(f"{result['resolution']:<15} {status:<8} {init_time:<12} {frame_time:<10} {result['actual_resolution']:<15}")
if result['success'] and result['total_time'] > 0:
successful_results.append(result)
# 性能分析
if len(successful_results) >= 2:
print(f"\n📊 性能分析:")
# 找到最快和最慢的
fastest = min(successful_results, key=lambda x: x['total_time'])
slowest = max(successful_results, key=lambda x: x['total_time'])
print(f"🏆 最快配置: {fastest['resolution']} - {fastest['total_time']:.1f}ms")
print(f"🐌 最慢配置: {slowest['resolution']} - {slowest['total_time']:.1f}ms")
if slowest['total_time'] > fastest['total_time']:
improvement = ((slowest['total_time'] - fastest['total_time']) / slowest['total_time']) * 100
print(f"💡 性能提升: {improvement:.1f}% (使用最小分辨率)")
# 基准对比
baseline = next((r for r in successful_results if "1280x720" in r['resolution']), None)
if baseline:
print(f"\n📋 相对于当前分辨率(1280x720)的性能对比:")
for result in successful_results:
if result != baseline:
if result['total_time'] < baseline['total_time']:
improvement = ((baseline['total_time'] - result['total_time']) / baseline['total_time']) * 100
print(f" {result['resolution']}: 快 {improvement:.1f}% ({result['total_time']:.1f}ms vs {baseline['total_time']:.1f}ms)")
else:
degradation = ((result['total_time'] - baseline['total_time']) / baseline['total_time']) * 100
print(f" {result['resolution']}: 慢 {degradation:.1f}% ({result['total_time']:.1f}ms vs {baseline['total_time']:.1f}ms)")
print(f"\n🎯 建议:")
if successful_results:
fastest = min(successful_results, key=lambda x: x['total_time'])
if fastest['total_time'] < 3000: # 小于3秒
print(f"✅ 推荐使用 {fastest['resolution']} 以获得最佳性能")
else:
print(f"⚠️ 即使最快的分辨率 {fastest['resolution']} 仍需 {fastest['total_time']:.1f}ms")
print(f" 建议考虑其他优化方案(如更换相机后端)")
else:
print(f"❌ 所有测试都失败了,请检查相机连接")
print(f"\n{'='*80}")
print("测试完成")
print(f"{'='*80}")
if __name__ == "__main__":
import cv2 # 在这里导入cv2避免在函数中导入
main()