一、前言
OpenCV是一个采用C及C++语言编写的开源机器视觉库,使用范围很广,在此不做过多的介绍,详情可以看一下:OpenCV官网 。在此我们稍微探讨一下OpenCV的模板匹配功能。模板匹配,顾名思义,即给定的一张图片中识别并找出模板图所在的位置。如我需要在下图中定位出照片图标的位置,此时我们就需要用到OpenCV的TemplateMatch功能了。
二、必要知识点
在了解功能实现之前先了解一下必要的一些知识点:
cv::Mat
作用:数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵。Mat类由两部分数据组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。Mat在进行赋值和拷贝时,只复制矩阵头,而不复制矩阵,提高效率。如果矩阵属于多个Mat对象,则通过引用计数来判断,当最后一个使用它的对象,则负责释放矩阵。
cv::resize(cv::InputArray src, cv::OutputArray dst, cv::Size dsize)
作用:该函数的作用是将Mat 类的src 等比缩放,然后存放到Mat类的dst中,缩放比例越小性能越高,但识别度越低。
matchTemplate(InputArray image, InputArray templ, OutputArray result, int method)
作用:OpenCV 匹配函数
minMaxLoc(const cv::SparseMat &a, double *minVal, double *maxVal)
作用:整理出本次匹配的最大最小值
cv::Rect
作用:类似CGRect
UIImageToMat(const UIImage *image, cv::Mat &m)
需要导入<opencv2/imgcodecs/ios.h>,作用:将UIImage转为矩阵
三、功能实现
了解以上各函数的作用之后,就可以着手编写代码了。
1、创建模板矩阵(通俗易懂就是我要找的东西,比如下面的相册图标)
代码(请原谅我编写该文档的时候没有使用MarkDown格式。。丑陋地贴一下截图。。):
2、设置原始图(即屏幕截图)
代码:
3、模板比对
代码:
至此,匹配操作已经完成。
效果:
四、Demo
Demo地址为:GitHub
在构建此Demo前,由于Git 100M的限制,请先下载iOS的OpenCV的SDK,将opencv2.framework文件导入到工程的根目录,下载地址为:opencv2.framework
如果该文章对您有帮助,Git上求个Star。谢谢各位~