摘要:微信跳一跳是时下热门的微信小游戏,基本原理是根据按压屏幕的时间控制棋子跳过的距离,使其跳到下一个方块上;现利用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

效果图:

具体代码如下:

 #include "cv.h"
#include "highgui.h"
#include <iostream>
#include <unistd.h>
#include <stdio.h>
using namespace std;
using namespace cv;
CvPoint find_chess_point(IplImage* src, IplImage* mode)
{
//模式匹配
IplImage* result;
CvPoint MinLocation, MaxLocation;
double MinValue, MaxValue;
int iwidth = src->width - mode->width + ;
int iheight = src->height - mode->height + ;
result = cvCreateImage(cvSize(iwidth, iheight), , );
cvMatchTemplate(src, mode, result, CV_TM_CCOEFF);
cvMinMaxLoc(result, &MinValue, &MaxValue, &MinLocation, &MaxLocation, NULL);
return cvPoint(MaxLocation.x + (int)mode->width/, MaxLocation.y + mode->height);
}
CvPoint find_next_point(IplImage* src, CvPoint chess_point, int mode = )
{
IplImage* tmp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, );
cvCvtColor(src, tmp, CV_BGR2GRAY);
cvEqualizeHist(tmp, tmp);
IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, );
cvCanny(src, dst, , , );
//cvNamedWindow("doCany");
//cvShowImage("doCany", dst);
CvPoint next_point;
if(chess_point.x < )//分左右,如果棋子在左侧,目标方块则在右侧
{
/*遍历轮廓上顶点*/
unsigned char *pixel = (unsigned char *)dst->imageData;//指向首地址
for(int row = ; row < ; ++row)//行扫描
{
for(int col = ; col < ; ++col)//列扫描
{
if(pixel[row*dst->width + col] == )//灰度图Canny边缘处理后轮廓为白色255
{
next_point.x = col;
if(mode == )
{
/*这是根据chess与target的连线与水平夹角总是30度,只知道横坐标和角度即可算出纵坐标*/
next_point.y = (int) (chess_point.y - (chess_point.x - next_point.x)/1.732); //根号3
return next_point;
}
/*找到上顶点后,开始遍历右顶点*/
for(int col_=; col_ > ; --col_)//最右列向左遍历
{
for(int row_=; row_ < ; ++row_)//从上向下遍历
{
if(pixel[row_*dst->width + col_] == )
{
/*找到右顶点*/
next_point.y = row_;
cvLine(dst, chess_point, next_point, Scalar(, , ));
cvShowImage("line", dst);
cvWaitKey();
return next_point;
}
}
}
}
}
}
}
else
{
/*遍历轮廓上顶点*/
unsigned char *pixel = (unsigned char* )dst->imageData;//指向首地址
for(int row = ; row < ; ++row)//行扫描
{
for(int col = ; col < ; ++col)//列扫描
{
if(pixel[row*dst->width + col] == )
{
next_point.x = col;
if(mode == )
{
/*这是根据chess与target的连线与水平夹角总是30度,只知道横坐标和角度即可算出纵坐标, 这个方法效果好*/
next_point.y = (int) (chess_point.y - (chess_point.x - next_point.x)/1.732); //根号3
return next_point;
}
/*找到上顶点后,开始遍历右顶点*/
for(int col_=; col_ > ; --col_)//最正中间列向左遍历
{
for(int row_=; row_ < ; ++row_)//从上向下遍历
{
if(pixel[row_*dst->width + col_] == )
{
/*找到右顶点*/
next_point.y = row_;
cvLine(dst, chess_point, next_point, Scalar(, , ));
cvShowImage("line", dst);
cvWaitKey();
return next_point;
}
}
}
}
}
}
}
return next_point;
} IplImage* cut_src_img(IplImage* src)
{
//SetImageROI
cvSetImageROI(src, cvRect(, , , ));//取决于手机分辨率,可以在上一行resize后,其他地方不需要修改
cvSaveImage("roi.jpg",src);
return cvLoadImage("roi.jpg", );
} float calculate_distance(CvPoint chess_point, CvPoint next_point)
{
float distance;
distance = sqrt(pow(abs(chess_point.x - next_point.x), ) + pow(abs(chess_point.y - next_point.y), ));
return distance;
}
void jump_one_jump(float distance, float parameter)
{
char jump[];
RNG rng;
sprintf(jump, "adb shell input swipe %d %d %d %d %d", rng.uniform(, ), rng.uniform(, ), rng.uniform(, ), rng.uniform(, ), (int)(distance * parameter));
system(jump);
}
int main(int argc, char** argv)
{
IplImage* roi_image = NULL;
IplImage* chess_mode = cvLoadImage("jump.png", );
float distance;
CvPoint chess_point, next_point;
cvNamedWindow("line",);
for(;;)
{
system("rm -rf screenshot.png && rm -rf roi.jpg");
system("adb shell /system/bin/screencap -p /sdcard/screenshot.png");
sleep(0.2);
system("adb pull /sdcard/screenshot.png . >/dev/null");//把adb pull命令的shell提示重定向
sleep(0.2);
IplImage* src = cvLoadImage("screenshot.png", );
roi_image = cut_src_img(src);//取截图中间部分
chess_point = find_chess_point(roi_image, chess_mode);//match找到chess坐标
next_point = find_next_point(roi_image, chess_point, );//像素点遍历找到target坐标,mode=1效果好
//cvLine(roi_image, chess_point, next_point, Scalar(0, 255, 255));
//cvShowImage("line",roi_image);
//cvWaitKey(100);
distance = calculate_distance(chess_point, next_point);//计算距离
jump_one_jump(distance, 1.4);
sleep();
}
return ;
}

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

基于OpenCV的微信跳一跳外挂的更多相关文章

  1. C#又能出来装个B了。一步一步微信跳一跳自动外挂

    PS:语言只是载体.思维逻辑才是王道 前天看见了个python的脚本.于是装python.配置环境变量.装pip.折腾了一上午,最终装逼失败. 于是进入博客园,顶部有篇文章吸引了我 .NET开发一个微 ...

  2. 跳一跳外挂的python实现--OpenCV步步精深

    去我的个人网站看看吧 http://opencvblog.com/跳一跳外挂-python实现/ 都在这里啦

  3. Android远程桌面助手扩展之微信跳一跳辅助

    微信跳一跳的外挂辅助已是五花八门,万能的TB上也有了各种明码标价的代练.微信小程序游戏的火爆甚至带火了手游外挂产业.另一方面,跳一跳游戏也在不断更新,防止使用外挂刷高分.Android远程桌面助手支持 ...

  4. 教你用.Net来玩微信跳一跳

    目前开发的所有代码都已经上传到了GitHub.欢迎大家来Star https://github.com/GiantLiu/AutoJump 目前程序分为“全自动版本”和“半自动版本” 全自动版本 We ...

  5. Python操作微信跳一跳

    “跳一跳”这个东西还是今天刚接触到的,看到了python群中有人再问“微信跳一跳的外挂有人写了没”,“早就有了”,“github”,“等着出个更详细的教程教程没看懂,主要没有用过adb”. 不过没关系 ...

  6. 微信跳一跳Python

    微信最新的小程序里面出了个叫“跳一跳”的小游戏,大神们也通过Python实现了自动玩游戏具体代码 如下: Github地址: https://github.com/wangshub/wechat_ju ...

  7. 微信跳一跳辅助自动跳Python

    一.说明 此代码借鉴github一位大神所写,已经做了简化合并处理,如果能成功连上手机并运行,可以实现程序自动玩游戏,刷个1000+的分数轻轻松松 github源码地址 https://github. ...

  8. 微信跳一跳辅助Demo

    [原创] 前几天没事干看别人一直在玩微信上线的那一个跳一跳小游戏,玩着玩着老是掉下去,闲着没事呗 就想了想做一个辅助程序的呗.不过先做的手动版的.自动版的有点麻烦.就不发了.用的Java写的,也就一个 ...

  9. python 微信跳一跳辅助 复现

    本来用的是苹果ios得手机,但是步骤较为复杂,没有吃透,最后妥协用了android的机器搞得. 首先找到大牛的github https://github.com/wangshub/wechat_jum ...

随机推荐

  1. Oracle数据库从入门到精通-分组统计查询

    视频课程:李兴华 Oracle从入门到精通 视频课程学习者:阳光罗诺 视频来源:51CTO学院 整体内容: 统计函数的使用 分组统计查询的实现 对分组的数据过滤 统计函数 在之前我们就学习过一个COU ...

  2. 设计模式(17) 访问者模式(VISITOR) C++实现

    意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态 ...

  3. Win10系统创建关机快捷方式和快捷键的方法,实现一键关机

    想不想关机变得更加简单?在Win10中总有些朋友想要快速的操作体验,所以关机这个经常使用的功能也被设置的更简单,下面小编要分享的是“Win10系统创建关机快捷方式和快捷键的方法”. 1.在win10下 ...

  4. Java学习---XML的读写操作

    DOM4_Jwriter.java package com.ftl.xmlparse; import java.io.File; import java.io.FileNotFoundExceptio ...

  5. contextlib

    contextlib with 语句   上下文 任何对象,只要正确实现了上下文管理,就可以用于with语句. 实现上下文管理是通过__enter__和__exit__这两个方法实现的. 例如,下面的 ...

  6. ZT pthread_detach

    pthread_detach 创 建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出 ...

  7. Aizu 2249 & cf 449B

    Aizu 2249 & cf 449B 1.Aizu - 2249 选的边肯定是最短路上的. 如果一个点有多个入度,取价值最小的. #include<bits/stdc++.h> ...

  8. cheerio数据抓取

    很多语言都能写个爬虫抓取数据,js自然也可以,使用cheerio可以支持css检索,较快捷的获取需要的数据.首先,先把node.js给安装了.可到官网下载.安装好node.js后,使用npm安装che ...

  9. python虚拟环境virtualenv高级篇

    我曾经写过一篇virtualenv的博客:http://www.cnblogs.com/anpengapple/p/5907416.html 总体来讲还是适用的,不过稍微傻了一点.这一篇的内容有两个: ...

  10. redis.conf 具体配置详解

    redis.conf 具体配置详解 # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => ...