You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ArrayFire的match_template后如何获取最佳匹配的像素XY坐标

ArrayFire match_template获取最佳匹配坐标解决方案

核心原理

ArrayFire没有内置的find_extremes方法,但可以通过内置的极值查询+索引转换函数实现相同效果,首先需要先明确你使用的匹配方法对应的最佳匹配极值类型:

  • 误差类方法(LSAD/LSD/SAD/SSD):数值越小匹配度越高,取最小值坐标
  • 相关类方法(CCORR/CCORR_NORM/ZSAD等):数值越大匹配度越高,取最大值坐标

你当前使用的是LSAD方法,因此取最小值对应的坐标就是最佳匹配位置。

完整实现代码

在你现有的ArrayFire代码基础上,追加以下逻辑即可:

let template: Array<u8> = arrayfire::load_image(String::from("connect.png"), true);
let screenshot: Array<u8> = arrayfire::load_image(String::from("screenshot.png"), true);

let template_gray = rgb2gray(&template, 0.2126, 0.7152, 0.0722);
let screen_gray =  rgb2gray(&screenshot, 0.2126, 0.7152, 0.0722);
let matching_probability = arrayfire::match_template(&screen_gray, &template_gray, arrayfire::MatchType::LSAD);

// 以下是新增的获取坐标逻辑
let mut min_val = 0.0f64;
let mut max_val = 0.0f64;
let mut min_idx = 0u32;
let mut max_idx = 0u32;

// 查询匹配结果的最大、最小值及对应线性索引
arrayfire::min_all(&mut min_val, &mut min_idx, &matching_probability);
arrayfire::max_all(&mut max_val, &mut max_idx, &matching_probability);

// 线性索引转换为(x,y)平面坐标
let (min_x, min_y, _, _) = arrayfire::ind2sub(&matching_probability.dims(), min_idx as u64);
let (max_x, max_y, _, _) = arrayfire::ind2sub(&matching_probability.dims(), max_idx as u64);

// 输出和imageproc格式一致的结果
println!("Extremes {{ max_value: {}, min_value: {}, max_value_location: ({}, {}), min_value_location: ({}, {}) }}", max_val, min_val, max_x, max_y, min_x, min_y);

// LSAD方法最佳匹配为最小值对应的坐标
println!("最佳匹配坐标:x={}, y={}", min_x, min_y);

注意事项

  • 转换得到的坐标为模板左上角在原图的位置,和imageproc返回的坐标定义完全一致,不需要额外偏移处理
  • 如果你后续切换为相关类匹配方法,直接取max_x、max_y作为最佳匹配坐标即可

内容的提问来源于stack exchange,提问作者Eduardo Vieira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:36:04