refactor(ocr): 优化 HSV 颜色过滤架构,实现快捷预设免检与大一统 Custom 变体

- 重构 `ColorPreset` 枚举,新增 `Custom(Vec<HsvRange>)` 变体。
 - 优化 `ColorFilter` 特征兼容多路组合宏。
 - 新增 `validate_self` 特征多态方法,实现责任分离:库担保的快捷预设 0 运行时开销免检放行,仅对 `Custom` 动态数据进行严格自检。
 - 优化 `OcrBuilder::color_filter` 接收 `&dyn ColorFilter` 特征对象,完美兼容原有声明式宏与链式调用熔断机制。
 - 借鉴 `reqwest` 的延迟错误处理模式,完善 `OcrBuilder` 的链式调用熔断(毒化)状态机。
This commit is contained in:
2026-06-18 17:40:29 +08:00
parent 189f2bd697
commit 62d5e7a0ca
5 changed files with 285 additions and 7 deletions

View File

@@ -2,6 +2,7 @@ use crate::charset::{TokenFilter, ValidationCtx};
use crate::model_metadata::ModelMetadata;
use crate::models::base::ModelArgs;
use crate::models::loader::{ModelLoader, ModelSession, ModelType};
use crate::utils::color_filter::{ColorFilter, HsvRange};
use crate::utils::image_io::png_rgba_white_preprocess;
use crate::utils::image_processor::{convert_to_grayscale, resize_image};
use anyhow::Context;
@@ -126,7 +127,7 @@ pub struct OcrBuilder<'a> {
#[allow(dead_code)]
probability: bool,
/// 颜色过滤:保留的颜色列表
color_filter_colors: Option<Vec<ColorRange>>,
color_filter: Result<Option<Vec<HsvRange>>, String>,
/// 颜色过滤自定义RGB范围
color_filter_custom_ranges: Option<Vec<ColorRange>>,
/// 字符集范围
@@ -141,7 +142,7 @@ impl<'a> OcrBuilder<'a> {
// image,
png_fix: false, // 默认值
probability: false,
color_filter_colors: None,
color_filter: Ok(None),
color_filter_custom_ranges: None,
charset_restrict: None,
}
@@ -150,10 +151,58 @@ impl<'a> OcrBuilder<'a> {
self.png_fix = value;
self
}
pub fn color_filter_colors(mut self, value: Vec<ColorRange>) -> Self {
self.color_filter_colors = Some(value);
// 反复调用color_filter怎么处理
pub fn color_filter(mut self, filter: &dyn ColorFilter) -> Self {
// self.color_filter = Some(value);
// 利用组合子预估能力,获取精准分配槽位数
let total_capacity = filter.estimated_count();
if total_capacity == 0 {
return self;
}
match self.color_filter {
Ok(mut ranges) => {
// 2. 触发特征多态自检快捷预设秒过Custom 变体严格政审
if let Err(err_msg) = filter.validate_self() {
// 校验失败Builder 正式中毒,熔断器闭合
self.color_filter = Err(err_msg);
return self;
}
match &mut ranges {
None => {
// 情况 A这是用户第一次配置直接一击必中分配精准内存
let mut v = Vec::with_capacity(total_capacity);
// 尝试倒入如果出错Builder 正式中毒
filter.append_ranges(&mut v);
ranges = Some(v);
}
Some(existing_vec) => {
// 情况 B用户之前配置过现在追加配置。
// 绝不让它动态乱涨!我们利用 reserve 方法,【仅此一次】精准追加所需的扩容空间!
existing_vec.reserve(total_capacity);
// 尝试追加倒入
filter.append_ranges(existing_vec) ;
}
}
if let Some(v) =&mut ranges {
v.sort_unstable();
v.dedup();
}
// 5. 更新状态
self.color_filter = Ok(ranges);
},
Err(_) => return self,
};
self
}
pub fn color_filter_custom_ranges(mut self, value: Vec<ColorRange>) -> Self {
self.color_filter_custom_ranges = Some(value);
self