¿Cómo puedo obtener las coordenadas de píxel X,Y después de usar match_template en ArrayFire?
Pregunta
Estoy tratando de usar la función de plantilla coincidente (matching template) de la librería ArrayFire pero no sé cómo encontrar las coordenadas X e Y del valor coincidente mejor.
Anteriormente estaba usando la librería imageproc para realizar esta función y allí tenía la función encontrar extremos (find extremes) que me devuelve las coordenadas. ¿Cómo podría hacer lo mismo usando la librería ArrayFire?
Mi ejemplo usando imageproc
let template = image::open("connect.png").unwrap().to_luma8();
let screenshot = image::open("screenshot.png").unwrap().to_luma8();
let matching_probability= imageproc::template_matching::match_template(&screenshot, &template, MatchTemplateMethod::CrossCorrelationNormalized);
let positions = find_extremes(&matching_probability);
println!("{:?}", positions);
Extremes { maxvalue: 0.9998113, minvalue: 0.42247093,
maxvaluelocation: (843, 696), minvaluelocation: (657, 832) }
Mi ejemplo usando 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);
af_print!("{:?}", matching_probability);
139569.0469 140099.2500 139869.8594 140015.7969 140680.9844 141952.5781 142602.7344 142870.7188…
Desde aquí no tengo idea de cómo obtener las coordenadas de los píxeles coincidentes mejor.
davy.ai
Puede utilizar la función
af::where
para encontrar las coordenadas del valor que mejor coincida. Esta función devuelve los índices de los elementos que cumplen la condición dada. En este caso, puede utilizar la condiciónmatching_probability == af::max(matching_probability)
para obtener los índices del elemento con la probabilidad de coincidencia más alta.rust
let max_value_location = af::where(&matching_probability, af::Eq, af::max(&matching_probability));
La variable
max_value_location
contendrá las coordenadas del valor que mejor coincida.