• Android修行手册 - 模板匹配函数matchTemplate详解,从N张图片中找到是否包含五星


    👉关于作者

    专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
    有什么需要欢迎底部卡片私我,交流让学习不再孤单

    在这里插入图片描述

    👉实践过程

    😜啥是模板匹配

    OpenCV中的模板匹配功能是用于在较大图像中搜索和查找模板图像位置的函数。OpenCV提供matchTemplate()方法来实现模板匹配功能。模板匹配结果返回的是灰度图像,其中每个像素表示该像素的邻域与模板匹配程度。假设输入图像的大小(W * H),模板图像的大小为(w * h),则输出图像的大小将为(W - w + 1,H - h + 1)。获得结果后,可以使用minMaxLoc()方法查找最大/最小值位置,并将其作为矩形的左上角,以(w,h)作为矩形的宽度和高度来确定模板匹配到的区域。

    但是要注意了,该功能会将相似的也识别出来,因为他返回的是最相近值(变动的),而不是一个肯定值。也就是你没法用一个临界值来判断到底是不是包含真正你想要找的。

    比如有这样一个应用场景,从多款手机不同位置进行了星级评分操作,然后进行截图保存。
    想要从这么多照片自动化处理判断是否为五星评分。
    那么你就需要准备一个五星的模板图片,并且尽量仅包含五星内容。然后利用OpenCV的方法进行查找匹配。
    理想状态下是找到并且刚好找到那个位置。但是因为手机分辨率的不同,屏幕截图内容的差异性,会造成OpenCV只能做到识别最相似的。如有张图片是四星,刚好旁边有个和星类似颜色的内容,这块区域就会识别成最相似内容并返回。但这根本没法实现自动给他评定是否为五星。

    那么有的人又说了,取最小的相似值不就好了么,等于或小于这个值就表示正确。我们假定最相似值为0,

    if(得到的识别值<=0){
    //这张图片包含五星
    }
    
    • 1
    • 2
    • 3

    当你实际识别的时候,会发现从N张图片查找的时候可能会发现有的五星返回的是0.1或0.01这些值。不会进入 if 判断,你能说这张图片不是五星?
    为啥?你的模板图片只有一张固定的,在不同分辨率多样化的图片上肯定有所差异。
    除非你所有的图片内容及分辨率一致,只有星的数量不同,才可做到。

    题外:想要实现上面的需求,OpenCV确实可以做到,只不过是里面其他的知识。我之前给别人做过自动化的识别,对方的业务是帮助软件或游戏公司做评分操作,会下发给平时做兼职的人,比如某些兼职平台,人们评分做完后上传截图,然后查看截图是否五星,五星表示完成任务,兼职完成可发钱。 看截图是很枯燥的,自动化舒服的很。千条数据只需不到一分钟。因为业务简单碰巧截图无干扰因素,识别率百分百。

    😜原理?

    算法核心原理就不探究了,大佬们感兴趣可自行搜索或看官方文档。博主通常是能用,知道中层知识,能满足业务就够了。比如人们用电脑,并不需要去深究电脑是怎么生产的。

    😜API解析

    public static void matchTemplate(Mat image, Mat templ, Mat result, int method, Mat mask) 
    
    
    • 1
    • 2

    在这里插入图片描述
    如图所示:

    • 参数一:image,待匹配图像。必须是8位或者32位浮点图像。
    • 参数二:templ,模板图像,类型与输入图像一致,并且大小不能大于源图像。
    • 参数三:result,输出结果,必须是单通道32位浮点数,假设源图像WH,模板图像wh, 则结果必须为(W-w+1)*(H-h+1)的大小。
    • 参数四:method(如上图有六种),匹配方式标志位。若为TM_SQDIFF或者TM_SQDIFF_NORMED,计算值越小,匹配度越高,反之匹配越差,剩下的几个标志位,计算值越大,匹配度越高,反之匹配越差。
    • 参数五:mask,可选掩码。必须和templ参数大小相同,要么和templ通道数相同,要么单通道。如果数据类型为#CV_8U,则将掩码解释为二进制掩码,表示仅使用掩码为非零的元素,并且权重与实际掩码值无关(一直等于1)。若数据类型为#CV_32F,掩码值将作为权重参与计算。

    如果你想将内容归一化,方便你处理业务,就需要利用 minMaxLoc 函数来处理。

    minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
    函数中的参数有:
    result: 匹配结果矩阵
    &minVal 和 &maxVal: 在矩阵 result 中存储的最小值和最大值
    &minLoc 和 &maxLoc: 在结果矩阵中最小值和最大值的坐标.
    Mat(): 可选的掩模
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    源码就不放出了,里面有很多相关内容和类的互相引用,放一点读者复制运行不起来,都放出来又太多。干脆点。
    直接下方V联系我发你我弄好的 Android 工程。

    👉其他

    📢作者:小空和小芝中的小空
    📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
    📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

    温馨提示点击下方卡片获取更多意想不到的资源。
    空名先生

  • 相关阅读:
    【NLP屠夫系列】- NER之实战BILSTM
    7.Vue2-循环语句的用法
    javaScript深拷贝和浅拷贝简单梳理
    php8.1-common : 依赖: libffi6 (>= 3.2) 但无法安装它(树莓派4B kali)
    Transformer详解学习
    使用EasyExcel导出复杂报表
    社区通过!Interim Grant Program提案详细内容(包含申请Grants链接)
    【亲测】简易商城小程序源码-易优CMS后台
    【广州华锐互动】煤矿坍塌VR事故警示教育突破了哪些限制?
    618过后,该如何做视频号?
  • 原文地址:https://blog.csdn.net/qq_27489007/article/details/134275464