当前位置: 首页 > news >正文

用 C++ + OpenCV + Tesseract 实现英文数字验证码识别

本文展示如何用 C++ 结合 OpenCV 做图像预处理,再调用 Tesseract OCR 识别验证码。适用于希望在高性能后端或本地服务里集成 OCR 的场景。方案包含:
更多内容访问ttocr.com或联系1436423940
环境与依赖安装

图像预处理(灰度、二值化、形态学去噪、放大)

使用 Tesseract API 调用(设定白名单、PSM)

完整 C++ 示例与 CMake 构建

批量识别、并发与部署建议

评估方法与常见问题排查

1 环境准备
1.1 安装系统依赖(Ubuntu 示例)
sudo apt update
sudo apt install -y build-essential cmake pkg-config git
sudo apt install -y libopencv-dev
sudo apt install -y tesseract-ocr libtesseract-dev libleptonica-dev

macOS(Homebrew):

brew install opencv tesseract

确保 pkg-config --modversion opencv4、tesseract --version 可用。

1.2 创建工程目录
captcha_cpp_ocr/
├── CMakeLists.txt
├── src/
│ └── main.cpp
└── samples/
└── captcha.png

2 图像预处理思路(为什么要预处理)

Tesseract 对清晰、对比高、字符分离的图像效果最好。典型预处理步骤:

放缩(resize)——放大小字体提高识别率

灰度化(cv::cvtColor)

高斯模糊(可选,用于去噪)

自适应/固定阈值二值化(cv::adaptiveThreshold 或 cv::threshold)

形态学操作(开/闭运算)去除噪点或断连字符

倾斜校正(如果需要)

3 完整 C++ 示例代码(main.cpp)

把以下文件保存为 src/main.cpp。

// main.cpp
// 依赖: OpenCV, Tesseract (libtesseract)
// 编译: 使用 CMake(见项目 CMakeLists.txt)

include

include

include

include

include <opencv2/opencv.hpp>

include <tesseract/baseapi.h>

include <leptonica/allheaders.h>

namespace fs = std::filesystem;

// ---------- 图像预处理函数 ----------
cv::Mat preprocess(const cv::Mat &src) {
cv::Mat gray;
if (src.channels() == 3) {
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
} else {
gray = src.clone();
}

// 放大 - 提高小字体识别率
const double scale = 2.0;
cv::Mat resized;
cv::resize(gray, resized, cv::Size(), scale, scale, cv::INTER_CUBIC);// 可选: 高斯去噪
cv::Mat blurred;
cv::GaussianBlur(resized, blurred, cv::Size(3, 3), 0);// 自适应阈值(二值化)
cv::Mat bw;
cv::adaptiveThreshold(blurred, bw, 255,cv::ADAPTIVE_THRESH_GAUSSIAN_C,cv::THRESH_BINARY_INV, 11, 2);// 形态学处理:先开运算去小噪点,再闭运算连接字符可能断裂边缘
cv::Mat morph;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2,2));
cv::morphologyEx(bw, morph, cv::MORPH_OPEN, kernel);
cv::morphologyEx(morph, morph, cv::MORPH_CLOSE, kernel);// 可选: 再次去小区域噪点
std::vector<std::vector<cv::Point>> contours;
cv::findContours(morph.clone(), contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (auto &c : contours) {double area = cv::contourArea(c);if (area < 20) {cv::drawContours(morph, std::vector<std::vector<cv::Point>>{c}, -1, cv::Scalar(0), cv::FILLED);}
}// 最终返回二值图 - 转回白底黑字(Tesseract 对白底黑字通常表现更稳)
cv::Mat final;
cv::bitwise_not(morph, final); // invert to white background, black text
return final;

}

// ---------- 使用 Tesseract 识别单图 ----------
std::string recognizeWithTesseract(const cv::Mat &img, tesseract::TessBaseAPI &api) {
// 将 OpenCV Mat 转为 Pix*(Leptonica)
Pix *pix = pixCreate(img.cols, img.rows, 8);
for (int y = 0; y < img.rows; ++y) {
memcpy(pixGetData(pix) + y * pixGetWpl(pix) * 4, img.ptr(y), img.cols);
}
// 也可使用 pixReadMem or pixCreateHeader + pixSetData,以上为简化示例

api.SetImage(pix);
api.Recognize(0);
char *out = api.GetUTF8Text();
std::string result;
if (out) {result = std::string(out);delete[] out;
}
pixDestroy(&pix);
// 清理并返回
// 去掉换行与非字母数字字符
std::string cleaned;
for (char c : result) {if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))cleaned.push_back(c);
}
return cleaned;

}

int main(int argc, char** argv) {
if (argc < 2) {
std::cout << "Usage: " << argv[0] << " <image_or_folder>\n";
return 1;
}

std::string path = argv[1];
tesseract::TessBaseAPI api;
// 初始化 tesseract:NULL 表示使用默认 TESSDATA_PREFIX 环境变量或安装路径
if (api.Init(NULL, "eng", tesseract::OEM_LSTM_ONLY)) {std::cerr << "Could not initialize tesseract.\n";return -1;
}
// 白名单:只识别大写字母和数字(根据需求调整)
api.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
// 可设置页面分割模式:单行/单词等,常用 PSM_SINGLE_LINE 或 PSM_SINGLE_BLOCK
api.SetPageSegMode(tesseract::PSM_SINGLE_LINE);// 如果是文件夹,批量识别
fs::path p(path);
std::vector<fs::path> images;
if (fs::is_directory(p)) {for (auto &entry : fs::directory_iterator(p)) {if (!entry.is_regular_file()) continue;std::string ext = entry.path().extension().string();std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp") {images.push_back(entry.path());}}
} else {images.push_back(p);
}for (auto &imgPath : images) {cv::Mat src = cv::imread(imgPath.string());if (src.empty()) {std::cerr << "Failed to open " << imgPath << "\n";continue;}cv::Mat proc = preprocess(src);// 调试可视化:// cv::imshow("proc", proc); cv::waitKey(0);std::string text = recognizeWithTesseract(proc, api);std::cout << imgPath.filename().string() << " -> " << text << std::endl;
}api.End();
return 0;

}

说明:上面把 Pix 创建做了示意(简化),在实际工程中建议使用 pixCreateHeader + pixSetData 或将 Mat 保存为临时 PNG 再 pixRead。若要避免内存复制,参考 Leptonica 文档使用 pixCreateHeader 并设置数据指针,注意行对齐(wpl)和内存生命周期。

4 CMakeLists.txt(构建脚本)

创建项目根目录 CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(captcha_ocr)

set(CMAKE_CXX_STANDARD 17)
find_package(PkgConfig REQUIRED)
pkg_check_modules(OPENCV4 REQUIRED opencv4)
find_package(Tesseract REQUIRED)

include_directories(${OPENCV4_INCLUDE_DIRS})
link_directories(${OPENCV4_LIBRARY_DIRS})
add_definitions(${OPENCV4_CFLAGS_OTHER})

add_executable(captcha_ocr src/main.cpp)

target_link_libraries(captcha_ocr ${OPENCV4_LIBRARIES} tesseract lept)

5 构建与运行
mkdir build && cd build
cmake ..
make -j4

单张测试

./captcha_ocr ../samples/captcha.png

批量测试

./captcha_ocr ../samples/

6 性能调优与工程化建议

避免频繁 Init/End:在服务中持久化 tesseract::TessBaseAPI 实例,避免每次请求初始化开销。

并发:Tesseract 对并发不完全线程安全,推荐创建 worker 池,每个 worker 拥有自己的 TessBaseAPI(避免共享同一实例)。

预处理批量化:在多线程中把预处理与 I/O 分离,使用队列减少阻塞。

更好的 Pix 转换:使用 Leptonica 的内存接口避免写临时文件,提高吞吐。

PSM 与 OEM 调优:尝试 PSM_SINGLE_CHAR, PSM_SINGLE_WORD, PSM_SINGLE_LINE,以及 OEM 的 OEM_LSTM_ONLY 或 OEM_DEFAULT 来找到适合样本的设置。

白名单严格化:若验证码仅数字,则白名单只设置 0123456789,能显著降低误检率。

候选后处理:固定长度验证码可做长度校验;通过字典或正则修正规则(如把小写 o 映射为 O,0 vs O 映射)。

多模型/多预处理投票:对同一图像用多种预处理参数产生多个候选结果,投票选最频繁结果,能提升稳健性。

7 评估方法(量化识别效果)

准备人工标注测试集(建议 500–2000 张真实样本)。

指标:

单字符准确率 = 正确识别的字符总数 / 总字符数

整串准确率 = 被完全正确识别的图像数量 / 总图像数

记录错误示例并统计混淆(例如 O↔0, I↔1),用来决定后处理规则。

8 常见问题与排查

输出为空或乱码:检查 Tesseract tessdata 路径及语言包是否安装;确认图片不是全白或全黑(预处理是否出错)。

CT C or internal errors:检查 pix 创建是否正确(位深、行对齐),建议先以临时 PNG 写磁盘再 pixRead 验证流程。

识别速度慢:避免每次读写磁盘、使用内存转换;批量或多线程处理。

误识别率高:增强数据(噪声、放大、不同阈值)、调整 SetPageSegMode、白名单或用训练模型(tess training)微调。

9 拓展方向(如果要更高准确率)

使用深度学习模型(CRNN、Transformer)对特定风格验证码训练专用模型,通常优于通用 OCR。

当验证码样式固定时,考虑对 Tesseract 进行自训练(生成 .traineddata)。

将前端图像分割成字符单元后逐字符识别(若字符分割可行)。

10 合法与道德提醒

本教程旨在技术学习与提升防护能力,不得用于未经授权的绕过安全措施或攻击网站。在对真实网站进行任何自动识别或抓取前,请获得授权并遵守使用条款与法律法规。

相关文章:

用 C++ + OpenCV + Tesseract 实现英文数字验证码识别

本文展示如何用 C++ 结合 OpenCV 做图像预处理,再调用 Tesseract OCR 识别验证码。适用于希望在高性能后端或本地服务里集成 OCR 的场景。方案包含: 更多内容访问ttocr.com或联系1436423940 环境与依赖安装 图像预处理(灰度、二值化、形态学去噪、放大) 使用 Tesseract API…...

java 第一节课课前提问

一、使用Java能编写的程序 企业级后端应用 Java 在企业级开发中占据重要地位,常被用于构建大型服务器端应用,如电商平台、银行交易系统、CRM(客户关系管理)系统等。这类应用通常需要处理高并发、复杂业务逻辑和海量数据,Java 凭借稳定的性能、丰富的企业级框架(如 Spring…...

二进制解码器、选通器和分配器

二进制解码器 3比特的二进制解码器可以由下图表示。每种组合方式对应着解码器的不同输出。3-8解码器可以用三个非门和三个与门构成解码器可以拼接起来组成更大的解码器,比如两个3-8解码器可以拼起来组成一个4-16解码器。选通器和分配器。 选通器 一个8选1的选通器如下图所示。…...

2025最新版 Photoshop软件免费下载安装完整教程(PS2025)超详细安装教程

Adobe Photoshop 2025 凭借升级的 AI 编辑功能、更优的图像处理效率,成为设计与摄影领域的热门工具。但不少用户在安装时,易因路径选择、安全软件拦截等问题卡壳。本教程聚焦安装全流程,从前期准备到后续配置,用清晰步骤帮你避开误区,顺利完成安装,快速解锁 PS 2025 的创…...

nac一键卸载软件脚本

将下面的代码保存为uninstall.sh: echo delete shit.app..need your root pwd; sudo rm -rf /Applications/dvc-manageproxy-exe.app; sudo rm -rf /Applications/LVSecurityAgent.app; echo script is fighting...; sudo chflags noschg /opt/LVUAAgentInstBaseRoot; sudo chf…...

交叉编译openharmony版本的openssh

sudo mkdir /systemsudo chmod 777 /system/export CC=aarch64-linux-gnu-gcc编译zlib./configure --prefix=/systemmake && make install 编译openssl./config linux-aarch64 --prefix=/system/ --openssldir=/system/etc/ssl --libdir=…...

为什么不建议在 Docker 中跑 MySQL

前言 今天我们来聊聊一个很有趣的话题:为什么我不建议在Docker中运行MySQL数据库? 有些小伙伴在工作中可能为了部署方便,习惯将所有组件都容器化,但数据库真的适合放在容器里吗? 今天就专门跟大家一起聊聊这个话题,希望对你会有所帮助。 一、容器化与数据库:天生的矛盾?…...

CFD

算例汇总 1、一维Sod激波管 2、二维平板 3、NACA0012 4、高马赫数喷流 5、双马赫反射 6、二维Riemann 7、二维Rayleigh-Taylor 8、TENO算例...

[MCP][05]Elicitation示例

Elicitation能让工具在关键时刻暂停执行,并向用户请求特定信息前言 如果你之前接触过LangGraph的"Human in the loop"概念,那么理解MCP的Elicitation机制就会容易很多。这两个功能非常相似,都是让AI在需要时停下来,礼貌地向人类寻求帮助或确认。 想象一下,当你正…...

Warsaw主题关闭导航条

\setbeamertemplate{headline}{}...

Python Socket网络编程(2)

进程:提供计算资源的单位 线程:真正工作的单位(cpu调度最小单元) GIL锁:全局解释器锁(是CPython解释器特有的,平时说的Python解释器一般都是CPython解释器,还有GPython等等) 让一个进程中同一时刻只能有一个线程可以被CPU调动。所以Python中应该是没有严格意义的多线程…...

PS2025安装包下载及PS2025安装包安装教程详细步骤(包含安装包下载链接)

在图像处理领域,Adobe Photoshop 一直占据着举足轻重的地位,而 PS 2025 更是汇聚前沿技术与实用功能,成为众多设计师与图像处理爱好者的得力工具。但初次安装这款软件,可能会因步骤繁杂、细节众多而让人感到棘手。别担心,本教程将以清晰、简洁的方式,带你一步步完成 PS 2…...

Nature Genetics | 本周最新文献速递

Multiancestry brain pQTL fine-mapping and integration with genome-wide association studies of 21 neurologic and psychiatric conditions 中文标题: 多祖先脑蛋白遗传调控解码!pQTL精细映射揭示神经精神疾病机制 关键词: 脑蛋白定量性状位点、精细映射、多祖先整合、…...

关于go里切片作为函数参数时是引用传递还是值传递

go语言中切片参数的值传递问题问题起因 写一道回溯算法题,把ans二维数组作为函数参数传入,想在函数里面,不停地append,最后返回ans 实际发现ans打印出来是空的,就很奇怪,因为我是事先分配好空间的,理论上不会发生扩容,底层数组是共用的,咋回事 func permute(nums []in…...

DRAN读写循环

DRAM读写循环 以一个8 * 8 的二维阵列为例子,假设部分存储单元为1,部分为0,现在要读写其中某一个cell的值。为了确定存储的位置,我们需要内存地址,为了传输内存地址,我们需要地址总线。8 * 8阵列一共有64个cell,我们需要6线地址总线,一共能表示64种二进制值。三根地址总…...

数据结构操作相关

堆 1、插入元素上滤每一次与父亲比较,满足大小就往上交换,直至不能往上为止。每次往上交换不会影响下面的性质2、删除/输出堆顶下滤假设大根堆,根节点换入末尾节点,每次先找出大儿子,若大儿子比自己大,则往下和他交换,直至不能往下为止。 3、建堆 1)初始为空,逐个inse…...

Neisbitt 不等式的证法

\(a,b,c\in R^+求证:\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+b}\geq\frac{3}{2}\) 证明: \(\because a,b,c\in R^+,\therefore\exists x,y,使得b=ax,c=ay\) \(\therefore LHS=\frac{1}{x+y}+\frac{x}{1+y}+\frac{y}{1+x}\) \(\therefore 令f(x,y)=\frac{1}{x+y}+\frac{x}{1+…...

端口转发神器Rinetd:轻量级安装与配置指南

什么是Rinetd? Rinetd(Redirection Internet Daemon)是一款轻量级的TCP端口转发工具,可以将来自一个IP地址和端口的连接转发到另一个IP地址和端口。它配置简单、资源占用少,是系统管理员和开发人员进行端口转发的理想选择。 Rinetd的主要特点轻量级:体积小,资源占用低 配…...

C语言中递归思想的应用

C语言中递归思想的应用 一、递归思想 在C语言中,函数是程序的基本单位,每个函数负责解决特定问题。但如果程序中出现n个相同的问题,就需要调用对应函数n次,这会导致程序冗长、可读性差。那么,有没有更简洁的解决方案呢? 答案是递归函数。递归函数并非万能,它更适用于解决…...

WITH RECURSIVE 递归公用表表达式(CTE)

生成一个从 1 到 12352 的连续数字序列SQL server SQL Server 对递归 CTE 有默认的递归深度限制(默认是 100),当递归次数超过这个限制时会报错。当远超默认限制时,需要在查询前使用 OPTION (MAXRECURSION 0) 来取消递归深度限制。WITH RECURSIVE num_sequence AS (SELECT 1…...

#java作业

1方法相关问题、 public class Main { static void changeStr(String x) { x = "xyz"; } static void changeArr(String[] strs) { for (int i = 0; i < strs.length; i++) { strs[i] = strs[i]+""+i; } } public static void main(String[] args) { …...

leetcode 3541. 找到频率最高的元音和辅音 便捷

leetcode 3541. 找到频率最高的元音和辅音 便捷pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...

匿名递归与不动点组合子

先贴上 CS61A Homework 3 Recursion, Tree Recursion 中的最后一道思考题题面: ​Q6: Anonymous FactorialThis question demonstrates that its possible to write recursive functions without assigning them a name in the global frame.The recursive factorial function…...

Markdown学习Day01

Markdown学习第一天 【【狂神说Java】Java零基础学习视频通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=6&vd_source=e3ba980d960d7d6c98e4872bba8cf225 Markdown学习 二级标题 字体 her hus hou KLI 引用选择不需要辩护。分割线插图超链接 学Java 表格年级 班…...

flutter compass结构代码分析

1.config文件夹:1.1assets.dart返回一个Assets类,包含activities和destinations两个静态属性。两个静态属性分别代表虚拟数据存放的路径。在assets文件夹下1.2 dependencies.dart使用provider绑定远程访问和本地访问所需要的数据 2.data文件夹2.1 repositoriesactivity文件夹a…...

25.9.15

应该都知道我退役了吧。 我对于这一段竞赛生涯呢,情感太复杂了。 (话说退役半年才回来写是不是有点晚了) 怎么说呢,这段竞赛让我有了一段快乐的时光,也让我彻底改变了。 想说很多,但是又说不出口。 先说说坏处吧 我的抑郁症可以说是被竞赛加深的,以至于我在初三下和高一…...

二十八、共享内存多处理器的基本概念

目录1. 核心定义2. 两种主要的共享内存架构a) 均匀内存访问b) 非均匀内存访问3. 共享内存多处理器的核心挑战与解决方案a) 缓存一致性b) 内存一致性4. 编程模型与同步5. 优势与劣势优势:劣势:总结共享内存多处理器是多处理器系统中最常见和直观的一种架构,也是现代多核CPU设…...

详细介绍:【ARMv7】系统复位上电后的程序执行过程

详细介绍:【ARMv7】系统复位上电后的程序执行过程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospac…...

C#高级语法

https://www.cnblogs.com/NotEnough/p/7426853.html https://juejin.cn/post/7100033147101773831...

配置Maven

IDEA配置Maven原文链接:https://blog.csdn.net/leah126/article/details/132020904 一、Maven下载 首先我们进入maven官方网站,进入网页后,点击Download去下载。下载免安装版,解压即可,解压至磁盘任意目录,尽量不要取中文名如下图: 二、配置Maven环境变量 打开cmd命令行,…...

那两年的回忆录

小引 我的OI之路是短暂且波折的,像是一则故事,曲曲折折,却又很是有趣,或许那两年是我最愉快的时光吧。 我总是问自己当初为什么要学OI,许是一腔热血,许是奔赴热爱。仔细想想,从最开始接触scratch,到后来的Python,最后的C++,前面两个都是觉得好玩,觉得有趣,可C++呢,…...

DDR4基本介绍

DDR4简介 DRAM的存储原理 DRAM的基本存储单元:cell 一个cell由一个晶体管和一个电容(约为30pF)组成,电容存储了电量代表1,电容放空电量代表0,晶体管作为电容的充放电开关,以便实现1bit数据的读写,cell的结构如下图所示 :读的过程:首先打开MOS管,根据电容的充放电信息…...

网络同步预测-Prediction

预测(Prediction) 是解决网络延迟问题、提升玩家操作流畅度的核心机制客户端接收玩家输入玩家操作(如 WASD 移动、跳跃)被捕获为输入事件(FInputActionValue)。客户端本地预测执行客户端不等服务器响应,直接基于输入在本地模拟角色行为(如移动、动画播放),并立即更新…...

二十五、多处理器的基本概念 (SISD/SIMD/MIMD)

目录1. SISD - 单指令流单数据流2. SIMD - 单指令流多数据流3. MIMD - 多指令流多数据流总结与对比简单类比多处理器体系结构中的三个基本概念:SISD、SIMD 和 MIMD,这些概念由迈克尔弗林(Michael Flynn)于1966年提出,被称为弗林分类法(Flynns Taxonomy)。它根据指令流(…...

java课堂问题2

1.1changeStr(String x):方法内部尝试将传入的字符串参数重新赋值为 "xyz",但该操作仅在方法内部有效,不会影响外部实参 changeArr(String[] strs):遍历传入的字符串数组,对数组中的每个元素进行修改,在原字符串后拼接其索引值(例如将第 0 个元素改为 "原…...

集训总结(六)

9.15 听 CEO 讲了 sb 树,不知道该写什么,挂个祂博客的链接吧。 https://www.cnblogs.com/Augenstern-/p/18964066...

GAS_Aura-Prediction GAS

1讲了关于GAS中的网络之间,Client-Server的网络同步时,需要使用预测...

PromptPilot 产品发布:火山引擎助力AI提示词优化的新利器

周六非常荣幸参加了火山引擎官方举办的PromptPilot产品发布会。其实早在8月份,我就有幸参与了该产品的内测阶段,并撰写了一些体验心得和感受。此次发布会当天,不仅深入聆听到了产品负责人以及工程师们对PromptPilot的全新解读和详细介绍,还现场感受到了他们对产品未来发展方…...

安装window版本docker

下载 下载链接:https://hub.docker.com/?overlay=onboarding 在 Windows 上部署 Docker 的方法都是先安装一个虚拟机,VMware版本17.0以上可以兼容安装docker 另一个可以下载 Hyper-V,Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox 选中Hyper-V 也可以通过命令…...

已严肃完成今日特征多项式大学习

何为特征值与特征向量 古人云:特征向量,乃方阵与线性变换之特征也。 盖线性变换,千变万化,寻不变其所向之向量,乃特征向量也。注意 0 向量不是特征向量。 何为特征值?线性变换中特征向量的伸长倍数,称该特征向量属于该特征值。 容易知道与一个特征向量共线的向量均为特征…...

docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践

docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

python_Day21_mysql(2)

今日内容大纲介绍约束详解单表约束 多表约束DQL语句详解简单查询 条件查询 聚合查询 分组查询 排序查询 模糊查询 分页查询多表查询交叉连接 连接查询 子查询 自关联(自连接)查询扩展: 多表建表一对多 多对多 一对一1.主键约束详解 /* 约束详解:概述:SQL中的约束分为: 单表约束…...

.zip用法

.zip() 函数在 Python 中是一个非常实用的内置函数,它用于将多个可迭代对象(比如列表、元组等)中的元素打包成一个元组的迭代器。 简单来说,它的作用就是把不同序列中对应位置的元素配对,就像拉链一样把两排牙齿咬合在一起。 zip() 的基本用法 zip(iterable1, iterable2, …...

vue2使用pnpm编译打包时的错误处理

1. 错误信息 error in ./src/views/forest/forestGateway.vue?vue&type=script&lang=js Module parse failed: Unexpected token (203:39) File was processed with these loaders: * ./node_modules/.pnpm/**cache-loader**@4.1.0_webpack@4.47.0/node_modules/cach…...

中南上课第一天

一周三天早八,体验衡中生活:( 早上起来就发现食堂的人巨多,一看原来是崩铁和瑞幸联名了,看来学校崩p还是挺多的,我看到有卖油条和豆浆的,于是浅尝了一下——还是避雷吧,油条油的要死,吃了一根第二根实在是咽不下去了,于是扔了去教室,如图,不愧是知名的电动车帝国,这…...

二十四、深入理解CPU控制信号的最终使命

目录指挥官与士兵:深入理解CPU控制信号的最终使命一、舞台与演员:认识数据通路中的角色二、核心命题:为什么说控制信号“仅”作用在功能部件上?三、澄清误区:那流水线寄存器呢?四、更深层的意义:理解计算机架构的哲学结论指挥官与士兵:深入理解CPU控制信号的最终使命 在…...

20250915 - 状压dp 总结

比赛链接:https://vjudge.net/contest/748191。 A - 互不侵犯 最最最最最最最板子的状压 DP。 大概就是一行一行去弄。然后的话,DP 维护三个量,当前遍历到第 \(i\) 行,目前总共放了 \(j\) 个国王,以及这一行的放置国王情况为 \(st\)(用二进制状压表示)。判断的时候,有一…...

PS2025安装包永久免费版下载安装教程Photoshop 2025 v26.0安装包永久免费版下载

身边很多朋友问我怎么装 PS 2025,其实步骤不难,先跟大家说下这软件到底好用在哪,再一步步教安装,最后给几个常用的实操案例,新手跟着做就能上手,不管是想做摄影后期、商业设计,还是社交账号配图,看完这篇 Photoshop 2025 v26.0 下载安装教程都能搞定。目录一、先搞懂 P…...

学校真是太棒了

我的学校是全世界最好的学校,不接受反驳!学校太好了 作为学生评判学校自然要说点实际的。 就比如说住宿环境,那是我见过的最优秀的宿舍了。 你们学校会把宿舍改装成水帘洞吗 今天中午回到宿舍就发现学校为了让我们更加凉爽,同时赏心悦目,将宿舍改装成水帘洞,一进宿舍楼就…...

如果远程玩家过早结束异步任务,并且具有该集的任务仍在运行,则该任务被杀死-SetWaitingOnRemotePlayerData()

SetWaitingOnRemotePlayerData主要用于控制游戏模式是否等待远程玩家(通常是网络多人游戏中的客户端)的数据加载完成。调用时,可以直接杀死该使用数据的任务...