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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user