摘要:微信跳一跳是时下热门的微信小游戏,基本原理是根据按压屏幕的时间控制棋子跳过的距离,使其跳到下一个方块上;现利用Android adb工具,PC端获取实时截图,使用OpenCV库分析图片计算距离,从而计算按压时间传回手机。

环境:Ubuntu18.04、OpenCV3.4.0

步骤:

1、获取Android截图,并传到PC端

adb shell /system/bin/screencap -p /sdcard/screenshot.png

adb pull /sdcard/screenshot.png .

2、程序读入图片并获取ROI

cvLoadImage("screenshot.png", 1);

cvSetImageROI(src, cvRect(0, 600, 1080, 900));

2、对ROI进行模板匹配,找到chess坐标

cvMatchTemplate(src, mode, result, CV_TM_CCOEFF);

3、对ROI灰度处理并边缘检测

cvCvtColor(src,srcGray, CV_BGR2GRAY);

cvCanny( srcGray, dst, 50, 100, 3);

4、对边缘检测结果进行遍历像素点,获取最上与最右(左)的像素 点坐标,从而得出下一方块中心点。

5、计算两个点坐标距离乘相应系数得到时间。

adb shell input swipe  400 400 400 400  time

效果图:

具体代码如下:

  1 #include "cv.h"
  2 #include "highgui.h"
  3 #include <iostream>
  4 #include <unistd.h>
  5 #include <stdio.h>
  6 using namespace std;
  7 using namespace cv;
  8 CvPoint find_chess_point(IplImage* src, IplImage* mode)
  9 {
 10     //模式匹配
 11     IplImage* result;
 12     CvPoint MinLocation, MaxLocation;
 13     double MinValue, MaxValue;
 14     int iwidth = src->width - mode->width + 1;
 15     int iheight = src->height - mode->height + 1;
 16     result = cvCreateImage(cvSize(iwidth, iheight), 32, 1);
 17     cvMatchTemplate(src, mode, result, CV_TM_CCOEFF);
 18     cvMinMaxLoc(result, &MinValue, &MaxValue, &MinLocation, &MaxLocation, NULL);
 19     return cvPoint(MaxLocation.x + (int)mode->width/2, MaxLocation.y + mode->height);
 20 }
 21 CvPoint find_next_point(IplImage* src, CvPoint chess_point, int mode = 0)
 22 {
 23     IplImage* tmp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
 24     cvCvtColor(src, tmp, CV_BGR2GRAY);
 25     cvEqualizeHist(tmp, tmp);
 26     IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
 27     cvCanny(src, dst, 50, 100, 3);
 28     //cvNamedWindow("doCany");
 29     //cvShowImage("doCany", dst);
 30     CvPoint next_point;
 31     if(chess_point.x < 500)//分左右,如果棋子在左侧,目标方块则在右侧
 32     {
 33         /*遍历轮廓上顶点*/
 34         unsigned char *pixel = (unsigned char *)dst->imageData;//指向首地址
 35         for(int row = 0; row < 300 ; ++row)//行扫描
 36         {
 37             for(int col = 500; col < 1000; ++col)//列扫描
 38             {
 39                 if(pixel[row*dst->width + col] == 255)//灰度图Canny边缘处理后轮廓为白色255
 40                 {
 41                     next_point.x = col;
 42                     if(mode == 1)
 43                     {
 44                         /*这是根据chess与target的连线与水平夹角总是30度,只知道横坐标和角度即可算出纵坐标*/
 45                         next_point.y = (int) (chess_point.y - (chess_point.x - next_point.x)/1.732); //根号3
 46                         return next_point;
 47                     }
 48                     /*找到上顶点后,开始遍历右顶点*/
 49                     for(int col_=999; col_ > 500; --col_)//最右列向左遍历
 50                     {
 51                         for(int row_=0; row_ < 400; ++row_)//从上向下遍历
 52                         {
 53                             if(pixel[row_*dst->width + col_] == 255)
 54                             {
 55                                 /*找到右顶点*/
 56                                 next_point.y = row_;
 57                                 cvLine(dst, chess_point, next_point, Scalar(255, 255, 255));
 58                                 cvShowImage("line", dst);
 59                                 cvWaitKey(100);
 60                                 return next_point;
 61                             }
 62                         }
 63                     }
 64                 }
 65             }
 66         }
 67     }
 68     else
 69     {
 70         /*遍历轮廓上顶点*/
 71         unsigned char *pixel = (unsigned char* )dst->imageData;//指向首地址
 72         for(int row = 0; row < 300 ; ++row)//行扫描
 73         {
 74             for(int col = 0; col < 500; ++col)//列扫描
 75             {
 76                 if(pixel[row*dst->width + col] == 255)
 77                 {
 78                     next_point.x = col;
 79                     if(mode == 1)
 80                     {
 81                         /*这是根据chess与target的连线与水平夹角总是30度,只知道横坐标和角度即可算出纵坐标, 这个方法效果好*/
 82                         next_point.y = (int) (chess_point.y - (chess_point.x - next_point.x)/1.732); //根号3
 83                         return next_point;
 84                     }
 85                     /*找到上顶点后,开始遍历右顶点*/
 86                     for(int col_=499; col_ > 0; --col_)//最正中间列向左遍历
 87                     {
 88                         for(int row_=0; row_ < 400; ++row_)//从上向下遍历
 89                         {
 90                             if(pixel[row_*dst->width + col_] == 255)
 91                             {
 92                                 /*找到右顶点*/
 93                                 next_point.y = row_;
 94                                 cvLine(dst, chess_point, next_point, Scalar(255, 255, 255));
 95                                 cvShowImage("line", dst);
 96                                 cvWaitKey(100);
 97                                 return next_point;
 98                             }
 99                         }
100                     }
101                 }
102             }
103         }
104     }
105     return next_point;
106 }
107
108 IplImage* cut_src_img(IplImage* src)
109 {
110     //SetImageROI
111     cvSetImageROI(src, cvRect(40, 700, 1040, 400));//取决于手机分辨率,可以在上一行resize后,其他地方不需要修改
112     cvSaveImage("roi.jpg",src);
113     return cvLoadImage("roi.jpg", 1);
114 }
115
116 float calculate_distance(CvPoint chess_point, CvPoint next_point)
117 {
118     float distance;
119     distance = sqrt(pow(abs(chess_point.x - next_point.x), 2) + pow(abs(chess_point.y - next_point.y), 2));
120     return distance;
121 }
122 void jump_one_jump(float distance, float parameter)
123 {
124     char jump[50];
125     RNG rng;
126     sprintf(jump, "adb shell input swipe %d %d %d %d %d", rng.uniform(400, 700), rng.uniform(1500, 1600), rng.uniform(400, 700), rng.uniform(1500, 1700), (int)(distance * parameter));
127     system(jump);
128 }
129 int main(int argc, char** argv)
130 {
131     IplImage* roi_image = NULL;
132     IplImage* chess_mode = cvLoadImage("jump.png", 1);
133     float distance;
134     CvPoint chess_point, next_point;
135     cvNamedWindow("line",1);
136     for(;;)
137     {
138         system("rm -rf screenshot.png && rm -rf roi.jpg");
139         system("adb shell /system/bin/screencap -p /sdcard/screenshot.png");
140         sleep(0.2);
141         system("adb pull /sdcard/screenshot.png . >/dev/null");//把adb pull命令的shell提示重定向
142         sleep(0.2);
143         IplImage* src = cvLoadImage("screenshot.png", 1);
144         roi_image = cut_src_img(src);//取截图中间部分
145         chess_point = find_chess_point(roi_image, chess_mode);//match找到chess坐标
146         next_point = find_next_point(roi_image, chess_point, 1);//像素点遍历找到target坐标,mode=1效果好
147         //cvLine(roi_image, chess_point, next_point, Scalar(0, 255, 255));
148         //cvShowImage("line",roi_image);
149         //cvWaitKey(100);
150         distance = calculate_distance(chess_point, next_point);//计算距离
151         jump_one_jump(distance, 1.4);
152         sleep(1);
153     }
154     return 0;
155 }

代码链接:https://files.cnblogs.com/files/luoyijie/jump2.0.tar.gz

转载于:https://www.cnblogs.com/luoyijie/p/9164263.html

基于OpenCV的微信跳一跳外挂相关推荐

  1. python+opencv 实现 微信跳一跳外挂

    1.思路: (1).使用adb(Android Debug Bridge)连接手机 通过usb连接 通过无线网络连接(我采用手机开热点,电脑adb连接)这种方式比较复杂,手机要下载一个超级终端,在终端 ...

  2. 微信“跳一跳”外挂制作历程

    微信"跳一跳"外挂制作历程 最近微信出了个"跳一跳"小游戏还挺火的,但是我这种手残人士,小手一滑,棋子就不知道飞哪儿去了.那我气啊,排行榜得拉到底才能看到我的名 ...

  3. 利用Python制作微信跳一跳外挂,微信好友装逼神器!

    导语 前几天在GitHub上看到有人利用Python玩一款名为"跳一跳"的微信小程序,于是打算自己也来试一试,进群:711944363 获取微信跳一跳源码! 演示工具 电脑系统:W ...

  4. 微信跳一跳外挂,无需连接手机

    微信跳一跳外挂,无需连接手机 使用这个软件需满足以下条件: 使用安卓模拟器,我用的是BlueStacks,雷电也可以 安卓模拟器窗口大小用鼠标调为[[409 × 727]]是调窗口大小,不是改分辨率! ...

  5. 微信跳一跳外挂【程序员版,附两个版本的源代码以及为防止跳几下就挂的注意事项,需要自己配置编译器】

    微信跳一跳怎么开挂?微信跳一跳外挂脚本在哪下载? 先来一张图片(有图有真相哈!) 建议不要刷太多,微信有防作弊措施,分数太高会上传失败(一千左右就行了). 需要下载:Auto.js(js脚本解释器和运 ...

  6. 微信跳一跳外挂【普通版,不需要自己搞解释器和代码,兼容性更好,反微信防作弊系统更有效】

    微信跳一跳怎么开挂?微信跳一跳外挂脚本在哪下载? 我发现现在网上有一款名叫"游戏窝蜂"的app,里面有微信跳一跳外挂,开挂比较简单,不需要自己搞什么解释器和代码,点几下就行了.并且 ...

  7. 基于java+opencv的微信跳一跳辅助

    一.前言     写这个只是为了练习java跟opencv来做图像识别,并不是以刷分作为初衷,而且分数高了也提交不上去,会说存在可疑操作,不知道它的检测机制是怎样的,可能是触摸坐标还有间隔时间一直没变 ...

  8. python微信点赞脚本_用OpenCV-python的微信跳一跳外挂脚本

    微信跳一跳好像火了很久了,我才开始接触,作为一个手残党, 玩了几次不到20分,打算直接放弃了.但作为一个技术宅,下一反应肯定是"上脚本".最初想法是用arduino(不会可以学啊) ...

  9. 微信跳一跳外挂辅助流程 (MAC+iOS)

    微信跳一跳瞬间火爆朋友圈, 但是手残过不了200, 就研究了一下网上的外挂. 用的是MAC加上iPhone6s 主要使用facebook-wda和wechat_jump_game 以下是具体步骤 安装 ...

最新文章

  1. 如何使用来电盒--宇然电脑公司管理软件
  2. vivado实现VGA
  3. python中表头格式错误导入_python读csv文件时指定行为表头或无表头的方法
  4. nginx訪問php配置,thinkphp5配置nginx访问
  5. 详解Windows内存分页机制
  6. 二进制转换 html,javascript 处理回传的二进制图像并显示在html上
  7. 【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing
  8. 2013年思杰合作伙伴移动性解决方案巡展
  9. TinyMC编辑器简介
  10. 详细剖析PS软件中的通道原理,让你完全理解颜色通道与Alpha通道
  11. Liunx free命令
  12. Android开发——H5容器加载速度优化方案
  13. JAVA Swing主题 简洁扁平化苹果风格主题
  14. 鲁大师从服务器获取信息失败怎么办,云服务器 鲁大师
  15. JS JQuery实现简单的鼠标移动动画效果
  16. SUMO(五)—— TraCI练习
  17. 深度 | Nature论文:无监督表征学习,用电子健康病历增强临床决策
  18. 永信至诚蔡晶晶:用有温度的技术培育信息时代的安全感
  19. java基础(1)—1
  20. D. Divide(math)[2021 ECNU Campus Invitational Contest]

热门文章

  1. 笔记本打开计算机里面没字,笔记本电脑来不了机怎么处理?一开机就全是英文字母,就是开不了机!...
  2. win10打开热点提示:我们无法设置移动热点
  3. prometheus监控redis
  4. 微信小程序(图像识别)腾讯云、百度智能云API(含源码)
  5. 妻子朋友谈眼里的快播CEO 曾想打造中国的Adobe
  6. 以太网PHY原理介绍
  7. 我的win8期待 新功能 新特性 新改进
  8. python编写程序、自动生成宿舍的组合名_基于python的寝室管理系统
  9. vscode使用指南:进入全屏退出全屏模式
  10. 单行文本和多行文本的省略号