C++ 实现游戏(例如MC)键位显示

效果:
Test in Minecraft 1.20.1
是不是有那味儿了?

  • 显示AWSD,空格,Shift和左右键的按键情况以及左右键的CPS。 彩虹色轮廓,黑白填充。
  • 具有任务栏图标,可以随时关闭
  • 字体是Minecraft AE Pixel,如果你没有装(大概率),你可以换用其他好看的字体(在代码中修改即可)

由于是从一个更大的项目中提取的代码,所以可能会有一些不美观之处。
必要的gcc编译参数:-lgdi32
代码如下:

/****************************************           Keystrokes.cpp            **            游戏按键显示             **         Author: Wormwaker           **       StartDate: 2024/1/14          ****************************************/
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstdarg>
using namespace std;
#define KEY_DOWN(vk) (GetAsyncKeyState(vk)&0x8000?1:0)int scr_w = 0, scr_h = 0, taskbar_h = 0;
HDC hdcOrigin = NULL, hdcBuffer = NULL;
HWND hwnd = NULL;
HWND hwnd_console = NULL;HINSTANCE _hInstance = NULL;
HINSTANCE _hPrevInstance = NULL;
LPSTR _lpCmdLine = NULL;
int _nShowCmd = SW_SHOWNORMAL;/
#define CJZAPI __stdcall
template <typename _T>
string CJZAPI str(const _T& value)
{stringstream ss;ss << value;string res;ss >> res;return res;
}
string CJZAPI sprintf2(const char* szFormat, ...)
{va_list _list;va_start(_list, szFormat);char szBuffer[1024] = "\0";_vsnprintf(szBuffer, 1024, szFormat, _list);va_end(_list);return string{szBuffer};
}
bool CJZAPI ExistProcess(DWORD dwPid)	//判断是否存在指定进程
{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (pe.th32ProcessID == dwPid) 		{			CloseHandle(hSnapshot);			return true;		}	}	return false;
}
bool CJZAPI ExistProcess(LPCSTR lpName)	//判断是否存在指定进程
{	//******警告!区分大小写!!!!******// //*****警告!必须加扩展名!!!!*****// HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (! stricmp(pe.szExeFile, lpName)) 		{			CloseHandle(hSnapshot);			return true;		}	}	return false;
}
inline int GetScreenHeight(void) //获取屏幕高度
{return GetSystemMetrics(SM_CYSCREEN);
}
inline int GetScreenWidth(void) //获取屏幕宽度
{return GetSystemMetrics(SM_CXSCREEN);
}
RECT CJZAPI GetSystemWorkAreaRect(void) //获取工作区矩形 
{RECT rt;SystemParametersInfo(SPI_GETWORKAREA,0,&rt,0);    // 获得工作区大小return rt;
}
LONG CJZAPI GetTaskbarHeight(void) 		//获取任务栏高度 
{	INT cyScreen = GetScreenHeight();RECT rt = GetSystemWorkAreaRect();return (cyScreen - (rt.bottom - rt.top));
}
inline HWND GetTaskbarWindow(void)
{return WindowFromPoint(POINT{ GetScreenWidth() / 2,GetScreenHeight() - 2 });
}
inline HFONT CJZAPI CreateFont(int height, int width, LPCSTR lpFamilyName)
{return CreateFont(height,width,0,0,FW_NORMAL,0,0,0,0,0,0,0,0,lpFamilyName);
}
// 辅助函数:HSV到RGB颜色转换
COLORREF HSVtoRGB(double h, double s, double v) {int hi = static_cast<int>(floor(h / 60.0)) % 6;double f = h / 60.0 - floor(h / 60.0);double p = v * (1.0 - s);double q = v * (1.0 - f * s);double t = v * (1.0 - (1.0 - f) * s);switch (hi) {case 0: return RGB(static_cast<int>(v * 255), static_cast<int>(t * 255), static_cast<int>(p * 255));case 1: return RGB(static_cast<int>(q * 255), static_cast<int>(v * 255), static_cast<int>(p * 255));case 2: return RGB(static_cast<int>(p * 255), static_cast<int>(v * 255), static_cast<int>(t * 255));case 3: return RGB(static_cast<int>(p * 255), static_cast<int>(q * 255), static_cast<int>(v * 255));case 4: return RGB(static_cast<int>(t * 255), static_cast<int>(p * 255), static_cast<int>(v * 255));case 5: return RGB(static_cast<int>(v * 255), static_cast<int>(p * 255), static_cast<int>(q * 255));default: return RGB(0, 0, 0);  // Shouldn't reach here}
}
// 主函数:返回随时间变化的彩虹色
COLORREF RainbowColor() {// 假设时间按秒计算,这里使用系统时间或其他适当的时间源double timeInSeconds = GetTickCount() / 1000.0;// 色相按时间变化double hue = fmod(timeInSeconds * 30.0, 360.0);  // 假设每秒变化30度// 饱和度和亮度保持不变double saturation = 1.0;double value = 1.0;// 将HSV颜色转换为RGB并返回return HSVtoRGB(hue, saturation, value);
}inline void CJZAPI SetTextColor(COLORREF color)
{SetTextColor(hdcBuffer, color);
}
inline void CJZAPI TextOut(int x, int y, LPCSTR lpText, HDC hdc = hdcBuffer)
{TextOut(hdc, x, y, lpText, strlen(lpText));
}
inline void CJZAPI TextOutShadow(int x, int y, LPCSTR lpText, HDC hdc = hdcBuffer)
{COLORREF oclr = GetTextColor(hdc);SetTextColor(RGB(0,0,0));TextOut(x+2,y+2,lpText,hdc);SetTextColor(oclr);TextOut(x,y,lpText,hdc);
}
void ClearDevice(HDC _hdc = hdcBuffer, HWND _hwnd = hwnd)
{// 清屏:使用透明色填充整个客户区域RECT rcClient;GetClientRect(_hwnd, &rcClient);HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));FillRect(_hdc, &rcClient, hBrush);DeleteObject(hBrush);
}
/
int left_cps = 0;
int right_cps = 0;
#define CPS_UPDATE_CD 1000
void UpdateCPS(void)
{static DWORD startTime = GetTickCount();static int leftClicks = 0, rightClicks = 0;static bool leftButtonDown = false, rightButtonDown = false;bool leftButtonPressed = KEY_DOWN(VK_LBUTTON);if (leftButtonPressed && !leftButtonDown) leftClicks++;leftButtonDown = leftButtonPressed;bool rightButtonPressed = KEY_DOWN(VK_RBUTTON);if (rightButtonPressed && !rightButtonDown)rightClicks++;rightButtonDown = rightButtonPressed;DWORD currentTime = GetTickCount();DWORD elapsedTime = currentTime - startTime;if (elapsedTime >= CPS_UPDATE_CD) {left_cps = leftClicks * (1000.0 / CPS_UPDATE_CD);right_cps = rightClicks* (1000.0 / CPS_UPDATE_CD);startTime = currentTime;leftClicks = 0;rightClicks = 0;}
}
inline const int& GetCPS(bool left0_right1)
{return left0_right1 ? right_cps : left_cps;
}
void DrawKeyBox(BYTE key, const char* name, int fs, int left, int top, int right, int bottom)
{static const char* font = "Minecraft AE Pixel";COLORREF color;if(KEY_DOWN(key))color = RGB(200, 200, 200) | (200 << 24);elsecolor = RGB(1, 1, 1) | (80 << 24);HBRUSH hBrush = CreateSolidBrush(color);auto prevObj = SelectObject(hdcBuffer, hBrush);Rectangle(hdcBuffer, left + (KEY_DOWN(key)?2:0), top + (KEY_DOWN(key)?2:0), right + (KEY_DOWN(key)?2:0), bottom + (KEY_DOWN(key)?2:0));SelectObject(hdcBuffer, prevObj);DeleteObject(hBrush);HFONT hFont = CreateFont(fs, 0, font);prevObj = SelectObject(hdcBuffer, hFont);SetTextColor(RainbowColor());SetBkMode(hdcBuffer, TRANSPARENT);string text{name};int x = left + (KEY_DOWN(key)?2:0) + (right - left) / 2.0f - text.length() * fs / 4.0f;int y = top + (KEY_DOWN(key)?2:0) + (bottom - top) / 2.0f - fs / 2.0f;TextOutShadow(x, y, text.c_str());DeleteObject(hFont);SelectObject(hdcBuffer, prevObj);
}
void DrawMouseKeys(int left, int top)
{static const int box_w = 85;static const int box_h = 45;static const int box_gap = 15;static const int fs = 15;static const int small_fs = 10;static const char* font = "Minecraft AE Pixel";COLORREF color;if(KEY_DOWN(VK_LBUTTON))color = RGB(200, 200, 200) | (200 << 24);elsecolor = RGB(1, 1, 1) | (80 << 24);HBRUSH hBrush = CreateSolidBrush(color);auto prevObj = SelectObject(hdcBuffer, hBrush);Rectangle(hdcBuffer, left + (KEY_DOWN(VK_LBUTTON)?2:0), top+ (KEY_DOWN(VK_LBUTTON)?2:0), left + (KEY_DOWN(VK_LBUTTON)?2:0) + box_w, top + box_h+ (KEY_DOWN(VK_LBUTTON)?2:0));SelectObject(hdcBuffer, prevObj);DeleteObject(hBrush);if(KEY_DOWN(VK_RBUTTON))color = RGB(200, 200, 200) | (200 << 24);elsecolor = RGB(1, 1, 1) | (80 << 24);hBrush = CreateSolidBrush(color);prevObj = SelectObject(hdcBuffer, hBrush);Rectangle(hdcBuffer, left + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w + box_gap, top + (KEY_DOWN(VK_RBUTTON)?2:0), left + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w*2 + box_gap, top + box_h+ (KEY_DOWN(VK_RBUTTON)?2:0));SelectObject(hdcBuffer, prevObj);DeleteObject(hBrush);HFONT hFont = CreateFont(small_fs, 0, font);prevObj = SelectObject(hdcBuffer, hFont);SetTextColor(RainbowColor());SetBkMode(hdcBuffer, TRANSPARENT);string text = sprintf2("%d CPS", GetCPS(0));int x = left + (KEY_DOWN(VK_LBUTTON)?2:0) + box_w / 2.0f - text.length() * small_fs / 4.0f - 3;int y = top + (KEY_DOWN(VK_LBUTTON)?2:0) + box_h * 0.75f - small_fs / 2.0f;TextOutShadow(x, y, text.c_str());text = sprintf2("%d CPS", GetCPS(1));x = box_gap + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w + left + box_w / 2.0f - text.length() * small_fs / 4.0f - 3;y = top + (KEY_DOWN(VK_RBUTTON)?2:0) + box_h * 0.75f - small_fs / 2.0f;TextOutShadow(x, y, text.c_str());DeleteObject(hFont);SelectObject(hdcBuffer, prevObj);hFont = CreateFont(fs, 0, font);prevObj = SelectObject(hdcBuffer, hFont);SetTextColor(RainbowColor());SetBkMode(hdcBuffer, TRANSPARENT);text = "LMB";x = left + (KEY_DOWN(VK_LBUTTON)?2:0) + box_w / 2.0f - text.length() * fs / 4.0f - 4;y = top + (KEY_DOWN(VK_LBUTTON)?2:0) + box_h * 0.22f;TextOutShadow(x, y, text.c_str());text = "RMB";x = box_gap + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w + left + box_w / 2.0f - text.length() * fs / 4.0f - 4;y = top + (KEY_DOWN(VK_RBUTTON)?2:0) + box_h * 0.22f;TextOutShadow(x, y, text.c_str());DeleteObject(hFont);SelectObject(hdcBuffer, prevObj);
}
void DrawKeyMouseInfo()
{static const int _left = 15;static const int _top = 40;static const int _pen_size = 2;static const int box_w = 54;static const int box_h = 54;static const int box_gap = 10;static const int fs = 24;COLORREF color = RainbowColor();HPEN hPen;hPen = CreatePen(PS_SOLID, _pen_size, color);SelectObject(hdcBuffer, hPen);DrawKeyBox('A', "A", fs, _left, _top + box_h + box_gap, _left + box_w, _top + box_h + box_gap + box_h);DrawKeyBox('W', "W", fs, _left + box_w + box_gap, _top, _left + box_w*2 + box_gap, _top + box_h);DrawKeyBox('S', "S", fs, _left + box_w + box_gap, _top + box_h + box_gap, _left + box_w*2 + box_gap, _top + box_h + box_gap + box_h);DrawKeyBox('D', "D", fs, _left + box_w * 2 + box_gap * 2, _top + box_h + box_gap, _left + box_w*3 + box_gap * 2, _top + box_h + box_gap + box_h);static const int space_h = 35;DrawKeyBox(' ', "--", fs, _left, _top + box_h*2 + box_gap*2, _left + box_w * 3 + box_gap * 2, _top + box_h*2+box_gap*2+space_h);DrawKeyBox(VK_SHIFT, "Shift", fs * 0.75, _left, _top + box_h*2 + box_gap*3 + space_h, _left + box_w * 3 + box_gap * 2, _top + box_h*2+box_gap*3+space_h*2);DrawMouseKeys(_left, _top + box_h*3 + box_gap*3 + space_h*2);DeleteObject(hPen);
}void DrawUI()
{DrawKeyMouseInfo();
}#define TIMER_PAINT_CD 10L
#define TIMER_UPDATE_CD 5L
VOID CALLBACK TimerProc_Paint(_In_  HWND hwnd,_In_  UINT uMsg,_In_  UINT_PTR idEvent,_In_  DWORD dwTime)
{RECT rect;GetClientRect(hwnd,&rect);InvalidateRect(hwnd, &rect, FALSE);	//会发送WM_PAINT消息
}
VOID CALLBACK TimerProc_Update(_In_  HWND hwnd,_In_  UINT uMsg,_In_  UINT_PTR idEvent,_In_  DWORD dwTime)
{UpdateCPS();
}
PAINTSTRUCT ps;
void BeginDraw()
{hdcOrigin = BeginPaint(hwnd, &ps);SetBkMode(hdcBuffer, TRANSPARENT);
}
void EndDraw()
{EndPaint(hwnd, &ps);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{static HBITMAP hBitmap = NULL;switch(Message) {case WM_CREATE:{hdcBuffer = CreateCompatibleDC(NULL);SetTimer(hwnd, 0, TIMER_PAINT_CD, TimerProc_Paint);SetTimer(hwnd, 2, TIMER_UPDATE_CD, TimerProc_Update);break;}case WM_DESTROY: {if (hdcBuffer)DeleteDC(hdcBuffer), hdcBuffer = nullptr;if (hBitmap)DeleteObject(hBitmap), hBitmap = nullptr;KillTimer(hwnd, 0);KillTimer(hwnd, 2);PostQuitMessage(0);break;}case WM_PAINT:{BeginDraw();// 获取客户区域的大小RECT rcClient;GetClientRect(hwnd, &rcClient);int clientWidth = rcClient.right - rcClient.left;int clientHeight = rcClient.bottom - rcClient.top;// 创建双缓冲if (hBitmap)DeleteObject(hBitmap);hBitmap = CreateCompatibleBitmap(hdcOrigin, clientWidth, clientHeight);SelectObject(hdcBuffer, hBitmap);ClearDevice();DrawUI();// 将缓冲区的内容一次性绘制到屏幕上BitBlt(hdcOrigin, 0, 0, clientWidth, clientHeight, hdcBuffer, 0, 0, SRCCOPY);EndDraw();break;}default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}
/
bool TerminalCheck(DWORD dwPid, HWND _hwnd)
{	//检查是否为win11新终端HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (! stricmp(pe.szExeFile, "WindowsTerminal.exe")&& pe.th32ProcessID == dwPid) 		{			CloseHandle(hSnapshot);			{char title[MAX_PATH];GetWindowText(_hwnd, title, MAX_PATH);if(strcmp(title, _pgmptr) && strcmp(title, "Keystrokes"))return false;return true;}		}	}	return false;
}
BOOL CALLBACK EnumWindowsProc(HWND _hwnd, LPARAM lParam)
{DWORD pid;GetWindowThreadProcessId(_hwnd, &pid);if(TerminalCheck(pid, _hwnd)){hwnd_console = _hwnd;return FALSE;}return TRUE;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{_hInstance = hInstance;_hPrevInstance = hPrevInstance;_lpCmdLine = lpCmdLine;_nShowCmd = nShowCmd;scr_w = GetScreenWidth();scr_h = GetScreenHeight();taskbar_h = GetTaskbarHeight();WNDCLASS wc = { 0 };wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = "KeyStrokesWindowClass";if(!RegisterClass(&wc)) {MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST, "KeyStrokesWindowClass", "KeyStrokes by Wormwaker", WS_POPUP,0, /* x */0, /* y */scr_w, /* width */scr_h, /* height */NULL,//		NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}SetConsoleTitle("Keystrokes");if(ExistProcess("WindowsTerminal.exe")){	//win11电脑且使用新版终端EnumWindows(EnumWindowsProc, 0);}else{	//旧版控制台主机hwnd_console = GetConsoleWindow();}
#ifndef SHOWCONSOLEif(hwnd_console != INVALID_HANDLE_VALUE && hwnd_console != nullptr)ShowWindow(hwnd_console, SW_HIDE);
#endif// 设置窗口透明度SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);ShowWindow(hwnd, SW_SHOWMAXIMIZED);SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, scr_w,scr_h, SWP_NOSIZE);MSG msg;while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */TranslateMessage(&msg); /* Translate key codes to chars if present */DispatchMessage(&msg); /* Send it to WndProc */ShowWindowAsync(hwnd, SW_SHOWMAXIMIZED); //保持显示并最大化}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243849.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.【SpringBoot3】文章分类接口开发

序言 在文章分类模块&#xff0c;有以下接口需要开发&#xff1a; 新增文章分类文章分类列表获取文章分类详情更新文章分类删除文章分类 数据库表字段和实体类属性&#xff1a; 在数据库表中&#xff0c;create_user 来自于 user 表中的主键 id&#xff0c;是用来记录当前文…

JDK8新特性(一)集合之 Stream 流式操作

1.Stream流由来 首先我们应该知道&#xff1a;Stream流的出现&#xff0c;主要是用在集合的操作上。在我们日常的工作中&#xff0c;经常需要对集合中的元素进行相关操作。诸如&#xff1a;增加、删除、获取元素、遍历。 最典型的就是集合遍历了。接下来我们先举个例子来看看 J…

MYSQL之索引语法与使用

索引分类 分类 含义 特点 关键字 主键索引 针对表中主键创建的索引 默认自动创建&#xff0c;只能有一个 PRIMARY 唯一索引 …

Gateway+Springsecurity+OAuth2.0+JWT 实现分布式统一认证授权!

目录 1. OAuth2.0授权服务 2. 资源服务 3. Gateway网关 4. 测试 在SpringSecurityOAuth2.0 搭建认证中心和资源服务中心-CSDN博客 ​​​​​​ 基础上整合网关和JWT实现分布式统一认证授权。 大致流程如下&#xff1a; 1、客户端发出请求给网关获取令牌 2、网关收到请求…

Golang 中如何实现 Set

在Go编程中&#xff0c;数据结构的选择对解决问题至关重要。本文将探讨如何在 GO 中实现 set 和 bitset 两种数据结构&#xff0c;以及它们在Go中的应用场景。 Go 的数据结构 Go 内置的数据结构并不多。工作中&#xff0c;我们最常用的两种数据结构分别是 slice 和 map&#…

K8S--安装Nginx

原文网址&#xff1a;K8S--安装Nginx-CSDN博客 简介 本文介绍K8S安装Nginx的方法。 1.创建Nginx目录及配置文件 mkdir -p /work/devops/k8s/app/nginx/{config,html} 在config目录下创建nginx.conf配置文件&#xff0c;内容如下&#xff1a; # events必须要有 events {wo…

jdk的安装和Tomcat的安装

jdk的安装 双击jdk&#xff0c;然后一路下一步 公共JRE可以关闭&#xff0c;没多大用&#xff0c;反而会占用内存 计算机–>属性–>高级系统设置–>环境变量 系统变量–新建 JAVA_HOMEjdk的存放路径 修改path 在path的最后面添加&#xff08;&#xff1b;%JAVA_H…

即插即用篇 | UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

【漏洞复现】SpringBlade export-user接口SQL注入漏洞

文章目录 前言声明一、SpringBlade系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 SpringBlade 是一个由商业级项目升级优化而来的微服务架构 采用Spring Boot 2.7 、Spring Cloud 2021 等核心技术构建&#xff0c;完全遵循阿里巴巴编码规范。提供基于React和…

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

Halcon基于形状的模板匹配inspect_shape_model

Halcon基于形状的模板匹配 基于形状的匹配&#xff0c;就是使用目标对象的轮廓形状来描述模板。Halcon中有操作助手&#xff0c;可以直观 地进行形状模板匹配的参数选择以及效果测试。如果使用算子编写&#xff0c;步骤如下。 &#xff08;1&#xff09;从参考图像上选择检测的…

c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)

文章目录 1. 415. 字符串相加题目详情代码1思路1代码2思路2 2. 125. 验证回文串题目详情代码1&#xff08;按照要求修改后放到新string里&#xff09;思路1代码2(利用双指针/索引)思路2 3. 541. 反转字符串 II题目详情代码1思路1 4. 557. 反转字符串中的单词 III题目详情代码1&…

CocoaPods的安装和使用

前言 本篇文章讲述CocoaPods的安装和使用 安装cocoaPods 如果电脑没有安装过cocoaPods&#xff0c;需要先安装&#xff0c;使用下面的命令&#xff1a; sudo gem install cocoapods输入密码后开始安装&#xff0c;需要等待。。。但是我这里报错了。 The last version of d…

nexus清理docker私库

下载nexus-cli客户端&#xff0c;并非必须下载到服务器&#xff0c;理论上只要能访问到nexus就行 wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli这个链接下载不了了&#xff0c;末尾有资源下载&#xff0c;里面包含了完整包和脚本&#xff0…

即插即用篇 | YOLOv8 引入 SENetv2 | 多套版本配合使用

卷积神经网络(CNNs)通过提取空间特征并在基于视觉的任务中实现了最先进的准确性,彻底改变了图像分类。所提出的压缩激励网络模块收集输入的通道表示。多层感知机(MLP)从数据中学习全局表示,在大多数用于学习图像提取特征的图像分类模型中起到关键作用。在本文中,我们引入…

npm ,yarn 更换使用国内镜像源,阿里源,清华大学源

在平时开发当中&#xff0c;我们经常会使用 Npm&#xff0c;yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的&#xff0c;如果没有梯子的话。会感觉特别特别慢&#xff0c;所以&#xff0c;使用国内的源是非常有必要的。 Nnpm&#xff0c; yarn 常用命令 常用命令&am…

Appium 环境配置

Appium 是一个开源的、跨平台的测试框架&#xff0c;可以用来测试 Native App、混合应用、移动 Web 应用&#xff08;H5 应用&#xff09;等&#xff0c;也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念&#xff1a; •无需用户对 App 进行任何修改或…

opencv#27模板匹配

图像模板匹配原理 例如给定一张图片&#xff0c;如上图大矩阵所示&#xff0c;然后给定一张模板图像&#xff0c;如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域&#xff0c;…

软考系分之计算机网络规划设计、综合布线、RAID和网络存储等

文章目录 1、概要2、网络的三层模型3、综合布线系统4、廉价磁盘冗余阵列&#xff08;RAID&#xff09;5、网络存储6、总结 1、概要 本篇重点介绍计算机网络中的网络规划设计、综合布线、RAID和网络存储。 2、网络的三层模型 三层模型分为核心层、汇聚层和接入层&#xff0c;接…

数组A[m+n]中存放了两个线性表(a1,a2,.....am)和(b1,b2.....bn),将数组中的两个线性表的位置互换,要求空间复杂度为1

要求空间复杂度为O(1)&#xff0c;那么不可以借助辅助数组来完成此操作 算法思路&#xff1a;可先将此数组逆置变成bn,......b1,am,....,a1&#xff0c;然后分别逆转两个线性表的数据元素 算法实现 1、定义一个函数&#xff0c;该函数的功能是可以对一个数组的任意连续的部分进…