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

    去年十月微软CEO Satya Nadella在旧金山的活动中说 “微软热爱Linux(Microsoft loves Linux)”,这句话让诸多人感到惊喜.至此之后,您可以在众多Linux和开源的 ...

  2. leetcode Ch1-Search

    一. Binary Search int binarySearch(vector<int> &array, int target) { , hi = array.size() - ...

  3. HBuilder设置APP状态栏

    一. 前言 状态栏就是手机屏幕最顶部的区域,包括了:信号.运营商.电量等信息.通常APP都有属于自己的色调风格,为了达到整体视觉美观,通常会设置状态栏和标题栏的色调设置成一致. 图例: 二.状态栏状态 ...

  4. VSTO 开发

    http://www.cnblogs.com/yangecnu/category/499866.html http://www.cnblogs.com/brooks-dotnet/category/2 ...

  5. Python初学者第十九天 函数(3)

    19day 函数 1.作用域 Python中,一个函数就是一个作用域.所有的局部变量都是放在当前的作用域里面 代码定义完成后,作用域已经生成,作用域链向上查找 2.匿名函数 当需要暂时性的用到一个函数 ...

  6. 5 hbase-shell + hbase的java api

    本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装  .HBase的伪分布模式(1节点)的启动    .HBase ...

  7. January 13 2017 Week 2 Friday

    Those who turn back never reach the summit. 回头的人永远也到不了顶峰. I always turned back on my life road, so i ...

  8. Linux性能监控(程序篇)

    性能数据的监控,除了针对整机进行外,还要求我们对某一运行的程序单独进行.常用的程序监控命令有ps和top. Ps ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入 ...

  9. P1346 电车

    题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定 ...

  10. [19/04/28-星期日] GOF23_结构型模式(享元模式)

    一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...