淘宝玩个球有辅助吗 淘宝玩个球介绍( 二 )


改用Java语言之后, 原来的图像处理库就不能用了 。经过搜索发现java提供图片读取的处理的功能 。
import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;Process captureProcess = Runtime.getRuntime().exec(captureCommand);// TRYcaptureProcess.waitFor();// 等待截图完成File f = new File(D:ss.png);BufferedImage image = ImageIO.read(f);result = handle(image, 815);// CATCH// 省略
判断函数如下, 读取一行像素缓存到数组中, 然后判断这一行有多少个红色, 多少个蓝色
static int[] colors = new int[1080];// 处理图片 返回true代表红色public static boolean handle(BufferedImage image, int row) throws Exception {int blue = 0;int red = 0;image.getRGB(0, row, 1080, 1, colors, 0, image.getWidth());// 获得第row行像素for (int i = 0; i1080;i) {Color color = new Color(colors[i]);int r = color.getRed();int g = color.getGreen();int b = color.getBlue();if (r = 250g = 94g = 103b = 97b = 103) red;if (r = 50r = 56g = 250b = 250) blue;}if (red10blue10)throw new Exception(异常状况! blue=bluered=red);return redblue;}
1.2.3 一次判断多行
从每一张截图都可以得到4个方块的颜色, 所以首先想到的是一次输出4个命令.
bool result[4];result[0] = check(895, image);result[1] = check(815, image);result[2] = check(737, image);result[3] = check(658, image);while (i4) {if (result[i])// finput swipe 615 1600 615 500endl;finput tap284rand() % 30 - 151606rand() % 30 - 15endl;elsefinput tap797rand() % 30 - 151608rand() % 30 - 15endl;i;}
这样做的结果还是失败. 设4个方块为一组, 组内的问题解决了,组之间仍然需要root授权、截屏等漫长的操作 。
解决方案是3个方块为一组. 在刚跳到方块2, 还没开始到方块3的起跳时马上进行截图, 并发出命令(要过一会才会真正执行)

淘宝玩个球有辅助吗 淘宝玩个球介绍

文章插图
if (firstTime)result[0] = handle(image, 895);// 判断第一行result[1] = handle(image, 815);// 判断第二行result[2] = handle(image, 737);// 判断第三行result[3] = handle(image, 658);// 判断第四行
1.3 本阶段总结
步数越多,小球下落的速度就越快 。受限于截图速度和发送命令的速度,做到这里程序可以实现跳140步 。
第二阶段: 经过拍照进行判断
2.1 基本步骤
由于截屏速度太慢, 所以我想对手机屏幕拍照, 然后用照片来判断, 这样获得照片的延迟就很小了.
基本步骤如下
1) 拍照2) 判断颜色3) 发送命令
2.1.1 拍照
JavaCV是一款开源的视觉处理库,基于GPLv2协议,对各种常用计算机视觉库封装后的一组jar包,封装了OpenCV、libdc1394、OpenKinect、videoInput和ARToolKitPlus等计算机视觉编程人员常用库的接口 。
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();//开始获取摄像头数据CanvasFrame canvas = new CanvasFrame(摄像头);//新建一个窗口canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);canvas.setAlwaysOnTop(true);Frame f = grabber.grab();// 获得一帧图像canvas.showImage(f);// 显示到窗口中
2.1.2 判断颜色
经过摄像头拍照, 方块的颜色已经不是纯色, 外加摄像头有自动调节色温和亮度和功能, 游戏背景的变化让摄像头不断进行调节, 导致直接判断某一块像素的颜色是否在某个区间已经很不准确了.
淘宝玩个球有辅助吗 淘宝玩个球介绍

文章插图
我的方案是将两个红色矩形圈住的像素颜色的平均值作为参数(共6个,R1 G1 B1 R2 G2 B2),进行线性分类 。
从摄像头采集大量数据(共8000帧)进行训练,4种情况 (左蓝 右蓝 左红 右红)各2000帧 。使用某人写的一个fisher线性判别法的分类器(链接)求出线性分类器所需的参数
【淘宝玩个球有辅助吗 淘宝玩个球介绍】

推荐阅读