iOS OpenCV 图像识别-模板匹配

一、前言

        OpenCV是一个采用C及C++语言编写的开源机器视觉库,使用范围很广,在此不做过多的介绍,详情可以看一下:OpenCV官网 。在此我们稍微探讨一下OpenCV的模板匹配功能。模板匹配,顾名思义,即给定的一张图片中识别并找出模板图所在的位置。如我需要在下图中定位出照片图标的位置,此时我们就需要用到OpenCV的TemplateMatch功能了。


ScreenShot

二、必要知识点

       在了解功能实现之前先了解一下必要的一些知识点:

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。谢谢各位~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容