OpenCV

您所在的位置:网站首页 opencv找图和大漠找图准确率 OpenCV

OpenCV

2024-07-09 21:57| 来源: 网络整理| 查看: 265

针对不同分辨率的匹配操作 项目要求OpenCV模板匹配模板匹配的工作方式模板匹配的匹配方式模板匹配存在的问题 解决方法方法1:直方图+自适应模板匹配结果 方法二:SIFT效果 方法三:灰度匹配+模板匹配结果和结论

项目要求

有一个需要,在UI自动化中,我们需要匹配某个元素在app中的位置,如何获取该元素的位置呢?一般可以通过Automation ID或者XPath,但是,有些控件或者元素,它无法通过这种方法定位,所以,我们把问题抽象成在一张图片中,框出目标元素的位置。

OpenCV模板匹配 模板匹配的工作方式

模板匹配的工作方式跟直方图的反向投影基本一样,大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。 假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的: (1)从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像; (2)用临时图像和模板图像进行对比,对比结果记为c; (3)对比结果c,就是结果图像(0,0)处的像素值; (4)切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到结果图像; (5)重复(1)~(4)步直到输入图像的右下角。 大家可以看到,直方图反向投影对比的是直方图,而模板匹配对比的是图像的像素值;模板匹配比直方图反向投影速度要快一些,但是我个人认为直方图反向投影的鲁棒性会更好。

模板匹配的匹配方式 在OpenCv和EmguCv中支持以下6种对比方式: CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。 CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。 CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。 CV_TM_SQDIFF_NORMED 归一化平方差匹配法 CV_TM_CCORR_NORMED 归一化相关匹配法 CV_TM_CCOEFF_NORMED 归一化相关系数匹配法

根据我的测试结果来看,上述几种匹配方式需要的计算时间比较接近(跟《学习OpenCV》书上说的不同),我们可以选择一个能适应场景的匹配方式。

模板匹配存在的问题

1.对于分辨率不同的图片,它无法正常匹配。在实际的任务中,我们的模板图片可能发生分辨率的改变。 2.对于些许形变的图片,它也无法正常匹配。 3.截图内容无法匹配。

原图:原图 传统匹配结果: test

关于自适应屏幕显示:

#include #include using namespace cv; using namespace std; void Show_Picture() { Mat src = imread("C:/Users/wenhaofu/Desktop/Multi-Scale-Template-Matching-master/test3.png"); if (src.empty()) { printf("could not load image...\n"); return; } namedWindow("input", WINDOW_NORMAL); imshow("input", src); waitKey(0); return; } int main(int artc, char** argv) { Show_Picture(); return 0; }

但是为了完整得显示图片,多次尝试发现,flag参数为WINDOW_NORMAL时才可以在手动调整窗口的条件下显示完整的图片。

解决方法 方法1:直方图+自适应模板匹配 #include #include #include #include #include "histogram.h" #include "GrayMatching.h" struct Best_Rect { Point best_point; Mat best_mat; }; using namespace std; using namespace cv; int match_method = CV_TM_SQDIFF_NORMED; void template_match_demo(Mat& test1, Mat& test2); void histogram(string& s1,string& s2); //C:/Users/wenhaofu/Desktop/Multi-Scale-Template-Matching-master/test1.png //C:/Users/wenhaofu/Desktop/Multi-Scale-Template-Matching-master/button.png int main(int argc, char* argv) { string s1 = "C:/Users/wenhaofu/Desktop/Multi-Scale-Template-Matching-master/test3.png"; string s2 = "C:/Users/wenhaofu/Desktop/Multi-Scale-Template-Matching-master/button.png"; //histogram(s1,s2); clock_t start_time = clock(); graymatching(s1, s2); clock_t end_time = clock(); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3