基于OpenCV的微信跳一跳外挂
摘要:微信跳一跳是时下热门的微信小游戏,基本原理是根据按压屏幕的时间控制棋子跳过的距离,使其跳到下一个方块上;现利用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的微信跳一跳外挂相关推荐
- python+opencv 实现 微信跳一跳外挂
1.思路: (1).使用adb(Android Debug Bridge)连接手机 通过usb连接 通过无线网络连接(我采用手机开热点,电脑adb连接)这种方式比较复杂,手机要下载一个超级终端,在终端 ...
- 微信“跳一跳”外挂制作历程
微信"跳一跳"外挂制作历程 最近微信出了个"跳一跳"小游戏还挺火的,但是我这种手残人士,小手一滑,棋子就不知道飞哪儿去了.那我气啊,排行榜得拉到底才能看到我的名 ...
- 利用Python制作微信跳一跳外挂,微信好友装逼神器!
导语 前几天在GitHub上看到有人利用Python玩一款名为"跳一跳"的微信小程序,于是打算自己也来试一试,进群:711944363 获取微信跳一跳源码! 演示工具 电脑系统:W ...
- 微信跳一跳外挂,无需连接手机
微信跳一跳外挂,无需连接手机 使用这个软件需满足以下条件: 使用安卓模拟器,我用的是BlueStacks,雷电也可以 安卓模拟器窗口大小用鼠标调为[[409 × 727]]是调窗口大小,不是改分辨率! ...
- 微信跳一跳外挂【程序员版,附两个版本的源代码以及为防止跳几下就挂的注意事项,需要自己配置编译器】
微信跳一跳怎么开挂?微信跳一跳外挂脚本在哪下载? 先来一张图片(有图有真相哈!) 建议不要刷太多,微信有防作弊措施,分数太高会上传失败(一千左右就行了). 需要下载:Auto.js(js脚本解释器和运 ...
- 微信跳一跳外挂【普通版,不需要自己搞解释器和代码,兼容性更好,反微信防作弊系统更有效】
微信跳一跳怎么开挂?微信跳一跳外挂脚本在哪下载? 我发现现在网上有一款名叫"游戏窝蜂"的app,里面有微信跳一跳外挂,开挂比较简单,不需要自己搞什么解释器和代码,点几下就行了.并且 ...
- 基于java+opencv的微信跳一跳辅助
一.前言 写这个只是为了练习java跟opencv来做图像识别,并不是以刷分作为初衷,而且分数高了也提交不上去,会说存在可疑操作,不知道它的检测机制是怎样的,可能是触摸坐标还有间隔时间一直没变 ...
- python微信点赞脚本_用OpenCV-python的微信跳一跳外挂脚本
微信跳一跳好像火了很久了,我才开始接触,作为一个手残党, 玩了几次不到20分,打算直接放弃了.但作为一个技术宅,下一反应肯定是"上脚本".最初想法是用arduino(不会可以学啊) ...
- 微信跳一跳外挂辅助流程 (MAC+iOS)
微信跳一跳瞬间火爆朋友圈, 但是手残过不了200, 就研究了一下网上的外挂. 用的是MAC加上iPhone6s 主要使用facebook-wda和wechat_jump_game 以下是具体步骤 安装 ...
最新文章
- 如何使用来电盒--宇然电脑公司管理软件
- vivado实现VGA
- python中表头格式错误导入_python读csv文件时指定行为表头或无表头的方法
- nginx訪問php配置,thinkphp5配置nginx访问
- 详解Windows内存分页机制
- 二进制转换 html,javascript 处理回传的二进制图像并显示在html上
- 【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing
- 2013年思杰合作伙伴移动性解决方案巡展
- TinyMC编辑器简介
- 详细剖析PS软件中的通道原理,让你完全理解颜色通道与Alpha通道
- Liunx free命令
- Android开发——H5容器加载速度优化方案
- JAVA Swing主题 简洁扁平化苹果风格主题
- 鲁大师从服务器获取信息失败怎么办,云服务器 鲁大师
- JS JQuery实现简单的鼠标移动动画效果
- SUMO(五)—— TraCI练习
- 深度 | Nature论文:无监督表征学习,用电子健康病历增强临床决策
- 永信至诚蔡晶晶:用有温度的技术培育信息时代的安全感
- java基础(1)—1
- D. Divide(math)[2021 ECNU Campus Invitational Contest]
热门文章
- 笔记本打开计算机里面没字,笔记本电脑来不了机怎么处理?一开机就全是英文字母,就是开不了机!...
- win10打开热点提示:我们无法设置移动热点
- prometheus监控redis
- 微信小程序(图像识别)腾讯云、百度智能云API(含源码)
- 妻子朋友谈眼里的快播CEO 曾想打造中国的Adobe
- 以太网PHY原理介绍
- 我的win8期待 新功能 新特性 新改进
- python编写程序、自动生成宿舍的组合名_基于python的寝室管理系统
- vscode使用指南:进入全屏退出全屏模式
- 单行文本和多行文本的省略号