我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++ OpenCV如何模拟实现微信跳一跳

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++ OpenCV如何模拟实现微信跳一跳

小编给大家分享一下C++ OpenCV如何模拟实现微信跳一跳,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

实机演示Gif:

C++ OpenCV如何模拟实现微信跳一跳

思路:

获取小黑人的位置,获得目标方块的位置,计算两者的距离,从而计算粗按压屏幕的时间是多少。

具体实现1:使用mumu模拟器获取截图

使用mumu模拟器,模拟手机端,然后使用adb调试工具截图,保存到本地,然后从OpenCV程序获取在本地的截图。

具体实现2:使用adb工具模拟按压

当计算完距离和时间之后,考虑使用模拟按压屏幕的方法,控制小人的移动。

具体实现3:按压的位置刚好在“再来一次”的按钮上

这样就算跳失败了,只要用户不停下,那么小程序就会一直的进行跳跃。

获取小黑人的位置:

很简单,只是使用OpenCV的matchTemplate就可以啦,注意使用“TM_CCORR_NORMED”方法。

获取终点的位置:

这里使用的是Canny边缘检测算法

需要自定义的:

一个文件夹,将图片,从mumu模拟器,保存到本地的目录文件夹。和Debug的缓存目录。

C++ OpenCV如何模拟实现微信跳一跳

C++ OpenCV如何模拟实现微信跳一跳

您还可以自定义,程序运行的循环次数:

//最大执行次数#define MaxRound 100

修改后面的100即可。

还有您的匹配模式图片位置:

character3.png

C++ OpenCV如何模拟实现微信跳一跳

C++ OpenCV如何模拟实现微信跳一跳

完整项目:

项目配置:DebugX64,包含头文件opencv头文件,lib选择为opencv_world425d.dll(好像是这个名字),这个lib一定要有d,因为我们是Debug模式,所以使用这个库。然后链接器的附加输入,也填入这个选项。

项目依赖:adb、opencv425

下面是完整的项目参考。

项目结构

C++ OpenCV如何模拟实现微信跳一跳

pch.h

#pragma once#include <opencv2/opencv.hpp>#include <iostream>#include <opencv.hpp>#include <windows.h>

main.cpp 

//跳一跳作弊程序//版本 v1.0.2 作者:CSDN陈千里#include "pch.h"#include <windows.h>#include <sstream>using namespace cv;Mat class="lazy" data-srcImage;//存放跳一跳的截图Mat blackPeopleTem;//黑色小人匹配图std::stringstream ssm; //int转string//最大执行次数#define MaxRound 100//由于分辨率的不同,微调终点的位置#define Tuning 0.52f//Debug函数void DebugImg(const std::string& fileName, Mat& mat, const Point& point);void DebugImg(const std::string& fileName, Mat& mat);//刷新class="lazy" data-srcImage的信息(截图)void refreshclass="lazy" data-srcImage() {system("adb shell screencap -p /sdcard/ScreenCatch.png");//您需要自定义的地方,下面的"C:\\adb"system("adb pull /sdcard/ScreenCatch.png C:\\adb\\temp");class="lazy" data-srcImage = imread("C:\\adb\\temp\\ScreenCatch.png");}//寻找跳一跳黑色小人的位置Point GetNowPoint(Mat& class="lazy" data-srcImage, Mat& Tem_img) {cv::Mat image_matched;matchTemplate(class="lazy" data-srcImage, Tem_img, image_matched, TM_CCORR_NORMED);// 匹配黑棋子double minVal, maxVal;Point minLoc, maxLoc, matchLoc;DebugImg("黑人匹配图.png", image_matched);minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc, Mat());matchLoc = maxLoc; //matchLoc是最佳匹配的区域左上角点//调试输出DebugImg("1黑人位置.png", class="lazy" data-srcImage, Point(matchLoc.x + Tem_img.cols, matchLoc.y + Tem_img.rows));//DebugImg("1黑人位置.png", class="lazy" data-srcImage, Point(matchLoc.x + Tem_img.cols * 0.5, matchLoc.y + Tem_img.rows));return Point(matchLoc.x, matchLoc.y);}//获得小方块的目标点Point GetNextPoint(Mat& class="lazy" data-srcImage) {cv::Point point1;cv::Point point2;cv::GaussianBlur(class="lazy" data-srcImage, class="lazy" data-srcImage, cv::Size(5, 5), 0);  //高斯滤波,降低噪声Mat temp, temp2;//cv::threshold(class="lazy" data-srcImage, temp, 0, 255, 8);//class="lazy" data-srcImage = temp;Canny(class="lazy" data-srcImage, temp, 20, 30);      //进行边缘检测temp2 = class="lazy" data-srcImage;class="lazy" data-srcImage = temp;std::vector<std::vector<Point>> contours;std::vector<Vec4i> hierarchy;findContours(class="lazy" data-srcImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); //找到关键的角点//遍历每一个轮廓,把多余的轮廓去掉std::vector<std::vector<cv::Point> >::const_iterator it = contours.begin();while (it != contours.end()) {if (it->size() < 150)it = contours.erase(it);else++it;}int nYMin = class="lazy" data-srcImage.rows;int nXMin = class="lazy" data-srcImage.cols;int nYMax = 0;int nXMax = 0;int nIdY = 0;for (int i = 0; i < contours.size(); i++) {//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数  for (int j = 0; j < contours[i].size(); j++) {if (contours[i][j].y < nYMin) {nYMin = contours[i][j].y;   //找到最低的y值point1 = contours[i][j];    //记录  y值最低点坐标nIdY = i;                   //记录哪个区域内的}}}int minY = class="lazy" data-srcImage.cols;for (int j = 0; j < contours[nIdY].size(); j++) { //在哪个区域内继续变量 找到x最大值if (contours[nIdY][j].x > nXMax) {nXMax = contours[nIdY][j].x;}}for (int j = 0; j < contours[nIdY].size(); j++) {//找到x中最大值上的最小值if (contours[nIdY][j].x == nXMax && contours[nIdY][j].y < minY) {point2 = contours[nIdY][j];minY = contours[nIdY][j].y;     //记录X点的最大值}}//调试输出DebugImg("2目标点位置.png", temp2, Point(point1.x, point2.y));DebugImg("边缘图.png", class="lazy" data-srcImage, Point(point1.x, point2.y));return cv::Point(point1.x, point2.y);       //返回中点坐标}//计算两个点的距离float GetDistance(Point& first_point, Point& next_point) {float A = first_point.x - next_point.x;float B = first_point.y - (next_point.y + 50);float result = pow(pow(A, 2) + pow(B, 2), 0.5);if (result > 600) {std::cout << "距离探测失误" << std::endl;result = 230;}return result;}//模拟按压屏幕跳跃void Jump(float& g_distance) {std::cout << "distance:" << g_distance << std::endl;int time = std::ceil(g_distance * 4 * Tuning);std::string str_Time, str;//模拟长按屏幕ssm.clear();ssm << time;ssm >> str_Time;str = "adb shell input swipe 461 1203 461 1203 " + str_Time;std::cout << str << std::endl;system(str.c_str());}//主过程void Process() {Point pBlackPeople;Point pFinish;float dis;for (int i = 0; i < MaxRound; i++) {refreshclass="lazy" data-srcImage();pBlackPeople = GetNowPoint(class="lazy" data-srcImage, blackPeopleTem);pFinish = GetNextPoint(class="lazy" data-srcImage);dis = GetDistance(pBlackPeople, pFinish);Jump(dis);Sleep(2000);}}int main() {//首先要链接端口system("adb connect 127.0.0.1:7555");refreshclass="lazy" data-srcImage();blackPeopleTem = imread("C:/adb/Resources/character3.png");//初始化到此结束Process();int x = 280; // 裁剪区域起始点 x坐标int y = 400; // 裁剪区域起始点 y坐标int width = 100; // 裁剪区域宽度int height = 100; // 裁剪区域高度//Rect area(x, y, width, height);//Mat guide_roi = class="lazy" data-srcImage(Rect(x, y, width, height));//测试代码//namedWindow("test opencv setup", WINDOW_AUTOSIZE);//imshow("test opencv setup", class="lazy" data-srcImage);//waitKey(0);return 0;}//保存图片和画点,用于调试void DebugImg(const std::string& fileName, Mat& mat, const Point& point) {Mat temp = mat;//在图片上面画点circle(temp, point, 5, Scalar(0, 0, 255), -1);std::string path = "c:/adb/temp/", sR;sR = path + fileName;imwrite(sR, temp);}void DebugImg(const std::string& fileName, Mat& mat) {std::string path = "c:/adb/temp/", sR;sR = path + fileName;imwrite(sR, mat);}

看完了这篇文章,相信你对“C++ OpenCV如何模拟实现微信跳一跳”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++ OpenCV如何模拟实现微信跳一跳

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++ OpenCV如何模拟实现微信跳一跳

小编给大家分享一下C++ OpenCV如何模拟实现微信跳一跳,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实机演示Gif:思路:获取小黑人的位置,获得目标方块的位置,计算两者的距离,从而计算粗按压屏幕的时间是多少。具体实现
2023-06-22

Java如何实现微信跳一跳辅助

这篇文章主要介绍Java如何实现微信跳一跳辅助,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境配置及相关说明:1)、Windows系统,本人win102)、AVA环境安装,JDK7以上即可3)、安卓手机一部、数据线
2023-05-30

微信跳一跳小程序游戏如何开发

本篇内容主要讲解“微信跳一跳小程序游戏如何开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信跳一跳小程序游戏如何开发”吧!  小游戏只有以下两个必要文件:  game.js 小游戏主程序入口
2023-06-26

C++如何实现跳跃游戏

这篇文章主要介绍“C++如何实现跳跃游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++如何实现跳跃游戏”文章能帮助大家解决问题。Jump Game 跳跃游戏Given an array of
2023-06-19

微信小程序模拟cookie如何实现

本文小编为大家详细介绍“微信小程序模拟cookie如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序模拟cookie如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。开发背景现有系统已经有一套
2023-06-26

微信小程序如何实现页面跳转功能详解

这篇文章主要给大家介绍了关于微信小程序如何实现页面跳转功能的相关资料,包括页面跳转的方式、跳转传参的方法以及页面返回的操作,通过简单的代码示例,帮助读者快速掌握微信小程序页面跳转的基本用法,下面需要的朋友可以参考下
2023-05-13

C语言如何实现简单弹跳小球

这篇“C语言如何实现简单弹跳小球”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言如何实现简单弹跳小球”文章吧。本节利用
2023-06-30

C语言如何实现弹跳小球动画

这篇文章主要介绍了C语言如何实现弹跳小球动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现弹跳小球动画文章都会有所收获,下面我们一起来看看吧。一、项目描述和最终成果展示项目描述: 一个球来回的跳
2023-06-30

C++中如何模拟实现vector

这篇文章给大家分享的是有关C++中如何模拟实现vector的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vector接口总览namespace nzb{//模拟实现vectortemplatec
2023-06-25

在微信小程序中跳转到另一个小程序(多种实现方式)

今天在项目中刚好遇到一个到从当前小程序中跳转到另一个小程序,下面分享一下我总结的几个比较简单的跳转方式吧。 方式一: 1.配置要跳转的appid和小程序页面路径 wx.navigateToMiniProgram({ appId: '目
2023-08-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录