From 0195feb03cc2813e8ee262c8660e2276aaeb3b74 Mon Sep 17 00:00:00 2001 From: Aliothmoon <107878625+Aliothmoon@users.noreply.github.com> Date: Mon, 16 Mar 2026 19:46:22 +0800 Subject: [PATCH] perf: hoist image-side cvtColor out of template loop in Matcher (#16018) --- src/MaaCore/Vision/Matcher.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/MaaCore/Vision/Matcher.cpp b/src/MaaCore/Vision/Matcher.cpp index 930b8134dc..63ec123561 100644 --- a/src/MaaCore/Vision/Matcher.cpp +++ b/src/MaaCore/Vision/Matcher.cpp @@ -82,6 +82,18 @@ Matcher::ResultOpt Matcher::analyze() const std::vector Matcher::preproc_and_match(const cv::Mat& image, const MatcherConfig::Params& params) { std::vector results; + + // Image-side color conversions: compute once, reuse across all templates + cv::Mat image_match; + cv::cvtColor(image, image_match, cv::COLOR_BGR2RGB); + + cv::Mat image_gray; + if (!params.mask_ranges.empty() || !params.color_scales.empty()) { + cv::cvtColor(image, image_gray, cv::COLOR_BGR2GRAY); + } + + cv::Mat image_hsv; + for (size_t i = 0; i != params.templs.size(); ++i) { const auto& ptempl = params.templs[i]; auto method = MatchMethod::Ccoeff; @@ -134,14 +146,18 @@ std::vector Matcher::preproc_and_match(const cv::Mat& image, } cv::Mat matched; - cv::Mat image_match, image_count, image_gray; cv::Mat templ_match, templ_count, templ_gray; - cv::cvtColor(image, image_match, cv::COLOR_BGR2RGB); cv::cvtColor(templ, templ_match, cv::COLOR_BGR2RGB); - cv::cvtColor(image, image_gray, cv::COLOR_BGR2GRAY); - cv::cvtColor(templ, templ_gray, cv::COLOR_BGR2GRAY); + if (!image_gray.empty()) { + cv::cvtColor(templ, templ_gray, cv::COLOR_BGR2GRAY); + } + + cv::Mat image_count; if (method == MatchMethod::HSVCount) { - cv::cvtColor(image, image_count, cv::COLOR_BGR2HSV); + if (image_hsv.empty()) { + cv::cvtColor(image, image_hsv, cv::COLOR_BGR2HSV); + } + image_count = image_hsv; cv::cvtColor(templ, templ_count, cv::COLOR_BGR2HSV); } else if (method == MatchMethod::RGBCount) {