做过移动端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实现图片定位相关推荐

  1. python +opencv 根据图片定位进行UI自动化

    python +opencv 根据图片定位进行UI自动化 前言: 做过移动端ui自动化的小伙伴,就会发现很多控件的元素是一样的或者是找不到的,为了解决这个痛点,于是通过图片灰度处理返回坐标x,y找到控 ...

  2. Python+opencv实图片定位

    # -*- coding: utf-8 -*- import cv2file=r'D:/Setting.png' #大图 temp=r'D:/Battery.png' #小图# 弹出图片后 CTRL+ ...

  3. python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和 ...

  4. python opencv 得到图片路径image_path的宽wide、高heigh和深度deep

    python opencv 得到图片路径image_path的宽wide.高heigh和深度deep 图片路径是:'1.jpg' 下面是具体代码: import cv2 #得到图片路径image_pa ...

  5. Java调用python脚本

    Java调用python脚本 最近也是刚开始学python,所以这里写了一个简单的小方法用Java来调用python脚本.后期再进行更新. 1.Java启动程序的方法 在Java中提供了两种方法来启动 ...

  6. Java调用Python遇到的一系列问题与解决方案

    Java调用Python遇到的一系列问题与解决方案 参考文章: (1)Java调用Python遇到的一系列问题与解决方案 (2)https://www.cnblogs.com/CQUTWH/p/593 ...

  7. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  8. 2021-01-07 python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和亮 ...

  9. 【Java】使用Java调用Python的四种方法

    写在前面 为啥一个好好的岗位是Java开发工程师要去做写python呢?因为产品经理安排的(突然多少有点明白为啥程序员和产品经理会一直开撕).由于在选择企业的时候没看清企业性质,看了要求以为就是互联网 ...

最新文章

  1. Visual Studio 2005 Team System下载地址
  2. Bitcoin.com开发人员正创建一个用Rust语言编写的BCH全节点
  3. linux6系统下用nginx配置https
  4. 23.C++类对象的指针为空时,调用成员函数不会挂掉
  5. 2015年3月-前端开发月刊
  6. POJ 1449 amp; ZOJ 1036 Enigma(简单枚举)
  7. 计算机网络实验中S1是啥意思,某计算机A需要访问域名www.yy.com,它首先向本域DNS服务器S1查询,.._简答题试题答案...
  8. Web前端:11个让你代码整洁的原则
  9. 双十一虽过,李宁老师视频课程优惠仍将继续
  10. 追加画面文言时注意【×硬换行】与【○软换行】
  11. pdf pmp书籍第六版_PMP项目管理 第六版 (带目录完整高清版).pdf
  12. 清明出行之高德路况思考
  13. mysql数据库的单引号用法_数据库SQL语句单引号、双引号的用法
  14. c语言怎么移位,C语言中的移位操作
  15. 中国经典营销案例—农夫山泉
  16. vue3封装-自定义audio音频播放【拖拽进度条,点击进度条,快进,后退,音量加减】思路
  17. 一个简单的格式化信函生成器
  18. 1分钟查找是退回件的快递单号
  19. 2019年最实用的导航栏设计实践和案例分析全解
  20. pixhawk4连接PX4 Flow光流传感器调试过程记录

热门文章

  1. SLAM论文粗译:3D Mapping with an RGB-D Camera
  2. 信息学奥赛一本通1258:数字金字塔
  3. webgl 第三人称相机
  4. 创作者运营—创作者课程开发思路
  5. idea出现Undo Set language level to 6 - @Override in interfaces?
  6. 基于android的新闻系统开发,基于Android的新闻推荐系统的设计与实现
  7. 购房流程 - 新浪网
  8. 要想学会编程,首先先会学习方法!
  9. 流体力学-----连续性方程的推导和理解
  10. Android 进程间通信方式