iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++OpenCV模拟实现微信跳一跳
  • 454
分享到

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

2024-04-02 19:04:59 454人浏览 八月长安
摘要

目录前提精要:实机演示Gif:思路:获取小黑人的位置:获取终点的位置:需要自定义的:完整项目:项目结构pch.hmain.cpp 前提精要: 本程序参考了大量的大佬佬的代码,在此基础

前提精要:

本程序参考了大量的大佬佬的代码,在此基础之上,改编而成。而且其实代码写的奇差无比,很容易就挂了。然后呢,这里只是稍微提供一些思路,作为参考,就酱。

本程序依赖adb.exe和OpenCV425库。

本程序还有待优化,很渣很糟糕~

仅供学习交流使用,切勿使用在违规违法的环境之中。

实机演示Gif:

思路:

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

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

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

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

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

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

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

获取小黑人的位置:

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

获取终点的位置:

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

需要自定义的:

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

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


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

修改后面的100即可。

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

character3.png

完整项目:

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

项目依赖:adb、opencv425

下面是完整的项目参考。

项目结构

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 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);
//刷新srcImage的信息(截图)
void refreshSrcImage() {
	system("adb shell screencap -p /sdcard/ScreenCatch.png");
	//您需要自定义的地方,下面的"C:\\adb"
	system("adb pull /sdcard/ScreenCatch.png C:\\adb\\temp");
	srcImage = imread("C:\\adb\\temp\\ScreenCatch.png");
}

//寻找跳一跳黑色小人的位置
Point GetNowPoint(Mat& srcImage, Mat& Tem_img) {
	cv::Mat image_matched;
	matchTemplate(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", srcImage, Point(matchLoc.x + Tem_img.cols, matchLoc.y + Tem_img.rows));
	//DebugImg("1黑人位置.png", srcImage, Point(matchLoc.x + Tem_img.cols * 0.5, matchLoc.y + Tem_img.rows));
	return Point(matchLoc.x, matchLoc.y);
}

//获得小方块的目标点
Point GetNextPoint(Mat& srcImage) {
	cv::Point point1;
	cv::Point point2;
	cv::GaussianBlur(srcImage, srcImage, cv::Size(5, 5), 0);  //高斯滤波,降低噪声
	Mat temp, temp2;
	//cv::threshold(srcImage, temp, 0, 255, 8);
	//srcImage = temp;
	Canny(srcImage, temp, 20, 30);      //进行边缘检测
	temp2 = srcImage;
	srcImage = temp;
	std::vector<std::vector<Point>> contours;
	std::vector<Vec4i> hierarchy;
	findContours(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 = srcImage.rows;
	int nXMin = 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 = 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", 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++) {
		refreshSrcImage();
		pBlackPeople = GetNowPoint(srcImage, blackPeopleTem);
		pFinish = GetNextPoint(srcImage);
		dis = GetDistance(pBlackPeople, pFinish);
		Jump(dis);
		Sleep(2000);
	}
}

int main() {
	

	//首先要链接端口
	system("adb connect 127.0.0.1:7555");
	refreshSrcImage();
	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 = srcImage(Rect(x, y, width, height));


	//测试代码
	//namedWindow("test opencv setup", WINDOW_AUTOSIZE);
	//imshow("test opencv setup", 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模拟实现微信跳一跳的文章就介绍到这了,更多相关C++ OpenCV微信跳一跳内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++OpenCV模拟实现微信跳一跳

本文链接: https://www.lsjlt.com/news/160182.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++OpenCV模拟实现微信跳一跳
    目录前提精要:实机演示Gif:思路:获取小黑人的位置:获取终点的位置:需要自定义的:完整项目:项目结构pch.hmain.cpp 前提精要: 本程序参考了大量的大佬佬的代码,在此基础...
    99+
    2024-04-02
  • C++ OpenCV如何模拟实现微信跳一跳
    小编给大家分享一下C++ OpenCV如何模拟实现微信跳一跳,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实机演示Gif:思路:获取小黑人的位置,获得目标方块的位置,计算两者的距离,从而计算粗按压屏幕的时间是多少...
    99+
    2023-06-22
  • Java如何实现微信跳一跳辅助
    这篇文章主要介绍Java如何实现微信跳一跳辅助,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境配置及相关说明:1)、Windows系统,本人win102)、AVA环境安装,JDK7以上即可3)、安卓手机一部、数据线...
    99+
    2023-05-30
  • Python 玩微信跳一跳
    写在前头 如果你看完文章,说我没有mac电脑,只有windows和iphone,怎么办? 好办,使用windows和安卓模拟器也可以实现自动跳一跳。如需帮助请评论留言。 https://wangshub.github.io/ GitHub...
    99+
    2023-01-31
    跳一跳 Python 玩微信
  • Three.js如何实现一个微信跳一跳游戏
    这篇文章给大家分享的是有关Three.js如何实现一个微信跳一跳游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果如下: 由于是第一次尝试写游戏, 也不知道套路对不对, 大...
    99+
    2024-04-02
  • Java微信跳一跳操作指南
    Java微信跳一跳操作指南,指哪挑哪。本文的思路是通过adb来控制手机进行操作,通过java写一个jframe覆盖在手机屏幕上,用鼠标获取跳的起点和终点,经过试验获取跳的jframe距离和按压时长的关系(线性关系),然后通过adb来根据计算...
    99+
    2023-05-30
  • 用python实现跳一跳
    下面是一个简单的 Python 实现跳一跳游戏的示例代码:```pythonimport cv2import numpy as np...
    99+
    2023-08-29
    python
  • 微信跳一跳小程序游戏如何开发
    本篇内容主要讲解“微信跳一跳小程序游戏如何开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信跳一跳小程序游戏如何开发”吧!  小游戏只有以下两个必要文件:  game.js 小游戏主程序入口...
    99+
    2023-06-26
  • python怎么实现跳一跳
    要实现跳一跳游戏,可以使用Python的图像识别库和模拟点击操作来实现。下面是一个简单的示例:1. 安装必要的库:```python...
    99+
    2023-08-22
    python
  • 微信小程序实现视频号跳转
    三种类型: 1、跳转到视频号主页------必须是同主体 调用函数 wx.openChannelsUserProfile({ finderUserName: '' //视频号id}) 2、使用内嵌------必须是同主体 使用...
    99+
    2023-10-26
    微信小程序 小程序 Powered by 金山文档
  • H5跳转微信小程序,通过获取URL Scheme,实现短信跳转小程序,微信跳转小程序,邮件跳转小程序,外部链接跳转小程序
    H5链接跳转小程序有2种方式: 第一种:通过微信官方提供的标签wx-open-launch-weapp,打开小程序 第二种:通过获取URL Scheme实现链接跳转小程序 一、wx-open...
    99+
    2023-10-21
    微信小程序 小程序 微信
  • 实现微信扫一扫跳转到小程序指定页面
    使用微信扫一扫进入小程序内的指定页面 文章目录 使用微信扫一扫进入小程序内的指定页面前言一、微信小程序平台配置二、前端uniapp中的获取二维码信息三.后端处理参数总结 前言 使用场景:例...
    99+
    2023-08-31
    小程序 微信 微信小程序
  • 微信小程序实现跳转详情页面
    本文实例为大家分享了微信小程序实现跳转详情页面的具体代码,供大家参考,具体内容如下 我们要实现如下的效果,进入详情页,获取产品的具体数据。本文请求的数据是本地的,实际开发是要通过aj...
    99+
    2024-04-02
  • 微信小程序zm 实现页面跳转传值
    这篇文章给大家分享的是有关微信小程序zm 实现页面跳转传值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序实现页面跳转传值的方法比如从index。wxml跳转到aaa.w...
    99+
    2024-04-02
  • 如何利用Three.js实现跳一跳小游戏
    目录前言游戏规则Three.js整个程序的结构实现html文件引入three.js引擎页面结构场景相机几何体光源渲染添加第二块跳块鼠标按下状态鼠标松开弹起状态落在哪里结尾前言 跳一跳...
    99+
    2024-04-02
  • 怎么利用Three.js实现跳一跳小游戏
    本篇内容介绍了“怎么利用Three.js实现跳一跳小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!游戏规则十分简单:长按鼠标蓄力、放手,...
    99+
    2023-06-30
  • 微信小程序怎么实现页面跳转传值
    小编给大家分享一下微信小程序怎么实现页面跳转传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!微信小程序 页面跳转传值实现代码微...
    99+
    2024-04-02
  • 微信小程序怎么实现页面跳转功能
    这篇“微信小程序怎么实现页面跳转功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序怎么实现页面跳转功能”文章吧。实...
    99+
    2023-07-05
  • 微信小程序实现点击按钮跳转页面
    微信小程序中点击按钮跳转页面可以使用 wx.navigateTo 或 wx.redirectTo 方法。 首先,在按钮的绑定事件中调用方法,如: 跳转页面 然后,在页面的 js 文件中实现跳转逻辑,如: Page({ ju...
    99+
    2023-10-23
    微信小程序 小程序 前端 javascript 开发语言
  • 微信小程序实现页面跳转动画效果
    微信小程序实现页面跳转动画效果在微信小程序中,页面跳转是一项非常常见的功能。为了提升用户体验,我们可以通过添加动画效果来让页面切换更加流畅和生动。下面我将介绍如何使用微信小程序的API来实现页面跳转动画效果,并附上具体的代码示例。首先,我们...
    99+
    2023-11-21
    动画效果 微信小程序 页面跳转
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作