图像识别相关
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()