OpenCV实现图像识别

  1. 图像识别匹配算法
    1) 模板匹配:对要操作的画面元素进行单独的截图,将该截图视作模板,利用这个模板在屏幕或当前窗口进行搜索匹               配,找到符合条件的区域,并提取出中心点坐标的过程,称为模板匹配。
           局限性:当比例或旋转角度发生变化时难以应对,会匹配失败
    2) 滑动比对:RGBA,A指Alpha通道的意思,图层透明度
    3) 匹配度/相似度(similarity):主要用于解决图像匹配过程中的容错问题,像素点的匹配个数浮动范围,像素点具体的           RGBA值得浮动范围,如果只关注轮廓,可以采用转为黑白图的处理方法
    补充:常见问题:
               a. 运算量过大:采用特征点进行初步筛选,比如先对比四个角和中心位置
               b. 图片内容重复多时容易匹配多个结果:在截取模板时可以适度截大一些,多增加整个模板的特征点
               c. 移动端的图像识别特点:有很多图像比例变化的情况
  2. OpenCV常用API
    1) matchTemplate,包含三个参数,要对比的图像和模板图像,method参数是模板匹配的算法,主要有六种:
           a) 利用平方差进行匹配,最好为0,匹配越差,匹配值越大
               CV.TM_SQDIFF 平方差匹配
               CV.TM_SQDIFF_NORMED 标准平方差匹配
           b) 采用模板和图像间的乘法操作,数越大表示匹配程度越高,0为最坏
               CV.TM_CCORR 相关性匹配
               CV.TM_CCORR_NORMED 标准相关性匹配
           c) 将模板对其均值的相对值与图像对其均值的相对值进行匹配,1表示完美匹配,0表示没有任何相关性(随机序列)
               
    CV.TM_CCOEFF 相关系数匹配
               CV.TM_CCOEFF_NORMED 标准相关系数匹配
           返回值为一个矩阵,矩阵为每个像素点上模板匹配的结果
           六种方法算法复杂度越来越高,精度也越来越高,运算开销越来越多
    2) minMaxLoc,在给定矩阵中寻找最大和最小值,并给出它们的位置,要求传入参数有src,是一个矩阵图像(二维数             组),返回值为一个元祖类型的数据,分别为min_val, max_val, min_loc, max_loc
  3. OpenCV使用范例
    # 算法思路:
    # 1.使用ImageGrab抓取当前窗口的截图
    # 2.使用opencv进行截图与模板的匹配
    # 3.处理匹配结果,进行断言
    
    import cv2 as cv
    import os
    from PIL import ImageGrab
    
    class ImageMatchByCV:
    
        @staticmethod
        def match_image(target):
            """对比当前窗口与模板,找到返回中心点坐标,未找到返回-1,-1"""
            # 抓取当前屏幕截图
            screen_path = os.path.join(base_path, "screen.png")
            ImageGrab.grab().save(screen_path)
            # 使用opencv打开模板图片与截图
            screen = cv.imread(screen_path)
            template = cv.imread(target)
            # 进行比对
            match_results = cv.matchTemplate(screen, template, cv.TM_CCOEFF_NORMED)
            # 处理比对结果
            min_val, max_val, min_loc, max_loc = cv.minMaxLoc(match_results)
            if max_val >= 0.95:
                middle_x = max_loc[0] + int(template.shape[1] / 2)
                middle_y = max_loc[1] + int(template.shape[0] / 2)
                return middle_x, middle_y
            else:
                print("Failed")
                return -1, -1
    
        def check_exists(self, target):
            """对比模板与当前窗口截图,返回bool值"""
            x, y = self.match_image(target)
            return x != -1 and y != -1

     

你可能感兴趣的:(OpenCV,python,UI自动化测试)