Rust 模板匹配——根据指定图片查找处于大图中的位置(支持GPU加速)
01 前言
在手搓RPA
工具的时候,总会碰到不好定位的情况,那么,就需要根据小图来找到对应屏幕上的位置(以图识图
),这个需求也比较简单。想到市面上也有不少RPA
工具都有这个功能,那么人家有的,俺也可以有。
为了性能好一些,考虑C++
和Rust
的实现方案。先用C++
折腾了一番,各种原因吧,没弄成,又不太想用opencv
(只想单纯封装一个以图识图
的功能,用它可能连带搞出来一大坨,不是很喜欢,越简单越好)。于是转到Rust
试试,水平有限,也折腾了不少时间。
先用了imageproc
库(传送)试了,可能姿势不对,贼慢,受不了。
于是又找了半天,看到一个还比较合适的:template_matching
(传送),还支持GPU加速,中间也碰到比较坑的问题,不过嘎嘎香。
02 正文
开发环境:
Windows 11 64bit
VS Code
Cargo.toml
配置:
[package]
name = "find-image"
version = "0.1.0"
edition = "2021"
[dependencies]
image = { version = "0.25.5", optional = true }
template-matching = { version = "0.2.0", features = ["image"] }
[features]
default = ["image"]
image = ["dep:image"]
main.rs
内容:
use std::time::Instant;
use image::{
DynamicImage, GenericImageView};
use template_matching::{
find_extremes, MatchTemplateMethod, TemplateMatcher,Image};
use std::env;
use std::f32;
use std::path::PathBuf;
/**
* 参数
* full_image_path:大图的全路径
* part_image_path:小图的全路径
*/
struct TemplateMatchingArgs {
full_image_path: PathBuf,
part_image_path: PathBuf,
}
/**
* 解析参数
*/
impl TemplateMatchingArgs {
fn parse(args: Vec<String>) -> TemplateMatchingArgs {
if args.len()<