基于VS+Opencv2.4.10微信跳一跳辅助工具

最近微信的跳一跳小程序可谓火了一把,不是因为它本身多好玩,而是有大部分的程序员们加入其中,利用各种领域方法,实现了微信跳一跳的外挂,分数轻松上千或上万。之前也看了基于Python开源的代码,GitHub上现在的star已经快超过1W了,简直不敢想。趁着今天礼拜天,在实验室中也简单的实现了一下微信跳一跳的辅助工具,精度还不够高,我跑了一下才到90,纯属娱乐好玩的,后期再继续改进,主要是依赖C++来实现了一下。
环境: Win10+VS2012+Opencv2.4.10+ADB工具
环境的搭建请查阅相关资料!

主要思路:

通过adb图像获取部分大家可以查阅相关资料,代码也很简单:

adb shell screencap -p /sdcard/autojump.png
adb pull /sdcard/autojump.png

利用上面两行代码即可将手机当前的屏幕进行截图并且上传到工程文件路径下。

首先就是在上传的autojump.png图片上进行模板匹配,匹配出小人,并计算小人的坐标;
然后就是通过Canny()函数进行图像的边缘检测,这里使用的阈值为5,10基本可以检测出所有边缘信息;
然后根据一般下一个要跳的地点始终在小人的左半屏或又半屏部分这一先验知识,来进行查找范围的确定,进行行扫描,扫描到的第一个值为255的即返回当前坐标值;然后通过计算与小人坐标的距离即可得到下一步要跳跃的距离,(注:本代码中在下一个坐标的纵坐标进行+50处理,由于本文中只利用了一个关键点进行测试的,这样做是显然不合理的,接下来可以再利用第二个关键点进行下一个跳跃目标中心点的计算),由于本人手机是1080*1920的所以再得到距离过后乘以一个跳跃系数1.35,(这里不同分辨率的手机系数是不一样的),这样就得到了跳跃按压时间,从而通过system()命令进行调用ADB工具进行与手机通讯实现模拟人的点击。本文仅仅是简单的实现了一下看看效果,如果想跑高分还得进行代码的优化与更改!其次因为每次按压的地点肯定是不一样的,而本文也采用简单的同一位置按压,这样做很容易被腾讯反作弊给查出来的,所以这里可以添加一个随机数从而可以简单的避免位置重复!

代码如下:

/*
 时间:2018-1-7
 地点:SHNU
 功能:wechat简单跳一跳C++代码的实现,有待改进,仅供学习之用!欢迎大家提出新算法
*/

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
using namespace std;

//全局变量定义区
Mat srcImage;
Mat dstImage;
Mat Character;
//get_screenshot();获取手机上的图像
void get_screenshot();
//Canny_Dec();边缘检测
void Canny_Dec(Mat& srcImage);
//获取Character坐标
Point get_Character_Loc(Mat& srcImage,Mat& Tem_img);
//获取下一个要跳的点
Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc);
//计算距离
int get_distance(Point& first_point,Point& next_point);
//跳跃
void jump(int&g_distance);
int main(int argc,char** argv)
{
 system("color 3F");
 while (true)
 {
 get_screenshot();
 srcImage = imread("autojump.png");
 dstImage = srcImage.clone();
 Character = imread("./Template/character.png");
 //imshow("Character",Character);
 //cvtColor(srcImage,srcImage,CV_BGR2GRAY);
 Point next_p = get_Character_Loc(srcImage,Character);
 cout<<"next_p:"<<1111<<endl;

 Point get_next = get_next_img_Loc(srcImage,next_p);

 int g_distance = get_distance(next_p,get_next);

 jump(g_distance);
 //cout<<"get_next_img_Loc:"<<get_next<<endl;
 circle(dstImage,get_next,8,Scalar(0,221,2));
 //imshow("test",dstImage);
 imwrite("Canny.png",dstImage);
 _sleep(1500);
 }
 return 0;
}

void get_screenshot()
{
 system("adb shell screencap -p /sdcard/autojump.png");
 system("adb pull /sdcard/autojump.png");
}

Point get_Character_Loc(Mat& srcImage,Mat& Tem_img)
{
 matchTemplate(srcImage,Tem_img,dstImage,CV_TM_SQDIFF);
 double minVal,maxVal;
 Point minLoc,maxLoc,matchLoc;
 minMaxLoc(dstImage,&minVal,&maxVal,&minLoc,&maxLoc,Mat());
 matchLoc = minLoc; //matchLoc是最佳匹配的区域左上角点

 rectangle(srcImage,Rect(matchLoc,Size(Character.cols,Character.rows)),Scalar(255,255,0),1,8,0);
 //Canny(srcImage,srcImage,1,10);
 putText(srcImage,"Wang",Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows),1,2,Scalar(0,0,255));//画出Character小人的坐标
 return Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows);
}

Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc)
{
 cout<<"get_next_img_Loc"<<endl;
 cvtColor(srcImage,srcImage,CV_BGR2GRAY);
 Canny(srcImage,srcImage,5,10);
 imwrite("get_next_img_Loc.png",srcImage);
 //imshow("get",srcImage);
 cout<<"Character_Loc.x:"<<Character_Loc.x<<endl;
 if(Character_Loc.x < 540)
 {
  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)
  {
   uchar* data = srcImage.ptr<uchar>(j);
   for(int i = 1079;i > 540 ;i--)
   {

    if(data[i] == 255)
    {
     return Point(i,j);
     //cout<<"Point:"<<Point(i,j)<<endl;
    }
   }
  }
 }
 else
 {
  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)
  {
   uchar* data = srcImage.ptr<uchar>(j);
   for(int i = 0;i<540;i++)
   {
    if(data[i] == 255)
     return Point(i,j);
   }
  }
 }
}

int get_distance(Point& first_point,Point& next_point)
{
 int A = first_point.x - next_point.x;
 int B = first_point.y - (next_point.y+50);
 return int(pow(pow(A,2)+pow(B,2),0.5));
}

void jump(int&g_distance)
{
 char AA[50];
 int distance_ = g_distance * 1.35;
 sprintf(AA,"adb shell input swipe 320 410 320 410 %d",distance_);
 cout<<AA<<endl;
 system(AA);
}

边缘检测图片:

下一个关键点定位:

上图中画出的小圈圈,不太清晰,将就着看下!小菜水平有限,仅仅是基于好玩就弄了下!

结果:用开源的随便跑跑几百,自己的怎么跑,90 【累哭】

华丽的分割线————————————————

又来更新一下啦!

晚上不想看论文就想到了之前的跳一跳,经过一边显示命令窗口输出和一边显示Canny()边缘化处理终于找到了上次跑的分数低的原因啦!

主要原因如下所示:

如上所示,由于之前选取的Canny()中的阈值为1和10,这导致一旦要跳到的下一个目标物体的颜色和背景色很接近时就很容易使得边缘的梯度小于10,因此就不会被认为是边缘,从而导致上面的这种情况出现。索性今天就将阈值设为3和8,并在Canny()函数前面加上了一个高斯滤波器。如下:

GaussianBlur(srcImage,srcImage,Size(3,3),0);

还有就是上面的_sleep(1500)函数,这里如果闲时间比较久的话也是可以改为1000的,速度上有所提升。
同时加上按压位置的随机数,使得每次按压点都是在(320,410)—(350,460)之间。代码如下:

 int rand_x = int(320+rand()%50); //加上随机数使得每次按压都是在点(320,410)-(370,460)之间
 int rand_y = int(410+rand()%50);
 sprintf(AA,"adb shell input swipe %d %d %d %d %d",rand_x,rand_y,rand_x,rand_y,distance_);

如下图所示:

由上图可知,每次按压的位置都是在变的。

完整版代码如下:

/*
 时间:2018-1-7
 地点:SHNU
 功能:wechat简单跳一跳C++代码的实现,有待改进,仅供学习之用!欢迎大家提出新算法
*/

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<stdlib.h>//rand()随机数头文件

using namespace cv;
using namespace std;

//全局变量定义区
Mat srcImage;
Mat dstImage;
Mat Character;

static int i = 0;
//get_screenshot();获取手机上的图像
void get_screenshot();
//Canny_Dec();边缘检测
void Canny_Dec(Mat& srcImage);
//获取Character坐标
Point get_Character_Loc(Mat& srcImage,Mat& Tem_img);
//获取下一个要跳的点
Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc);
//计算距离
int get_distance(Point& first_point,Point& next_point);
//跳跃
void jump(int&g_distance);
int main(int argc,char** argv)
{
 system("color 3F");
 while (true)
 {
 get_screenshot();
 srcImage = imread("autojump.png");
 dstImage = srcImage.clone();
 Character = imread("./Template/character.png");
 //imshow("Character",Character);
 //cvtColor(srcImage,srcImage,CV_BGR2GRAY);
 Point next_p = get_Character_Loc(srcImage,Character);
 //cout<<"next_p:"<<1111<<endl;

 Point get_next = get_next_img_Loc(srcImage,next_p);

 int g_distance = get_distance(next_p,get_next);

 jump(g_distance);
 //cout<<"get_next_img_Loc:"<<get_next<<endl;
 circle(dstImage,get_next,8,Scalar(0,221,2));
 //imshow("test",dstImage);
 imwrite("Canny.png",dstImage);
 _sleep(1000);
 }
 return 0;
}

void get_screenshot()
{
 system("adb shell screencap -p /sdcard/autojump.png");
 system("adb pull /sdcard/autojump.png");
}

Point get_Character_Loc(Mat& srcImage,Mat& Tem_img)
{
 matchTemplate(srcImage,Tem_img,dstImage,CV_TM_SQDIFF);
 double minVal,maxVal;
 Point minLoc,maxLoc,matchLoc;
 minMaxLoc(dstImage,&minVal,&maxVal,&minLoc,&maxLoc,Mat());
 matchLoc = minLoc; //matchLoc是最佳匹配的区域左上角点
 cout<<"maxVal:"<<maxVal<<endl;
 rectangle(srcImage,Rect(matchLoc,Size(Character.cols,Character.rows)),Scalar(255,255,0),1,8,0);
 //Canny(srcImage,srcImage,1,10);
 putText(srcImage,"Wang",Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows),1,2,Scalar(0,0,255));//画出Character小人的坐标
 return Point(matchLoc.x+Character.cols*0.5,matchLoc.y+Character.rows);
}

Point get_next_img_Loc(Mat& srcImage,Point& Character_Loc)
{
 cout<<"get_next_img_Loc"<<endl;
 cvtColor(srcImage,srcImage,CV_BGR2GRAY);
 GaussianBlur(srcImage,srcImage,Size(3,3),0);
 Canny(srcImage,srcImage,3,8);
 char AA[30];
 sprintf(AA,"get_next_img_Loc_%d.png",i);
 cout<<AA<<endl;
 imwrite(AA,srcImage);
 i++;
 //imshow("get",srcImage);
 cout<<"Character_Loc.x:"<<Character_Loc.x<<endl;
 if(Character_Loc.x < 540)
 {
  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)
  {
   uchar* data = srcImage.ptr<uchar>(j);
   for(int i = 1079;i > 540 ;i--)
   {
    if(data[i] == 255)
    {
     return Point(i,j);
     //cout<<"Point:"<<Point(i,j)<<endl;
    }
   }
  }
 }
 else
 {
  for(int j = int(srcImage.rows*0.2);j<int(srcImage.rows*0.8);j++)
  {
   uchar* data = srcImage.ptr<uchar>(j);
   for(int i = 0;i<540;i++)
   {
    if(data[i] == 255)
     return Point(i,j);
   }
  }
 }
 return Character_Loc;
}

int get_distance(Point& first_point,Point& next_point)
{
 int A = first_point.x - next_point.x;
 int B = first_point.y - (next_point.y+50);
 return int(pow(pow(A,2)+pow(B,2),0.5));
}

void jump(int&g_distance)
{
 char AA[50];
 int distance_ = g_distance * 1.35;
 int rand_x = int(320+rand()%50); //加上随机数使得每次按压都是在点(320,410)-(370,460)之间
 int rand_y = int(410+rand()%50);
 sprintf(AA,"adb shell input swipe %d %d %d %d %d",rand_x,rand_y,rand_x,rand_y,distance_);
 cout<<AA<<endl;
 system(AA);
}

通过测试效果如下:轻松得榜首,到五百多时程序依然可以一直在运行,我觉得时间太长,所以就直接弄挂了。不过并不影响榜首的位置!上图:

总结:主要本人刚好也是视觉图像方向的,哈哈,就闲的无聊测试了一把,经过更改和测试。如果不遇到那种与背景色特别相近的,上榜首是没问题的! 嗯,说了这么多,这个博客也就到此结束啦,有问题欢迎留言!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 微信跳一跳辅助Java代码实现
  • Java微信跳一跳操作指南
  • 安卓版微信跳一跳辅助 跳一跳辅助Java代码
  • 微信跳一跳刷分java代码实现
  • 微信跳一跳游戏Android刷分代码
  • 微信跳一跳python辅助脚本(总结)
  • python版微信跳一跳游戏辅助
  • 100行java写的微信跳一跳辅助程序
(0)

相关推荐

  • 微信跳一跳刷分java代码实现

    朋友圈晒跳一跳成绩好久了,今天无意中看到以前一个同事小妞晒用代码刷分的视频,百度了一下果然看到了代码(代码在最后),几经波折,终于成功运行,刷了一点分数. 首先大概说一下步骤: 1.百度下载刷分代码 2.安装adb 3.找个手机使用USB调试模式连接电脑 4.启动跳一跳微信小程序 5.在eclipse中运行代码(此处要不断调试根据手机屏幕大小修改参数) 结果就是你的手机屏幕会自动按压然后让棋子跳. 再说下问题: 一.安装adb问题集: 下载adb工具地址 在此处的设备管理器中,如果没有安装在其他

  • Java微信跳一跳操作指南

    Java微信跳一跳操作指南,指哪挑哪. 本文的思路是通过adb来控制手机进行操作,通过java写一个jframe覆盖在手机屏幕上,用鼠标获取跳的起点和终点,经过试验获取跳的jframe距离和按压时长的关系(线性关系),然后通过adb来根据计算出的结果操作按下时长,(此处还需要一个第三方工具来实时把画面传送给电脑,将jframe覆盖在电脑上的画面上). 代码很短,如下: package jump; import java.awt.FlowLayout; import java.awt.event.

  • 微信跳一跳游戏Android刷分代码

    本文实例为大家分享了微信跳一跳游戏Android实现刷分,供大家参考,具体内容如下 # coding:utf-8 ''' # === 思路 === # 核心:每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标, # 根据两个点的距离乘以一个时间系数获得长按的时间 # 识别棋子:靠棋子的颜色来识别位置,通过截图发现最下面一行大概是一条直线,就从上往下一行一行遍历, # 比较颜色(颜色用了一个区间来比较)找到最下面的那一行的所有点,然后求个中点, # 求好之后再让 Y 轴坐标减小棋子底

  • 100行java写的微信跳一跳辅助程序

    前几天没事干看别人一直在玩微信上线的那一个跳一跳小游戏,玩着玩着老是掉下去,闲着没事呗就想了想做一个辅助程序的呗.不过先做的手动版的.自动版的有点麻烦.就不发了.用的Java写的,也就一个蒙版. 下面就开始介绍我的小程序,没好多东西,真正的代码应该就是100行左右,没啥难的. 下面这是我的微信朋友们的跳一跳 也就这样吧,因为wechat还是有那个仿作弊系统的,所以还是低调的吧... 话不多说,还是下面奉上我的code吧,说多了墨迹呢.... package com.rain.jump.util;

  • 微信跳一跳辅助Java代码实现

    微信跳一跳辅助的Java具体实现代码,供大家参考,具体内容如下 1.参考知乎教你用Python来玩微信跳一跳,鉴于本人Python一直都是半吊子水平,之前打算用python刷分,可无奈安装python环境各种模块缺失,报错不停,于是乎,使用Java重新实现了一下. 2.环境配置及相关说明: 1).Windows系统,本人win10 2).AVA环境安装,JDK7以上即可 3).安卓手机一部.数据线一条 4).电脑安装ADB驱动,连接安卓手机,同时打开USB调试模式 5).打开微信小程序的跳一跳游

  • 微信跳一跳python辅助脚本(总结)

    这段时间微信跳一跳这个游戏非常火爆,但是上分又非常的难,对于程序员来说第一个念头就是通过写一个辅助脚本外挂让上分变的容易,python现在比较火,我们一起来以python语言为基础总结以下各路神仙写的关于跳一跳的辅助脚本,大家在学习的时候主要理解他们的写法思路,对你学习python非常的有帮助. 1.微信跳一跳自动运行python脚本 注解:思路 核心:每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标, 根据两个点的距离乘以一个时间系数获得长按的时间 识别棋子:靠棋子的颜色来识别

  • 安卓版微信跳一跳辅助 跳一跳辅助Java代码

    安卓版微信跳一跳辅助,java实现,具体内容如下 已经看到网上有大神用各种方式实现了,我这是属于简易版ADB命令式实现. 操作方法 1.光标移动到起始点,点击FORM 2.光标移动到目标点,点击TO 3.小人已经跳过去了 原理说明 安装APP,通过设置起点和目标点位置,获得弹跳的毫秒数,发送请求到连接手机的电脑中,电脑执行adb命令起跳. 具体实现 本人的测试设备是Mate9,android版本为7.0,由于在非Root环境下,普通安卓应用并不能通过Runtime.getRuntime().ex

  • python版微信跳一跳游戏辅助

    本文实例为大家分享了微信跳一跳游戏辅助python代码,供大家参考,具体内容如下 import os import PIL import numpy import matplotlib matplotlib.use('TKAgg') import matplotlib.pyplot as plt import time from matplotlib.animation import FuncAnimation # 是否需要进行图片更新 need_update = True def get_sc

  • 基于VS+Opencv2.4.10微信跳一跳辅助工具

    最近微信的跳一跳小程序可谓火了一把,不是因为它本身多好玩,而是有大部分的程序员们加入其中,利用各种领域方法,实现了微信跳一跳的外挂,分数轻松上千或上万.之前也看了基于Python开源的代码,GitHub上现在的star已经快超过1W了,简直不敢想.趁着今天礼拜天,在实验室中也简单的实现了一下微信跳一跳的辅助工具,精度还不够高,我跑了一下才到90,纯属娱乐好玩的,后期再继续改进,主要是依赖C++来实现了一下. 环境: Win10+VS2012+Opencv2.4.10+ADB工具 环境的搭建请查阅

  • python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1.windows上安装python2.7,配置好环境变量和pip 2.到这个网站下载对应版本的pyHook和pywin32 http://www.lfd.uci.edu/~gohlke/pythonlibs 2.打开cmd,安装下载好的whl文件和其他库 pip install pywin32-221

  • 使用Python制作微信跳一跳辅助

    1.  前言 微信的跳一跳相信大家都很熟悉了,而且现在各种外挂.辅助也是满天飞,反正本人的好友排行榜中已经是八九百都不足为奇了.某宝上一搜一堆结果,最低的居然只要3块多,想刷多少分就刷多少分,真是离谱. 作为一枚程序猿,我决心也自己搞一下,不为别的,一来为了磨练一下自己的解决问题的能力,而来也为了娱乐一下.像这种任务,最适合的当然是Python,丰富的第三方库,而且具有胶水语言的特点. 本程序的主要设计思路就是,PC端adb连接手机→截屏→在PC端展示→用户鼠标选取起点和终点→计算距离.时长→a

  • 微信跳一跳辅助python代码实现

    微信跳一跳辅助的python具体实现代码,供大家参考,具体内容如下 这是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人」跳跃的距离.可能刚开始上手的时候,因为时间距离之间的关系把握不恰当,只能跳出几个就掉到了台子下面. 玩法类似于<flappy bird> 下载github的一个程序,但是在windows10下不能运行,原因是windows10下没有copy命令了,修改为Python自带的复制方法,即可完成.今天运行好像一开始不能正确跳第一次,人工辅助后,后

  • python微信跳一跳系列之自动计算跳一跳距离

    到现在为止,我们通过前面几篇博文的描述和分析,已经可以自动实现棋子.棋盘位置的准确判断,计算一下两个中心点之间的距离,并绘制在图形上,效果如下. 效果 图中的棋子定位采用HSV颜色识别,棋盘定位采用轮廓分割的方法获得,感兴趣的同学可以对其它的定位方法自行验证. 代码 # -*- coding: utf-8 -*- #VS2017+python3.6+opencv3.4 #2018.02.03 #作者:艾克思 import cv2 import numpy as np import math de

  • python微信跳一跳系列之色块轮廓定位棋盘

    在前几篇博文中,我们分别采用颜色识别,模板匹配,像素遍历等方法实现了棋子和棋盘的定位,具体内容可以参见我的前面的文章内容,在这一篇中,我们来探索一种定位棋盘的新方法. 分析 经过观察,我们看到,无论什么情况下,棋盘和背景之间总是存在着非常明显的色彩对比,这当然是必须的,否则玩游戏的人都无法分辨棋子.棋盘.背景,这个游戏就不可能大火.显然,如果我们将每一幅画面进行色块分割,将彩色图转变为黑白二值图,就可以将背景和棋盘隔离出来,然后对黑白图中的白色轮廓进行分析,将其中位置最高(y值最小)的轮廓标记出

随机推荐