修改摸底测试功能、修改pattern控制逻辑

This commit is contained in:
xinzhu.yin
2026-05-13 17:17:13 +08:00
parent 9a52e34f2b
commit 0513f810bd
13 changed files with 479 additions and 3067 deletions

View File

@@ -13,7 +13,6 @@ import colour
import numpy as np
import algorithm.pq_algorithm as pq_algorithm
from app.data_range_converter import convert_pattern_params
from app.pq.pq_result import PQResult
def new_pq_results(self, test_type, test_name):
@@ -310,205 +309,12 @@ def send_fix_pattern(self, mode):
results = []
try:
# 1. 设置图案模式
if mode == "rgb":
self.config.set_current_pattern("rgb")
elif mode == "gray":
self.config.set_current_pattern("gray")
elif mode == "accuracy": # 色准模式SDR 和 HDR 通用 29色
self.config.set_current_pattern("accuracy")
elif mode == "custom":
self.config.set_current_pattern("custom")
else:
self.log_gui.log(f"未知的图案模式: {mode}", level="error")
return None
# 2. 获取当前测试类型
test_type = self.config.current_test_type
# 3. 根据测试类型设置信号格式和图案
if test_type == "screen_module":
# 屏模组测试:使用 Timing
self.log_gui.log("=" * 50, level="separator")
self.log_gui.log("设置屏模组信号格式:", level="info")
self.log_gui.log("=" * 50, level="separator")
timing_str = self.config.current_test_types[test_type]["timing"]
self.log_gui.log(f" Timing: {timing_str}", level="info")
# 屏模组测试:直接使用原始配置
self.ucd.set_ucd_params(self.config)
elif test_type == "sdr_movie":
# SDR 测试设置色彩空间、Gamma 等
self.log_gui.log("=" * 50, level="separator")
self.log_gui.log("设置 SDR 信号格式:", level="info")
self.log_gui.log("=" * 50, level="separator")
color_space = self.sdr_color_space_var.get()
gamma = self.sdr_gamma_type_var.get()
data_range = self.sdr_data_range_var.get()
bit_depth = self.sdr_bit_depth_var.get()
self.log_gui.log(f" 色彩空间: {color_space}", level="info")
self.log_gui.log(f" Gamma: {gamma}", level="info")
self.log_gui.log(f" 数据范围: {data_range}", level="info")
self.log_gui.log(f" 编码位深: {bit_depth}", level="info")
success = self.ucd.set_sdr_format(
color_space=color_space,
gamma=gamma,
data_range=data_range,
bit_depth=bit_depth,
)
if success:
self.log_gui.log("SDR 信号格式设置成功", level="success")
else:
self.log_gui.log("SDR 信号格式设置失败", level="error")
# 设置图案参数
if mode == "accuracy":
self.log_gui.log(f"设置 SDR 29色色准测试图案...", level="info")
else:
self.log_gui.log(f"设置 SDR 测试图案({mode} 模式)...", level="info")
# ========== ✅✅修改:使用临时配置对象 ==========
import copy
# 从原始配置获取参数(每次都是干净的)
if mode == "rgb":
original_params = copy.deepcopy(
self.config.default_pattern_rgb["pattern_params"]
)
elif mode == "gray":
original_params = copy.deepcopy(
self.config.default_pattern_gray["pattern_params"]
)
elif mode == "accuracy":
original_params = copy.deepcopy(
self.config.default_pattern_accuracy["pattern_params"]
)
elif mode == "custom":
original_params = copy.deepcopy(
self.config.default_pattern_temp["pattern_params"]
)
self.log_gui.log(f" 使用原始 RGB 参数(前 3 个):", level="info")
for i in range(min(3, len(original_params))):
self.log_gui.log(f" [{i+1}] {original_params[i]}", level="info")
# 根据 data_range 转换
converted_params = convert_pattern_params(
pattern_params=original_params, data_range=data_range, verbose=False
)
if data_range == "Limited":
self.log_gui.log(" 转换为 Limited Range (16-235):", level="info")
for i in range(min(3, len(converted_params))):
self.log_gui.log(
f" {original_params[i]}{converted_params[i]}"
, level="info")
else:
self.log_gui.log("Full RangeRGB 保持不变", level="success")
# 创建临时配置对象(不修改 self.config
temp_config = self.config.get_temp_config_with_converted_params(
mode=mode, converted_params=converted_params
)
# 使用临时配置设置参数
self.ucd.set_ucd_params(temp_config)
self.log_gui.log(f"图案参数已设置,共 {len(converted_params)} 个图案", level="success")
# ========== 修改结束 ==========
elif test_type == "hdr_movie":
# HDR 测试设置色彩空间、Metadata 等
self.log_gui.log("=" * 50, level="separator")
self.log_gui.log("设置 HDR 信号格式:", level="info")
self.log_gui.log("=" * 50, level="separator")
color_space = self.hdr_color_space_var.get()
data_range = self.hdr_data_range_var.get()
bit_depth = self.hdr_bit_depth_var.get()
max_cll = self.hdr_maxcll_var.get()
max_fall = self.hdr_maxfall_var.get()
self.log_gui.log(f" 色彩空间: {color_space}", level="info")
self.log_gui.log(f" 数据范围: {data_range}", level="info")
self.log_gui.log(f" 编码位深: {bit_depth}", level="info")
self.log_gui.log(f" MaxCLL: {max_cll}", level="info")
self.log_gui.log(f" MaxFALL: {max_fall}", level="info")
success = self.ucd.set_hdr_format(
color_space=color_space,
data_range=data_range,
bit_depth=bit_depth,
max_cll=max_cll,
max_fall=max_fall,
)
if success:
self.log_gui.log("HDR 信号格式设置成功", level="success")
else:
self.log_gui.log("HDR 信号格式设置失败", level="error")
# 设置图案参数
if mode == "accuracy":
self.log_gui.log(f"设置 HDR 29色色准测试图案...", level="info")
else:
self.log_gui.log(f"设置 HDR 测试图案({mode} 模式)...", level="info")
# ========== ✅✅修改:使用临时配置对象 ==========
import copy
# 从原始配置获取参数
if mode == "rgb":
original_params = copy.deepcopy(
self.config.default_pattern_rgb["pattern_params"]
)
elif mode == "gray":
original_params = copy.deepcopy(
self.config.default_pattern_gray["pattern_params"]
)
elif mode == "accuracy":
original_params = copy.deepcopy(
self.config.default_pattern_accuracy["pattern_params"]
)
self.log_gui.log(f" 使用原始 RGB 参数(前 3 个):", level="info")
for i in range(min(3, len(original_params))):
self.log_gui.log(f" [{i+1}] {original_params[i]}", level="info")
# 根据 data_range 转换
converted_params = convert_pattern_params(
pattern_params=original_params, data_range=data_range, verbose=False
)
if data_range == "Limited":
self.log_gui.log(" 转换为 Limited Range (16-235):", level="info")
for i in range(min(3, len(converted_params))):
self.log_gui.log(
f" {original_params[i]}{converted_params[i]}"
, level="info")
else:
self.log_gui.log("Full RangeRGB 保持不变", level="success")
# 创建临时配置对象
temp_config = self.config.get_temp_config_with_converted_params(
mode=mode, converted_params=converted_params
)
self.ucd.set_ucd_params(temp_config)
self.log_gui.log(f"图案参数已设置,共 {len(converted_params)} 个图案", level="success")
# ========== 修改结束 ==========
session = self.pattern_service.prepare_session(mode, log_details=True)
self.log_gui.log("=" * 50, level="separator")
# 4. 循环发送图案并采集数据(使用原始配置的数量)
total_patterns = len(self.config.current_pattern["pattern_params"])
# 4. 循环发送图案并采集数据
total_patterns = session.total_patterns
self.log_gui.log(f"开始采集数据,共 {total_patterns} 个图案", level="info")
settle_time = max(0.2, float(getattr(self, "pattern_settle_time", 1.0)))
progress_step = max(
@@ -518,14 +324,7 @@ def send_fix_pattern(self, mode):
f"采集等待时间: {settle_time:.2f}s可通过 pattern_settle_time 调整)"
, level="info")
# 获取颜色名称列表(用于日志显示)
color_names = None
if mode == "accuracy":
color_names = self.config.get_accuracy_color_names()
custom_pattern_names = []
if mode == "custom" and hasattr(self.config, "get_temp_pattern_names"):
custom_pattern_names = self.config.get_temp_pattern_names()
display_names = session.display_names
for i in range(total_patterns):
if not self.testing:
@@ -538,17 +337,15 @@ def send_fix_pattern(self, mode):
or ((i + 1) % progress_step == 0)
)
# 设置下一个图案(显示颜色名称)
if should_log_detail:
if color_names and i < len(color_names):
if display_names and i < len(display_names):
self.log_gui.log(
f"发送第 {i+1}/{total_patterns} 个图案: {color_names[i]}..."
f"发送第 {i+1}/{total_patterns} 个图案: {display_names[i]}..."
, level="info")
else:
self.log_gui.log(f"发送第 {i+1}/{total_patterns} 个图案...", level="info")
self.ucd.set_next_pattern()
self.ucd.run()
self.pattern_service.send_session_pattern(session, i)
time.sleep(settle_time)
# 测量数据
@@ -582,8 +379,8 @@ def send_fix_pattern(self, mode):
)
row_data = {
"pattern_name": (
custom_pattern_names[i]
if i < len(custom_pattern_names)
display_names[i]
if i < len(display_names)
else f"P {i + 1}"
),
"X": X,