使用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
相关产品推荐
相关产品推荐

