python手机自动化截图_python UI自动化截图对比

目前有个想法,就是将UI截图与自动化截图进行对比。不一致的情况下提示错误

截图对比方法有:

import cv2

import numpy as np

# 均值哈希算法

def aHash(img):

# 缩放为8*8

img = cv2.resize(img, (8, 8))

# 转换为灰度图

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# s为像素和初值为0,hash_str为hash值初值为''

s = 0

hash_str = ''

# 遍历累加求像素和

for i in range(8):

for j in range(8):

s = s + gray[i, j]

# 求平均灰度

avg = s / 64

# 灰度大于平均值为1相反为0生成图片的hash值

for i in range(8):

for j in range(8):

if gray[i, j] > avg:

hash_str = hash_str + '1'

else:

hash_str = hash_str + '0'

return hash_str

# 差值感知算法

def dHash(img):

# 缩放8*8

img = cv2.resize(img, (9, 8))

# 转换灰度图

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

hash_str = ''

# 每行前一个像素大于后一个像素为1,相反为0,生成哈希

for i in range(8):

for j in range(8):

if gray[i, j] > gray[i, j + 1]:

hash_str = hash_str + '1'

else:

hash_str = hash_str + '0'

return hash_str

# 感知哈希算法(pHash)

def pHash(img):

# 缩放32*32

img = cv2.resize(img, (32, 32)) # , interpolation=cv2.INTER_CUBIC

# 转换为灰度图

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 将灰度图转为浮点型,再进行dct变换

dct = cv2.dct(np.float32(gray))

# opencv实现的掩码操作

dct_roi = dct[0:8, 0:8]

hash = []

avreage = np.mean(dct_roi)

for i in range(dct_roi.shape[0]):

for j in range(dct_roi.shape[1]):

if dct_roi[i, j] > avreage:

hash.append(1)

else:

hash.append(0)

return hash

# 通过得到RGB每个通道的直方图来计算相似度

def classify_hist_with_split(image1, image2, size=(256, 256)):

# 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值

image1 = cv2.resize(image1, size)

image2 = cv2.resize(image2, size)

sub_image1 = cv2.split(image1)

sub_image2 = cv2.split(image2)

sub_data = 0

for im1, im2 in zip(sub_image1, sub_image2):

sub_data += calculate(im1, im2)

sub_data = sub_data / 3

return sub_data

# 计算单通道的直方图的相似值

def calculate(image1, image2):

hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])

hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])

# 计算直方图的重合度

degree = 0

for i in range(len(hist1)):

if hist1[i] != hist2[i]:

degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))

else:

degree = degree + 1

degree = degree / len(hist1)

return degree

# Hash值对比

def cmpHash(hash1, hash2):

n = 0

# hash长度不同则返回-1代表传参出错

if len(hash1)!=len(hash2):

return -1

# 遍历判断

for i in range(len(hash1)):

# 不相等则n计数+1,n最终为相似度

if hash1[i] != hash2[i]:

n = n + 1

return n

img1 = cv2.imread('openpic/x1y2.png') # 11--- 16 ----13 ---- 0.43

img2 = cv2.imread('openpic/x2y4.png')

img1 = cv2.imread('openpic/x3y5.png') # 10----11 ----8------0.25

img2 = cv2.imread('openpic/x9y1.png')

img1 = cv2.imread('openpic/x1y2.png') # 6------5 ----2--------0.84

img2 = cv2.imread('openpic/x2y6.png')

img1 = cv2.imread('openpic/t1.png') # 14------19---10--------0.70

img2 = cv2.imread('openpic/t2.png')

img1 = cv2.imread('openpic/t1.png') # 39------33---18--------0.58

img2 = cv2.imread('openpic/t3.png')

hash1 = aHash(img1)

hash2 = aHash(img2)

n = cmpHash(hash1, hash2)

print('均值哈希算法相似度:', n)

hash1 = dHash(img1)

hash2 = dHash(img2)

n = cmpHash(hash1, hash2)

print('差值哈希算法相似度:', n)

hash1 = pHash(img1)

hash2 = pHash(img2)

n = cmpHash(hash1, hash2)

print('感知哈希算法相似度:', n)

n = classify_hist_with_split(img1, img2)

print('三直方图算法相似度:', n)

由于截图对比要求较高,我选择差值哈希算法。

具体截图代码如下

对比代码

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浮点型数据的输出格式

2019独角兽企业重金招聘Python工程师标准>>> float的占位符为f%,默认输出六位小数,如果要限制位数的输出,可以用%.2f这样的格式,double同上。 如果是浮点型转换成整型不会进行四舍五入,浮点型的输出如果截取了位数进行…

linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)

一、介绍基于TCP协议通过socket实现网络编程常用API 1、读者如果不是很熟悉,可以先看我之前写的几篇博客,有socket,地址结构的理解,更加方便读者理解 地址分别是: 1)、http://blog.csdn.net/u011068702/article/details/56479927 2)、http://blog.csdn.net/u01106870…

VS2010下Boost1.55.0配置

为什么80%的码农都做不了架构师?>>> 打开程序菜单,选择Visual Studio Tools里面的 Visual Studio 命令提示。转到解压后的Boost所在目录,输入Bootstrap,执行完毕会生成b2.exe。输入(目录下的bjam.exe和b2.…

Linux信号实践(3) --信号内核表示

信号在内核中的表示执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在…

第2章 数据认知与预处理

《大数据挖掘及应用》学习笔记。 第2章 数据认知与预处理 2.1 数据分析的定义和流程 数据分析(data analysis)是指用适当的统计分析方法对收集来的大量数据进行分析和解释,提取出有用的信息形成结论,从而对数据加以详细研究和概括总结的过程。 2.1.1 如…

9 C++ Boost 多线程,线程同步

线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死锁 boost 线程递归锁 线程互斥锁,线程同步 unique_lock 锁,离开作用域自动释放 unique_lock 锁 示例 2,可以显式的释…

命令注入_命令注入绕过方式总结

前言命令注入是web中常见的漏洞之一,由于web应用程序未对用户提交的数据做严格的过滤,导致用户输入可以直接被linux或windows系统当成命令执行,一般都会造成严重的危害。常用符号分号(;)多条语句顺序执行时的分割符号。1cmd1;cmd2管道符(|)cm…

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

1、sendto和recvfrom函数介绍 sendto(经socket传送数据) 相关函数 send , sendmsg,recv , recvfrom , socket表头文件 #include < sys/types.h > #include < sys/socket.h >定义函数 int sendto ( int s , const void * msg, int len, unsigned int flags, const…

redis缓存设计要点随谈

在高并发系统中&#xff0c;缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的数据库&#xff0c;系统是很难撑住高并发的冲击。所以缓存设计是系统很关键的一环。1、缓存更新缓存的数据一般都是有有效期的&#xff0c;过了一段时间之后就会失效&am…

集合的结构示意图

转载于:https://blog.51cto.com/8467007/1364724

Java设计模式(8)组合模式(Composite模式)

Composite定义&#xff1a;将对象以树形结构组织起来&#xff0c;以达成“部分&#xff0d;整体” 的层次结构&#xff0c;使得客户端对单个对象和组合对象的使用具有一致性。Composite比较容易理解&#xff0c;想到Composite就应该想到树形结构图。组合体内这些对象都有共同接…

第1章 数据分析概述

《Python数据分析基础教程》学习笔记。 第1章 数据分析概述 1.1 数据的性质 1.1.1 数据的概念 所谓数据就是描述事物的符号&#xff0c;是对客观事物的性质、状态和相互关系等进行记载的物理符号或者是这些物理符号的组合。 在计算机系统中&#xff0c;各种文字、字母、数字符…

Android之通过adb shell getprop、netstat命令看dns、ip

1、查看dns 1)、输入adb shell 2 )、输入getprop ,查看配置 3)、getprop | grep dns 过滤dns 4) 、getprop | grep dns 输出dns 5) 、修改dns 需要root ,然后输入 adb shell 然后输

python testng_单元测试工具 TestNG 使用

写一篇小文&#xff0c;介绍一下 Java 下单元测试工具 TestNG 的使用&#xff0c;代码在 IDEA 环境在编写。单元测试&#xff0c;顾名思义&#xff0c;对系统中原子性的功能进行测试&#xff0c;一般情况下是单元测试是针对某个功能函数的测试。编写单元测试是系统开发中重要的…

AM335x kernel4.4.12 LCD 时钟翻转设置记录

TI AM335x kernel 4.4.12 LCD display 时钟翻转记录 因为公司硬件上已经确定LCD 转LVDS 转换芯片上确认以上升沿时钟为基准&#xff0c;所以只能在软件上调整相关东西。 入口在&#xff1a; drivers/gpu/drm/tilcdc/tilcdc_drv.c入口函数&#xff1a; module_init(tilcdc_drm_i…

Cache占用过多内存导致Linux系统内存不足问题排查

问题描述Linux服务器内存使用量超过阈值&#xff0c;触发报警。问题排查首先&#xff0c;通过free命令观察系统的内存使用情况&#xff0c;显示如下&#xff1a;total used free shared buffers cached Mem: 24675796 24587144 88652 …

第2章 Python与数据分析

《Python数据分析基础教程》学习笔记。 第2章 Python与数据分析 2.1 Python数据分析常用的类库 类库是用来实现各种功能的类的集合。 -1. NumPy NumPy(Numerical Python)是Python科学计算的基础包&#xff0c;提供以下功能&#xff1a; 快速高效的多维数组对象ndarrray是其…

LSPCI具体解释分析

一、PCI简单介绍 PCI是一种外设总线规范。我们先来看一下什么是总线&#xff1a;总线是一种传输信号的路径或信道。典型情况是&#xff0c;总线是连接于一个或多个导体的电气连线&#xff0c;总 线上连接的全部设备可在同一时间收到全部的传输内容。总线由电气接口和编程接…

linux之ip route命令

1.基础知识 1.1 路由 &#xff08;Routing&#xff09; 1.1.1 路由策略 &#xff08;使用 ip rule 命令操作路由策略数据库&#xff09; 基于策略的路由比传统路由在功能上更强大&#xff0c;使用更灵活&#xff0c;它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

违反Apache 2.0许可证再分发被指控,火山引擎回应

文 | 白开水不加糖出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;针对有关违反 Apache 2.0 许可证&#xff0c;重新发行 SkyWalking 的指控&#xff0c;火山引擎方面作出回应称&#xff1a;火山引擎相关负责人表示&#xff0c;火山引擎接到社区反馈后&a…