mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-01 01:10:34 +08:00
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:
@@ -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
|
||||
|
||||
@@ -123,6 +123,11 @@ JSONファイルはコメントをサポートしていません。テキスト
|
||||
// 色数えの際にマスク範囲を最初に閉じる処理をするかどうか。
|
||||
// 閉じる処理は小さな黒点を埋めることができ、通常は色数えのマッチング効果を向上させますが、画像に文字が含まれている場合は false にすることをお勧めします
|
||||
|
||||
"pureColor": false, // オプション、method が HSVCount または RGBCount の場合に有効、デフォルトは false
|
||||
// trueの場合、テンプレートマッチングのスコアを無視し、色マッチング結果のみに依存
|
||||
// 色の特徴が明確だがテンプレートマッチングの効果が良くないシナリオに適用
|
||||
// このオプションを使用する場合、templThresholdを上げることを推奨
|
||||
|
||||
"method": "Ccoeff", // オプション、テンプレートマッチングアルゴリズム、リスト形式可能
|
||||
// 指定しない場合はデフォルトで Ccoeff
|
||||
// - Ccoeff: 色に敏感でないテンプレートマッチングアルゴリズム、cv::TM_CCOEFF_NORMED に対応
|
||||
|
||||
@@ -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에 해당
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -124,6 +124,11 @@ JSON 文件是不支持注释的,文本中的注释仅用于演示,请勿直
|
||||
// 数色时是否先用闭运算处理掩码范围。
|
||||
// 闭运算可以填补小黑点,一般会提高数色匹配效果,但若图片中包含文字建议设为 false
|
||||
|
||||
"pureColor": false, // 可选项,当 method 为 HSVCount 或 RGBCount 时有效,默认为 false
|
||||
// 如果为 true,则忽略模板匹配得分,完全依赖颜色匹配结果
|
||||
// 适用于颜色特征明显但模板匹配效果不佳的场景
|
||||
// 使用此选项时建议相应提高 templThreshold 阈值
|
||||
|
||||
"method": "Ccoeff", // 可选项,模板匹配算法,可以是列表
|
||||
// 不填写时默认为 Ccoeff
|
||||
// - Ccoeff: 对颜色不敏感的模板匹配算法,对应 cv::TM_CCOEFF_NORMED
|
||||
|
||||
@@ -122,6 +122,11 @@ JSON 文件是不支持注釋的,文本中的注釋僅用於示範,請勿直
|
||||
// 數色時是否先用閉運算處理掩碼範圍。
|
||||
// 閉運算可以填補小黑點,一般會提高數色匹配效果,但若圖片中包含文字建議設為 false
|
||||
|
||||
"pureColor": false, // 可選項,當 method 為 HSVCount 或 RGBCount 時有效,默認為 false
|
||||
// 如果為 true,則忽略模板匹配得分,完全依賴顏色匹配結果
|
||||
// 適用於顏色特徵明顯但模板匹配效果不佳的場景
|
||||
// 使用此選項時建議相應提高 templThreshold 閾值
|
||||
|
||||
"method": "Ccoeff", // 可選項,模板匹配算法,可以是列表
|
||||
// 不填寫時默認為 Ccoeff
|
||||
// - Ccoeff: 對顏色不敏感的模板匹配算法,對應 cv::TM_CCOEFF_NORMED
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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,
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user