图像识别相关

1、airtest项目:airtest、poco; 地址: https://github.com/AirtestProject

** pip install -U airtest

** 使用

from airtest.core.api import *

# connect an android phone with adb
init_device("Android")
# or use connect_device api
# connect_device("Android:///")

install("path/to/your/apk")
start_app("package_name_of_your_apk")
touch(Template("image_of_a_button.png"))
swipe(Template("slide_start.png"), Template("slide_end.png"))
assert_exists(Template("success.png"))
keyevent("BACK")
home()
uninstall("package_name_of_your_apk")

  

2、图像识别:形状+颜色:https://blog.csdn.net/zgr957254329/article/details/123891504

import collections
import math

import cv2
import matplotlib.pyplot as plt
import numpy as np


#颜色字典
def ColorList():
    dict = collections.defaultdict(list)
 
    #黑色
    lower_black = np.array([0, 0, 0])
    upper_black = np.array([180, 255, 46])
    color_list = []
    color_list.append(lower_black)
    color_list.append(upper_black)
    dict['black'] = color_list
 
    #灰色
    lower_gray = np.array([0, 0, 46])
    upper_gray = np.array([180, 43, 220])
    color_list = []
    color_list.append(lower_gray)
    color_list.append(upper_gray)
    dict['gray']=color_list
 
    #白色
    lower_white = np.array([0, 0, 221])
    upper_white = np.array([180, 30, 255])
    color_list = []
    color_list.append(lower_white)
    color_list.append(upper_white)
    dict['white'] = color_list
 
    #粉色
    lower_pink = np.array([156, 43, 46])
    upper_pink = np.array([180, 255, 255])
    color_list = []
    color_list.append(lower_pink)
    color_list.append(upper_pink)
    dict['pink']=color_list
 
    #红色
    lower_red = np.array([0, 43, 46])
    upper_red = np.array([10, 255, 255])
    color_list = []
    color_list.append(lower_red)
    color_list.append(upper_red)
    dict['red'] = color_list
 
    #橙色
    lower_orange = np.array([11, 43, 46])
    upper_orange = np.array([25, 255, 255])
    color_list = []
    color_list.append(lower_orange)
    color_list.append(upper_orange)
    dict['orange'] = color_list
 
    #黄色
    lower_yellow = np.array([26, 43, 46])
    upper_yellow = np.array([34, 255, 255])
    color_list = []
    color_list.append(lower_yellow)
    color_list.append(upper_yellow)
    dict['yellow'] = color_list
 
    #绿色
    lower_green = np.array([35, 43, 46])
    upper_green = np.array([77, 255, 255])
    color_list = []
    color_list.append(lower_green)
    color_list.append(upper_green)
    dict['green'] = color_list
 
    #青色
    lower_cyan = np.array([78, 43, 46])
    upper_cyan = np.array([99, 255, 255])
    color_list = []
    color_list.append(lower_cyan)
    color_list.append(upper_cyan)
    dict['cyan'] = color_list
 
    #蓝色
    lower_blue = np.array([100, 43, 46])
    upper_blue = np.array([124, 255, 255])
    color_list = []
    color_list.append(lower_blue)
    color_list.append(upper_blue)
    dict['blue'] = color_list
 
    # 紫色
    lower_purple = np.array([125, 43, 46])
    upper_purple = np.array([155, 255, 255])
    color_list = []
    color_list.append(lower_purple)
    color_list.append(upper_purple)
    dict['purple'] = color_list
 
    return dict

#颜色判断
def findColor(imgcut):
    img_hsv=cv2.cvtColor(imgcut,cv2.COLOR_BGR2HSV)
    color_dict=ColorList()
    #print(color_dict)
    color_most=0
    color_now=None
    for color in color_dict:
        #二值化 和颜色字典比较 在上下限之间的像素变为255,之外的所有像素变为0
        color_cmp=cv2.inRange(img_hsv,color_dict[color][0],color_dict[color][1])
        #膨胀 使颜色分割成块并更突出
        color_boom = cv2.dilate(color_cmp,None,iterations=1)
        #取出每一小块
        contours,hierarchy=cv2.findContours(color_boom.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
        color_area=0
        for img in contours:
            color_area+=cv2.contourArea(img)
        if(color_area>color_most):
            color_most=color_area
            color_now=color
    return color_now

#计算斜率
def k_count(x1,y1,x2,y2):
    if((x2-x1)==0):
        x2+=0.01
    k=(y2-y1)/(x2-x1)
    if (k==0):
        k+=0.01
    return k

#计算角度
def angle_count(k1,k2):
    angle=math.atan2((k2-k1),(1+k1*k2))
    angle=angle*180/math.pi
    return abs(angle)

#图形处理
def LastButNotLeast(imginit,imgcopy):
    # 灰度化
    img_Gray = cv2.cvtColor(imginit, cv2.COLOR_BGR2GRAY)
    # 高斯平滑
    img_Blur = cv2.GaussianBlur(img_Gray, (3, 3), 1)
    # 边缘检测
    img_Canny = cv2.Canny(img_Blur, 50, 50)
    #得到图片中所有图形的轮廓
    #findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
    contours,hierarchy=cv2.findContours(img_Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    #参数:输入图像,霍夫梯度法,分辨率,最小距离,检测方法的对应的参数*2,半径
    for img in contours:    
        #计算面积 太小就不算了
        area=cv2.contourArea(img)
        if area>80:
            perimeter=cv2.arcLength(img,True)
            #折线化
            side=cv2.approxPolyDP(img,0.01*perimeter,True)
            #print(side)
            #计算有几条线
            sideNum=len(side)
            #print(sideNum)
            #计算边长
            length=[]
            k=[]
            for i in range(0,sideNum):
                if(i+1<sideNum):                
                    l=((side[i][0][0]-side[i+1][0][0])**2+(side[i][0][1]-side[i+1][0][1])**2)**(1/2)
                    ktemp=k_count(side[i][0][0],side[i][0][1],side[i+1][0][0],side[i+1][0][1])
                else:
                    l=((side[i][0][0]-side[0][0][0])**2+(side[i][0][1]-side[0][0][1])**2)**(1/2)
                    ktemp=k_count(side[i][0][0],side[i][0][1],side[0][0][0],side[0][0][1])
                length.append(l)
                k.append(ktemp)
            #print(length)
            #计算角度
            angle=[]
            for i in range(0,sideNum):
                if(i+1<sideNum):
                    ang=angle_count(k[i],k[i+1])
                else:
                    ang=angle_count(k[i],k[0])
                angle.append(ang)
            #print(angle)
            #形状判断
            #三角形
            if sideNum==3:
                tag="triangle"
            #其他四边形
            elif sideNum==4:
                tag="Other quadrilateral"
                flag=0
                #菱形
                err=5
                if(length[1]-err<=length[0]<=length[1]+err):
                    if(length[2]-err<=length[1]<=length[2]+err):
                        if(length[3]-err<=length[2]<=length[3]+err):
                            if(length[0]-err<=length[3]<=length[0]+err):
                                tag="diamond"
                                flag=1
                #矩形
                if(89<angle[0]<91):
                    if(89<angle[1]<91):
                        if(89<angle[2]<91):
                            if(89<angle[3]<91):
                                tag="rectangular"
                                if(flag==1):
                                    tag="square"
            elif sideNum==5:
                tag="pentagon"
            elif sideNum==6:
                tag="hexagon"
            elif sideNum==10:
                tag="five-pointed star"
            elif sideNum>10:
                tag="circle"
            else:
                tag="None"                
            #定个位
            x,y,wide,high=cv2.boundingRect(side)
            #裁剪中心位置
            x0=int(x+(wide/2))
            y0=int(y+(high/2))
            err=25
            imgCut=imginit[(y0-err):(y0+err),(x0-err):(x0+err)]
            color=findColor(imgCut)
            #添加标签
            cv2.rectangle(imgcopy, (x-5, y-5), (x + wide+5, y + high+5), (0, 235, 6), 2)
            cv2.putText(imgcopy, tag,(x, y-28), cv2.FONT_HERSHEY_TRIPLEX, 0.85,(0,0, 255), 1)
            cv2.putText(imgcopy, color,(x, y-5), cv2.FONT_HERSHEY_TRIPLEX, 0.85,(0, 0, 255), 1)

if __name__ == "__main__":
    path=input("图片路径:")
    #path=r"D:\test.png"
    img = cv2.imread(path)
    while(np.all(img==None)):
        print("无法读取图片")
        path=input("图片路径:")
        img = cv2.imread(path)
    img_Copy=img.copy()
    
    #图像处理函数
    LastButNotLeast(img,img_Copy)

    #输出结果
    plt.subplot(1,2,1)
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.title("The original image")

    plt.subplot(1,2,2)
    img_Copy=cv2.cvtColor(img_Copy,cv2.COLOR_BGR2RGB)
    plt.imshow(img_Copy)
    plt.title("The image after processing")

    plt.show()

  

posted @ 2022-06-10 15:36  小毛编  阅读(32)  评论(0编辑  收藏  举报