Java 调用Python+Opencv实现图片定位
做过移动端ui自动化的小伙伴,就会发现很多控件的元素是一样的或者是找不到的,为了解决这个痛点,于是通过图片灰度处理返回坐标x,y找到控件的位置。再结合pytest+接口+UI断言整体项目思路。
1.接下来我们主要说一下基于opencv图片识别寻找控件坐标
2. 我们使用两个图,一个是移动端截图,一个是控件的图,
Java代码如下
public static void main(String[] args) {
run_opencv("D:/Search.png", "D:/Setting.png",50,50);
}
public static HashMap<String, Integer> run_opencv(String picturePath,String PagePicturePath,int xPercent,int yPercent) {
HashMap<String, Integer> location = new HashMap<>();
try {
//x,y = get_center_location('D:/Battery.png', 'D:/Setting.png',0,0)
String cmds = String.format("python D:\\Project\\Program\\PythonWorkspace\\myProject\\python_project\\apptest\\myopencv\\other_case\\get_location_by_opencv.py %s %s %d %d", picturePath,PagePicturePath,xPercent,yPercent);
System.out.println("Executing python script for picture location.");
Process pcs = Runtime.getRuntime().exec(cmds);
pcs.waitFor();
Thread.sleep(1000);
// 定义Python脚本的返回值
String result = null;
// 获取CMD的返回流
BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());// 字符流转换字节流
BufferedReader br = new BufferedReader(new InputStreamReader(in));// 这里也可以输出文本日志
String lineStr = null;
while ((lineStr = br.readLine()) != null) {
result = lineStr;//Python 代码中print的数据就是返回值
//xLocation: 147
//yLocation: 212
if(lineStr.contains("xLocation")) {
int x = Integer.parseInt(lineStr.split(":")[1].trim());
location.put("x", x);
}
if(lineStr.contains("yLocation")) {
int x = Integer.parseInt(lineStr.split(":")[1].trim());
location.put("y", x);
}
}
// 关闭输入流
br.close();
in.close();
System.out.println(location.toString());
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
Python代码:
# -*- encoding=utf-8 -*-__author__ = 'Jeff.xie'import cv2 import os import sys import time#获取移动端图片 def screencap():cmd = "adb root"cmd1 = "adb shell /system/bin/screencap -p /sdcard/da.png"cmd2 = "adb pull /sdcard/da.png "os.system(cmd)time.sleep(1)os.system(cmd1)time.sleep(2)os.system(cmd2)def _tran_canny(image):"""消除噪声"""image = cv2.GaussianBlur(image, (3, 3), 0)return cv2.Canny(image, 50, 150)def get_center_location(img_slider_path,image_background_path,x_percent,y_percent):"""get_center_location"""# print("img_slider_path: "+img_slider_path)# print("image_background_path: "+image_background_path)# print("x_percent: "+str(x_percent))# print("y_percent: "+str(y_percent))# java传递过来的参数都是str类型,所以需要强转成int类型xper = int(x_percent)yper = int(y_percent)# # 参数0是灰度模式image = cv2.imread(img_slider_path, 0)template = cv2.imread(image_background_path, 0)# 寻找最佳匹配res = cv2.matchTemplate(_tran_canny(image), _tran_canny(template), cv2.TM_CCOEFF_NORMED)# 最小值,最大值,并得到最小值, 最大值的索引min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)#获得背景图像高和宽src_img = cv2.imread(image_background_path,cv2.IMREAD_GRAYSCALE)h,w = src_img.shape# print("src_img_h:",h)# print("src_img_w:",w)#获得需要寻找图像高和宽des_img = cv2.imread(img_slider_path,cv2.IMREAD_GRAYSCALE)des_img_h,des_img_w = des_img.shape# print("des_img_h:",des_img_h)# print("des_img_w:",des_img_w)trows,tcols = image.shape[:2] #获得图片的宽度,两种方式都可以# print(trows)# print(tcols)top_left = max_loc[0] # 横坐标# 展示圈出来的区域x, y = max_loc# max_loc这个是最大值,所以获取的是x,y位置坐标,小图片右下角的位置,左上角的要用min_loc# print("x:",x)# print("y:",y)xLocation = x + int(des_img_w*xper/100)yLocation = y + int(des_img_h*yper/100)print("xLocation: "+str(xLocation))print("yLocation: "+str(yLocation))# print(max_loc)# print(min_loc)# print(min_val)# print(max_val)return xLocation,yLocation# w, h = image.shape[::-1] # 宽高# cv2.rectangle(template, (x, y), (x + w, y + h), (7, 249, 151), 2)# return top_leftif __name__ == '__main__':# x,y = get_center_location('D:/Battery.png', 'D:/Setting.png',40,39) img_slider_path = sys.argv[1]image_background_path = sys.argv[2]x_percent = sys.argv[3]y_percent = sys.argv[4]get_center_location(img_slider_path, image_background_path,x_percent,y_percent)# 0%# getx: 29# gety: 1390# 50%# getx: 49# gety: 1415# 100%# getx: 69# gety: 1441
Java 调用Python+Opencv实现图片定位相关推荐
- python +opencv 根据图片定位进行UI自动化
python +opencv 根据图片定位进行UI自动化 前言: 做过移动端ui自动化的小伙伴,就会发现很多控件的元素是一样的或者是找不到的,为了解决这个痛点,于是通过图片灰度处理返回坐标x,y找到控 ...
- Python+opencv实图片定位
# -*- coding: utf-8 -*- import cv2file=r'D:/Setting.png' #大图 temp=r'D:/Battery.png' #小图# 弹出图片后 CTRL+ ...
- python opencv调节图片亮度与对比度
python opencv调节图片亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和 ...
- python opencv 得到图片路径image_path的宽wide、高heigh和深度deep
python opencv 得到图片路径image_path的宽wide.高heigh和深度deep 图片路径是:'1.jpg' 下面是具体代码: import cv2 #得到图片路径image_pa ...
- Java调用python脚本
Java调用python脚本 最近也是刚开始学python,所以这里写了一个简单的小方法用Java来调用python脚本.后期再进行更新. 1.Java启动程序的方法 在Java中提供了两种方法来启动 ...
- Java调用Python遇到的一系列问题与解决方案
Java调用Python遇到的一系列问题与解决方案 参考文章: (1)Java调用Python遇到的一系列问题与解决方案 (2)https://www.cnblogs.com/CQUTWH/p/593 ...
- java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...
- 2021-01-07 python opencv调节图片亮度与对比度
python opencv调节图片亮度与对比度 度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和亮 ...
- 【Java】使用Java调用Python的四种方法
写在前面 为啥一个好好的岗位是Java开发工程师要去做写python呢?因为产品经理安排的(突然多少有点明白为啥程序员和产品经理会一直开撕).由于在选择企业的时候没看清企业性质,看了要求以为就是互联网 ...
最新文章
- Visual Studio 2005 Team System下载地址
- Bitcoin.com开发人员正创建一个用Rust语言编写的BCH全节点
- linux6系统下用nginx配置https
- 23.C++类对象的指针为空时,调用成员函数不会挂掉
- 2015年3月-前端开发月刊
- POJ 1449 amp; ZOJ 1036 Enigma(简单枚举)
- 计算机网络实验中S1是啥意思,某计算机A需要访问域名www.yy.com,它首先向本域DNS服务器S1查询,.._简答题试题答案...
- Web前端:11个让你代码整洁的原则
- 双十一虽过,李宁老师视频课程优惠仍将继续
- 追加画面文言时注意【×硬换行】与【○软换行】
- pdf pmp书籍第六版_PMP项目管理 第六版 (带目录完整高清版).pdf
- 清明出行之高德路况思考
- mysql数据库的单引号用法_数据库SQL语句单引号、双引号的用法
- c语言怎么移位,C语言中的移位操作
- 中国经典营销案例—农夫山泉
- vue3封装-自定义audio音频播放【拖拽进度条,点击进度条,快进,后退,音量加减】思路
- 一个简单的格式化信函生成器
- 1分钟查找是退回件的快递单号
- 2019年最实用的导航栏设计实践和案例分析全解
- pixhawk4连接PX4 Flow光流传感器调试过程记录