feat: 增加纯数色匹配 (#14536)

* feat: 增加纯数色匹配

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: 更新 schema

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
uye
2025-10-28 01:41:25 +08:00
committed by GitHub
parent 9fdc16f24b
commit ed122d8100
12 changed files with 59 additions and 2 deletions

View File

@@ -125,6 +125,11 @@ Please note that JSON files do not support comments. The comments in this docume
// Whether to use morphological closing on mask range for color counting
// Closing fills small black dots, generally improves color matching but set false for text
"pureColor": false, // Optional when method is HSVCount or RGBCount, default false
// If true, ignore template matching score and rely solely on color matching results
// Suitable for scenarios where color features are distinct but template matching performs poorly
// When using this option, it is recommended to correspondingly increase the templThreshold
"method": "Ccoeff", // Optional, template matching algorithm, can be list
// Default is Ccoeff when not specified
// - Ccoeff: Color-insensitive template matching, corresponds to cv::TM_CCOEFF_NORMED

View File

@@ -123,6 +123,11 @@ JSONファイルはコメントをサポートしていません。テキスト
// 色数えの際にマスク範囲を最初に閉じる処理をするかどうか。
// 閉じる処理は小さな黒点を埋めることができ、通常は色数えのマッチング効果を向上させますが、画像に文字が含まれている場合は false にすることをお勧めします
"pureColor": false, // オプション、method が HSVCount または RGBCount の場合に有効、デフォルトは false
// trueの場合、テンプレートマッチングのスコアを無視し、色マッチング結果のみに依存
// 色の特徴が明確だがテンプレートマッチングの効果が良くないシナリオに適用
// このオプションを使用する場合、templThresholdを上げることを推奨
"method": "Ccoeff", // オプション、テンプレートマッチングアルゴリズム、リスト形式可能
// 指定しない場合はデフォルトで Ccoeff
// - Ccoeff: 色に敏感でないテンプレートマッチングアルゴリズム、cv::TM_CCOEFF_NORMED に対応

View File

@@ -124,6 +124,11 @@ It is recommended to use [Visual Studio Code](https://code.visualstudio.com/) an
// 색상 수를 세는 동안 마스크 범위에 먼저 닫힘 연산을 적용할지 여부.
// 닫힘 연산은 작은 검은 점을 메울 수 있으며, 일반적으로 색상 수 세기 매칭 효과를 향상시키지만 이미지에 텍스트가 포함된 경우 false로 설정하는 것이 좋습니다
"pureColor": false, // 선택 사항, method가 HSVCount 또는 RGBCount일 때 유효, 기본값은 false
// true인 경우 템플릿 매칭 점수를 무시하고 색상 매칭 결과에만 의존
// 색상 특징이 뚜렷하지만 템플릿 매칭 효과가 좋지 않은 시나리오에 적합
// 이 옵션 사용 시 templThreshold를 상향 조정하는 것이 권장됨
"method": "Ccoeff", // 선택 사항, 템플릿 매칭 알고리즘, 목록 형태일 수 있음
// 지정하지 않을 경우 기본값은 Ccoeff
// - Ccoeff: 색상에 민감하지 않은 템플릿 매칭 알고리즘, cv::TM_CCOEFF_NORMED에 해당

View File

@@ -247,7 +247,12 @@
"colorWithClose": {
"type": "boolean",
"default": true,
"description": "可选项,当 method 为 HSVCount 或 RGBCount 时有效,默认为 true\n数色时是否先用闭运算处理掩码范围\n闭运算可以填补小黑点一般会提高数色匹配效果但若图片中包含文字建议设为 false"
"description": "可选项,当 method 为 HSVCount 或 RGBCount 时有效,默认为 true\n数色时是否先用闭运算处理掩码范围\n闭运算可以填补小黑点一般会提高数色匹配效果但若图片中包含文字建议设为 false"
},
"pureColor": {
"type": "boolean",
"default": false,
"description": "可选项,当 method 为 HSVCount 或 RGBCount 时有效,默认为 false\n是否只使用数色匹配而不使用模板匹配\n适用于颜色特征明显但模板匹配效果不佳的场景\n使用此选项时建议相应提高 templThreshold 阈值"
},
"method": {
"oneOf": [

View File

@@ -249,6 +249,11 @@
"default": true,
"description": "Optional when method is HSVCount or RGBCount, default true\nWhether to use morphological closing on mask range for color counting\nClosing fills small black dots, generally improves color matching but set false for text"
},
"pureColor": {
"type": "boolean",
"default": false,
"description": "Optional when method is HSVCount or RGBCount, default false\nWhether to use only color counting without template matching\nSuitable for scenarios with obvious color features but poor template matching performance\nWhen using this option, it is recommended to appropriately increase the templThreshold threshold"
},
"method": {
"oneOf": [
{

View File

@@ -124,6 +124,11 @@ JSON 文件是不支持注释的,文本中的注释仅用于演示,请勿直
// 数色时是否先用闭运算处理掩码范围。
// 闭运算可以填补小黑点,一般会提高数色匹配效果,但若图片中包含文字建议设为 false
"pureColor": false, // 可选项,当 method 为 HSVCount 或 RGBCount 时有效,默认为 false
// 如果为 true则忽略模板匹配得分完全依赖颜色匹配结果
// 适用于颜色特征明显但模板匹配效果不佳的场景
// 使用此选项时建议相应提高 templThreshold 阈值
"method": "Ccoeff", // 可选项,模板匹配算法,可以是列表
// 不填写时默认为 Ccoeff
// - Ccoeff: 对颜色不敏感的模板匹配算法,对应 cv::TM_CCOEFF_NORMED

View File

@@ -122,6 +122,11 @@ JSON 文件是不支持注釋的,文本中的注釋僅用於示範,請勿直
// 數色時是否先用閉運算處理掩碼範圍。
// 閉運算可以填補小黑點,一般會提高數色匹配效果,但若圖片中包含文字建議設為 false
"pureColor": false, // 可選項,當 method 為 HSVCount 或 RGBCount 時有效,默認為 false
// 如果為 true則忽略模板匹配得分完全依賴顏色匹配結果
// 適用於顏色特徵明顯但模板匹配效果不佳的場景
// 使用此選項時建議相應提高 templThreshold 閾值
"method": "Ccoeff", // 可選項,模板匹配算法,可以是列表
// 不填寫時默認為 Ccoeff
// - Ccoeff: 對顏色不敏感的模板匹配算法,對應 cv::TM_CCOEFF_NORMED

View File

@@ -631,6 +631,7 @@ struct MatchTaskInfo : public TaskInfo
Ranges mask_ranges; // 匹配掩码范围TaskData 仅允许 array<int, 2>,但保留彩色掩码支持
Ranges color_scales; // 数色掩码范围
bool color_close = true; // 数色时是否使用闭运算处理
bool pure_color = false; // 数色时是否忽略模板匹配结果
};
using MatchTaskPtr = std::shared_ptr<MatchTaskInfo>;

View File

@@ -749,6 +749,13 @@ asst::TaskPtr asst::TaskData::generate_match_task_info(
match_task_info_ptr->color_close,
default_ptr->color_close);
utils::get_and_check_value_or(
name,
task_json,
"pureColor",
match_task_info_ptr->pure_color,
default_ptr->pure_color);
return match_task_info_ptr;
}
@@ -1056,6 +1063,7 @@ bool asst::TaskData::syntax_check(std::string_view task_name, const json::value&
// specific
"cache", "colorScales", "colorWithClose", "maskRange", "method",
"rectMove", "roi", "specialParams", "templThreshold", "template",
"pureColor",
} },
{ AlgorithmType::OcrDetect,
{

View File

@@ -59,6 +59,11 @@ void MatcherConfig::set_color_scales(MatchTaskInfo::Ranges color_scales, bool co
m_params.color_close = color_close;
}
void MatcherConfig::set_pure_color(bool pure_color) noexcept
{
m_params.pure_color = pure_color;
}
void MatcherConfig::set_method(MatchMethod method) noexcept
{
m_params.methods = { method };
@@ -72,6 +77,7 @@ void MatcherConfig::_set_task_info(MatchTaskInfo task_info)
m_params.mask_ranges = std::move(task_info.mask_ranges);
m_params.color_scales = std::move(task_info.color_scales);
m_params.color_close = task_info.color_close;
m_params.pure_color = task_info.pure_color;
m_params.methods = std::move(task_info.methods);
_set_roi(task_info.roi);

View File

@@ -20,6 +20,7 @@ public:
bool mask_close = false; // 匹配时是否使用闭运算处理
MatchTaskInfo::Ranges color_scales; // 数色时的颜色掩码范围
bool color_close = true; // 数色时是否使用闭运算处理
bool pure_color = false; // 数色时是否忽略模板匹配结果
};
public:
@@ -38,6 +39,7 @@ public:
void set_mask_range(int lower, int upper, bool mask_src = false, bool mask_close = false);
void set_mask_ranges(MatchTaskInfo::Ranges mask_ranges, bool mask_src = false, bool mask_close = false);
void set_color_scales(MatchTaskInfo::Ranges color_scales, bool color_close = true);
void set_pure_color(bool pure_color) noexcept;
void set_method(MatchMethod method) noexcept;
protected:

View File

@@ -223,7 +223,12 @@ std::vector<Matcher::RawResult> Matcher::preproc_and_match(const cv::Mat& image,
fp.convertTo(fp, CV_32S);
cv::Mat count_result;
cv::divide(2 * tp, tp + fp + tp_fn, count_result, 1, CV_32F); // 数色结果为 f1_score
cv::multiply(matched, count_result, matched); // 最终结果是数色和模板匹配的点积
if (params.pure_color) {
matched = 1.0f;
}
cv::multiply(matched, count_result, matched); // 最终结果是数色和模板匹配的点积
}
results.emplace_back(RawResult { .matched = matched, .templ = templ, .templ_name = templ_name });
}