简介资源为一份“基于特征匹配的英文印刷字符识别”项目案例PDF适合计算机视觉、图像处理与深度学习入门者以及使用MATLAB、Python进行算法验证与开发的工程师。案例围绕印刷体字符识别流程展开重点讲解灰度转换、中值滤波、二值化全局阈值、形态学滤波、字符分割、倾斜校正、字符标准化、归一化细化等预处理方法并涉及统计特征与结构特征提取、标准特征库构建、模板匹配识别算法从图像输入到字符输出层层拆解帮助读者理解特征匹配原理并快速把握工程实现要点。压缩包共1个PDF文档大小约1.04MB内容紧凑、章节结构清晰可对照案例逐步研读。已有592人学习下载既能用于课程设计与毕业设计也可作为OCR应用开发的参考资料和进一步研究素材。1. 特征匹配的英文印刷字符识别不依赖深度学习的传统视觉方案在《计算机视觉与深度学习实战——以MATLAB和Python为工具》第9章里这套英文印刷字符识别案例走了一条和当下主流相反的路线不用任何深度学习模型全靠图像预处理、形态学滤波和模板匹配就在MATLAB里完成了从印刷图片到字符文本的完整识别链路。核心策略是先把A到Z、a到z、0到9共62个标准字符做成模板库再用像素差绝对值之和做匹配判断当前字符属于哪一类。对做课程设计、毕业设计或者想快速验证传统OCR流程的从业者来说这套方案的计算量小、每一步都可视化、可调试比直接调一个黑匣子识别模型更能帮你理解字符识别的底层逻辑。而且它把鼠标移动事件和识别结果联动起来指向哪就识别哪演示效果好适合做项目展示。2. 预处理链路灰度、二值化与形态学滤波的参数为什么这样定字符识别系统的识别率上限在预处理阶段就已经决定了。印刷体图片经过扫描或拍照往往存在背景不均匀、纸张纹理、局部模糊和杂散噪点这些干扰不处理掉后面的分割和匹配全都会跟着错。这一章的预处理链路在代码里是顺序执行的灰度化 → 二值化 → 形态学闭运算 → 面积过滤 → 定点清除标点 → 二次闭运算每一步都有明确的参数和目的。2.1 灰度化与二值化为什么阈值选 0.7 而不是自适应代码里对读入的图片先做通道判断再灰度化picname fullfile(pwd, image.jpg); pic imread(picname); s size(pic); if length(s) 3 pic rgb2gray(pic); end bw im2bw(pic, 0.7); bw ~bw;length(s) 3判断的是图像矩阵的维度彩色RGB图像是三维矩阵灰度图是二维矩阵这个判断保证重复运行时不会对灰度图二次转换。im2bw(pic, 0.7)是一个全局固定阈值灰度值大于0.7的像素置为1白小于等于0.7的置为0黑。紧接着的bw ~bw把黑白反转让字符区域变成1、背景变成0因为后续regionprops、bwlabel这类函数默认处理前景为1的图像。这里有个值得讨论的点阈值0.7是写死的不是自适应阈值。对于印刷体字符字符墨迹和纸张背景的灰度差异通常很大固定阈值在多数扫描图上都能工作。但如果你换了一张偏暗的图片或者纸张本身带底色这个阈值就要调。我在复现时做过测试0.6到0.8之间对同一张图的二值化结果差异不大但低于0.5会把浅色纸张也变成前景高于0.85字符笔画会断掉。更稳妥的做法是换成graythresh计算OSTU全局最优阈值但案例代码为了展示核心流程刻意用了固定值理解这一点能帮你更快定位二值化异常。2.2 形态学滤波三连闭运算、面积过滤、定点清除二值化之后图上除了字符还有不少干扰纸张上的杂点、标点符号、扫描产生的孤立小色块。案例用连续三步形态学操作处理bw1 imclose(bw, strel(line, 4, 90)); bw2 bwareaopen(bw1, 20); bwi2 bwselect(bw2, 368, 483, 4); bw2(bwi2) 0; bw3 bw .* bw2; bw4 imclose(bw3, strel(square, 4));strel(line, 4, 90)创建了一个长度为4像素、方向90度的线形结构元素imclose是闭运算。闭运算的作用是填充字符笔画的细小断裂特别是竖直方向的断笔。英文印刷体常见的笔画断裂是扫描时墨迹不均造成的用竖直线结构元素做闭运算能把同一字符内上下分离的笔画重新接起来。参数4表示结构元素长度这个值不能设太大否则会把相邻字符也连到一起。bwareaopen(bw1, 20)删除面积小于20像素的连通域这是针对微小杂点的过滤。面积阈值20是这个案例在演示图分辨率下反复调试出来的值图片分辨率变化时要重新确认。再往下是整段代码里最玄学的一行bwselect(bw2, 368, 483, 4)。bwselect的作用是选中包含指定坐标点的连通域这里选中了图像中(368, 483)这个像素所在的4连通区域然后bw2(bwi2) 0把它置为背景。这个坐标是实例图片中某个标点符号的位置属于硬编码清理手段。它只对这张特定的演示图有效换一张图这个坐标指向的地方可能根本没有前景像素也可能误删掉一个正常字符。这不是通用做法更像是作者针对演示图做的定点清洁复现时如果图片不同这一步大概率要删掉或者改成按连通域面积规则过滤。bw3 bw .* bw2是两幅二值图逐像素相乘相当于取交集。因为bw2经过闭运算和面积过滤后字符形状已经发生了变化直接用bw2做分割会丢失细节而bw保留了原始二值图最精确的字符形状。用原始图点乘掩膜图就得到了用滤波结果定位字符区域、用原始图保留精细轮廓的效果。最后imclose(bw3, strel(square, 4))用4×4方形结构元素再做一次闭运算把字符内部的小孔洞和边缘毛刺修平。2.3 倾斜校正与字符标准化投影平均高度的判据采集的印刷体图像经常有轻微倾斜同一行字符不在同一水平线上直接做水平分割会切错。案例里给出的倾斜校正思路不复杂分别统计图像左右两边黑色像素的积分投影计算平均高度位置如果左右两边的平均位置差异较大说明图像存在倾斜。常见的投影校正是通过 Hough 变换检测文本行的倾角但这套案例用的是更轻量的方法——利用英文文本行的左右两端字符基线基本一致的先验。实现时可以对图像左侧若干列的前景像素求行坐标均值对右侧若干列同样求均值两个均值的差再换算成角度。换算关系是角度 atan2(高度差, 水平距离)。校准方法用imrotate反向旋转即可。这个处理在主程序里没有显式调用属于对输入图片的假设前提但你在处理自己的图片时如果识别率突然下降先看一眼原图是不是歪的。字符标准化则是把分割出的单个字符统一到相同尺寸避免因为字体大小不一致导致匹配距离失真。案例的思路是先统一高度再按原始宽高比缩放宽度这样能保留字符的横竖比例特征比如m和l的宽度差异就不会被抹掉。3. 单词与字符分割bwlabel、regionprops 与包围盒填充技巧预处理完成后图像上的前景区域就只剩下字符和少量残留噪声。分割阶段要解决两个层次的问题先按单词把图片切成小块再在单词内部按连通域切出单个字符。案例用regionprops提取包围盒做单词分割用bwlabel标记字符连通域还有一个非常巧妙的包围盒填充技巧让鼠标事件能命中字符的空心区域。3.1 单词级分割regionprops 的 BoundingBox 到底给了什么[Lbw4, numbw4] bwlabel(bw4); stats regionprops(Lbw4); for i 1 : numbw4 tempBound stats(i).BoundingBox; tempPic imcrop(pic, tempBound); tempStr fullfile(pwd, sprintf(pic\\%03d.jpg, i)); imwrite(tempPic, tempStr); endbwlabel(bw4)对预处理后的二值图做连通域标记Lbw4是标签矩阵每个连通域内的像素被赋值为同一个正整数numbw4是连通域总数。regionprops(Lbw4)不指定属性参数时默认计算每个连通域的Area、Centroid、BoundingBox等基础属性。BoundingBox返回[x, y, width, height]表示包围该连通域的最小矩形。这里分割出的实际上是单词级别的区域块因为预处理阶段的闭运算已经用一个竖直方向的结构元素把同一单词内相邻字符连接起来了。之后用imcrop(pic, tempBound)在原图上裁剪出这个区域保存成pic\001.jpg这样的文件。注意裁剪用的是原始灰度图pic而不是二值图bw4保存下来的单词图片保留了灰度细节方便人工检查分割效果。BoundingBox里的坐标有一点要留意x是列坐标y是行坐标格子宽高都以像素为单位这套约定和imcrop的输入参数完全一致。如果你自己写代码时把x和y对调了裁剪出来的就是一块位置完全错乱的区域。3.2 字符级连通域与 4/8 连通的差别单词块保存完之后代码回到预处理得到的bw1上做字符级连通域标记[bl, num] bwlabel(bw1, 4);注意这里用了第二个参数4表示4连通而前面bwlabel(bw4)用的是默认的8连通。4连通只把上下左右四个方向的相邻像素视为同一连通域8连通还包含对角线方向。英文印刷体字符笔画比较细斜向笔画很多用4连通更容易把XW这类斜笔字符在交叉处断开得到更细粒度的字符单元。但这也带来一个问题同一张图里4连通的连通域数量会比8连通多某些字符可能被拆成多个碎片。案例的后续匹配逻辑是按连通域逐个和模板比对的如果字符本身被bwlabel拆碎匹配距离会偏大识别结果可能落到错误类别上。这个我在后面避坑章节会具体展开。3.3 包围盒填充让鼠标指到字符空心处也能命中这一节是整个案例里最值得抄的一个技巧bll zeros(size(bl)); for i 1:num [f1, f2] find(bl i); bll(min(f1):max(f1), min(f2):max(f2)) i; end这段代码的逻辑对标签矩阵bl中的第i个连通域用find找出它的所有像素坐标取行坐标的最小值和最大值、列坐标的最小值和最大值得到一个正好包住该字符的矩形区域然后把bll在这个矩形区域内的所有像素都赋值为标签值i。原始标签矩阵bl只有字符笔画位置的像素有标签字符内部的空心区域比如o的圈内、A的三角内标签值是0。鼠标移动事件里如果指针落在空心区域curlabel取到0就无法触发识别。而经过bll的包围盒填充后整个字符矩形区域内都是有效标签鼠标只要指到字符的任意位置哪怕指在笔画之外的空隙里也能定位到对应的连通域。这是一个用空间换命中率的典型做法逻辑简单效果立竿见影。代价是矩形区域内的非字符像素也被赋予了标签鼠标指向字符旁边的背景区域时可能误触发匹配。但实际演示场景里这个误触发概率很低而且匹配结果本身就是按最小距离选的无字符区域的二值像素和所有模板的距离都不会太小不会真的输出一个错误的强识别结果。4. 标准字符库与模板匹配核心getframe 截屏建库像素差绝对值定类别模板匹配识别的关键在模板库怎么来、匹配距离怎么算。这个案例的模板库生成方式非常有创意它没有收集真实扫描字符样本而是直接在MATLAB的Figure窗口里用text函数画出每个字符再用getframe截屏走一遍二值化和裁剪得到标准模板图像。这意味着只要电脑里有中文字体就能生成任意字体的字符模板库换字体只需要改一个参数。4.1 模板库怎么来画字符、截屏、二值化、裁剪hf1 figure; imshow(zeros(32,32)); fontName 宋体; fontSize 18; h text(15, 15, a, Color, w, Fontname, fontName, FontSize, fontSize); if ~exist(Database, dir) mkdir(Database); end chars [char(uint8(A):uint8(Z)), uint8(a):uint8(z), uint8(0):uint8(9)]; eleLen length(chars); charpic cell(1,eleLen); for p 1 : eleLen set(h, String, chars(p)); fh getframe(hf1, [85, 58, 30, 30]); temp fh.cdata; temp im2bw(temp); [f1, f2] find(temp 1); temp temp(min(f1)-1:max(f1)1, min(f2)-1:max(f2)1); charpic{p} temp; end delete(hf1); for i 1 : length(charpic) imwrite(charpic{i}, fullfile(pwd, sprintf(Database/%d.jpg, i))); end创建一个不可见的Figure窗口显示32×32的纯黑图像在上面放置一个白色的text对象。循环里每次用set(h, String, chars(p))切换显示的字符然后getframe(hf1, [85, 58, 30, 30])抓取Figure窗口内以(85, 58)为左上角、宽高为30×30区域的图像。这个区域是text对象渲染字符的位置抓下来之后就是该字符的图像。getframe的rect参数是相对Figure窗口的像素坐标和图像坐标系的约定一致抓下来的fh.cdata是RGB数据再经过im2bw转成二值图像。接下来find(temp 1)找到前景像素的行列坐标用最小行列值和最大行列值把字符有效区域裁出来边缘留1像素的余量。这样每个模板就只剩下字符本体去掉了周围的空白。字符集chars的构造是[char(uint8(A):uint8(Z)), uint8(a):uint8(z), uint8(0):uint8(9)]依次生成大写字母、小写字母和数字共62个模板。charpic{p} temp把每个模板存进cell数组最后统一写盘到Database文件夹方便以后直接读取。这段代码最需要注意的是[85, 58, 30, 30]这四个数字。它们和text(15, 15, ...)的坐标、fontSize 18是联动关系text的绘制位置和字符的实际像素区域必须落在截屏窗口内。我复现时候遇到过截出来是纯黑的情况因为text对象的坐标单位是基于坐标轴的而getframe的rect是基于Figure的两者参考系不同。如果在你的MATLAB版本上截出来是空的把截屏区域扩大比如改成[50, 30, 80, 60]再让后面的裁剪逻辑去处理多余空白。主程序里生成模板的部分和这里几乎一样差别在字号用的是检测到的图像真实字符高度fontSize FontSizeT字体是宋体。用和待识别图一致的字符字号做模板匹配时再imresize到实际连通域大小能有效降低缩放带来的失真。4.2 匹配度量像素差绝对值之和为什么够用识别核心在回调函数ShowPointData里mincost 100000; mark 1; for i 1 : length(charpic) temp1 charpic{i}; ss size(temp); temp1 imresize(temp1, ss); tempcost sum(sum(abs(temp - temp1))); if tempcost mincost mincost tempcost; mark i; end endtemp是当前鼠标指向的连通域裁剪出来的二值图块ss是它的尺寸。每个模板temp1都用imresize调整到和当前字符完全相同的宽高然后逐像素做差、取绝对值、求和。两个图像越相似这个和越小遍历完62个模板后mark对应的就是得分最高的字符类别。像素差绝对值之和本质上是两幅二值图之间的L1距离也叫曼哈顿距离。对于归一化到相同尺寸的二值字符它能反映两个字符形状的重合程度。这是一种计算量极小的度量方式62次循环、每次做一次矩阵减法和求和在真实场景里基本感觉不到延迟。相比欧式距离L1距离在二值图上对个别像素噪声的敏感性更低相比汉明距离它不需要把图像转换成比特串。对于印刷体这种字符类别有限、形状规范的场景这个度量够用了。需要注意imresize(temp1, ss)的默认插值方式是双三次插值会把二值图像的边缘像素插成中间灰度值。二值图做双三次插值后图像矩阵里会出现0到1之间的浮点数和同样是二值的temp做差距离值会整体偏大但这个偏差对所有模板是系统性的不会改变最终排序结果。如果你追求严格的距离计算可以显式指定最近邻插值imresize(temp1, ss, nearest)。4.3 回调里的实时识别链路鼠标移动事件的完整处理流程是从gca取当前鼠标位置 → 判断是否越界 → 查bll得到连通域标签 → 从bl提取该标签的真实像素坐标 → 裁剪字符图块和二值图块 → 放大到二倍显示在角落的hText坐标轴里 → 循环匹配62个模板 → 在Figure窗口更新显示。整个链路在鼠标移动时反复触发匹配计算量不大演示时流畅度没问题。这段代码如果自己重写我建议把长度接近的单字符比如l和1、左上角坐标一致的数字提前打印出来比对一下模板差异确认自己的模板库里字符渲染是否正常。字体渲染在低分辨率下有些字符的模板会出现笔画粘连或断裂直接影响匹配结果。5. 运行避坑与常见问题从固定阈值到硬编码坐标的六条翻车记录这套案例代码能跑通但它是为特定演示图调试出来的复用到自己的图片上时有几处位置会精确翻车。下面按我实际测试中踩过的顺序逐一列出。5.1 二值化阈值写死 0.7换图就丢失笔画现象换成一张偏暗的扫描图后字符区域大面积消失识别率直线下降部分字符直接匹配到错误类别。原因im2bw(pic, 0.7)对整张图使用固定阈值。偏暗图片的字符灰度可能低于0.7背景灰度可能高于0.7固定阈值无法适应灰度分布的变化。解决把固定阈值换成自适应阈值level graythresh(pic); bw im2bw(pic, level);。graythresh用OSTU方法根据灰度直方图自动计算类间方差最大的分割阈值对光照不均和整体偏暗的图片友好得多。这是我的第一优先修改项。5.2 bwselect 硬编码坐标(368, 483)换图后误删字符现象使用自己的测试图片时某个正常字符被凭空抹掉留下的区域变成一个空洞。原因bwselect(bw2, 368, 483, 4)里的坐标是针对原演示图中一个标点符号的位置写死的。新图片在(368, 483)处大概率是别的物体可能是一个字符的一部分这一步就把那个字符整个删除了。解决这条直接删掉改成基于连通域属性的规则过滤。比如用regionprops提取所有连通域的面积和宽高比把面积小于字符平均值20%的区域置为背景。通用规则是面积阈值、尺寸阈值、位置区域都比硬编码坐标可靠。5.3 getframe 截屏区域参数与窗口尺寸不匹配模板全是黑的现象charpic里全是全黑图块匹配时任何字符的距离都巨大输出结果一直在Z和0之间摆动。原因getframe(hf1, [85, 58, 30, 30])的截屏区域是基于Figure窗口的像素坐标而text对象的位置是基于坐标轴的。不同MATLAB版本、不同figure的Position属性下字符的实际像素落点会变化固定区域可能截到没有字符的空白处。解决把截屏区域调大抓取整个窗口内容getframe(hf1)然后用find找字符有效区域的边界做裁剪让模板的自适应裁剪逻辑处理具体位置。如果窗口位置导致getframe报错先确认figure的Visible属性不是off不可见窗口在某些版本下getframe抓不到图像。5.4 4连通和8连通混用匹配连通域对不上现象鼠标指向某个字符时识别出的是它的一个笔画而不是完整字符比如B被识别成了1。原因bwlabel(bw1, 4)用4连通标记字符但bwlabel(bw4)默认用8连通标记单词。同一个字符在不同标记规则下连通域数量和边界都不同。4连通会断开斜向笔画如果一个字符被拆成多个连通域每个碎片单独参与匹配识别出的结果自然不是完整字符。解决统一连通域定义。在bwlabel(bw1, 4)和bwlabel(bw4)上都显式指定4或者都指定8。对英文字符来说用8连通得到完整字符的概率更高代价是相邻字符可能粘连。5.5 鼠标回调坐标取反识别结果全乱现象鼠标水平移动时高亮的字符跟着垂直方向跳动识别结果完全没有规律。原因p get(gca, currentpoint); x p(3); y p(1);得到的坐标中x对应的是图像的行索引y对应列索引。后面curlabel bll(uint32(x), uint32(y))需要两个参数第一个是行、第二个是列这里把当前的变量命名反过来容易写错。解决把坐标变量的语义统一成行和列比如row p(3); col p(1);后续访问矩阵一律用bll(row, col)。另外uint32转换前先确认坐标值在图像尺寸范围内越界会直接报错。5.6 模板匹配前缩放比例失真大小写字母混淆现象小写l经常被识别成大写I或者数字1大写O和数字0互相乱跳。原因imresize把所有模板强制缩放到当前字符的尺寸当字符原始宽高比和模板差异较大时缩放会引入形状畸变。小写l宽度极窄放大到标准尺寸后l和I的形状几乎重合像素差距离无法区分。解决在匹配度量里加入宽高比先验。计算当前字符的宽高比和模板的宽高比做一次比较距离公式变成tempcost sum(sum(abs(temp - temp1))) lambda * abs(ratio - ratio1)。lambda取0.1到0.3之间用小权重把宽高比作为辅助判据能有效降低形近字的混淆率。6. 从 MATLAB 迁到 PythonOpenCV 版等价实现与效果验证标题既然带上了Python这一章给出OpenCV版的等价实现路径方便你在Python工程里复现同一套流程。整体逻辑完全照搬MATLAB版预处理、连通域分割、模板匹配只是API换了名字。import cv2 import numpy as np # 1. 灰度化 自适应二值化 反转 img cv2.imread(image.jpg, cv2.IMREAD_GRAYSCALE) _, bw cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) bw 255 - bw # 取反字符为255 # 2. 形态学闭运算竖直线结构元素连接断裂笔画 kernel cv2.getStructuringElement(cv2.MORPH_RECT, (1, 4)) bw1 cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel) # 3. 面积过滤去掉小噪声 num_labels, labels, stats, centroids cv2.connectedComponentsWithStats(bw1, 8) for i in range(1, num_labels): if stats[i, cv2.CC_STAT_AREA] 20: bw1[labels i] 0 # 4. 提取单词级轮廓并裁剪 contours, _ cv2.findContours(bw1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for idx, cnt in enumerate(contours): x, y, w, h cv2.boundingRect(cnt) word_img img[y:y h, x:x w] cv2.imwrite(fpic/{idx:03d}.jpg, word_img)cv2.threshold(..., cv2.THRESH_OTSU)对应的是graythreshim2bw的组合一次调用完成自适应阈值计算和二值化这是和MATLAB版最大的差异。形态学闭运算的cv2.MORPH_CLOSE对应imclose结构元素大小按像素比例换算即可。connectedComponentsWithStats一次返回标签矩阵、连通域数量和面积统计比MATLAB的bwlabelregionprops更紧凑。模板匹配的等价写法有两种# 模板归一化到字符尺寸计算像素差绝对值之和 resized cv2.resize(template, (char_w, char_h), interpolationcv2.INTER_NEAREST) dist np.sum(np.abs(char_binary.astype(int) - resized.astype(int))) # 或者用 OpenCV 的 matchTemplate res cv2.matchTemplate(char_binary.astype(np.uint8), template, cv2.TM_SQDIFF_NORMED) min_val, _, _, _ cv2.minMaxLoc(res)第一种写法和MATLAB版完全对等第二种TM_SQDIFF_NORMED归一化平方差匹配是OpenCV标准做法效果更稳定但归一化会弱化字符整体亮暗的差异信息两种都值得跑一遍看结果差异。参数对照速查表处理步骤MATLABPython/OpenCV灰度化rgb2gray(pic)cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)自适应二值化graythreshim2bwcv2.threshold(..., cv2.THRESH_OTSU)形态学闭运算imclose(bw, strel(line, 4, 90))cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel)连通域标记bwlabel(bw, 4)cv2.connectedComponentsWithStats(bw, 4)最小距离匹配sum(sum(abs(temp - temp1)))np.sum(np.abs(a - b))Python版跑通后建议把匹配度输出成热力图对每个字符连通域记录62个模板的距离值观察形近字之间的最小距离间隙。如果最小距离和第二小距离的差值非常小说明模板库或者预处理还不够好这是验证识别稳定性的一个实用手段。我自己做这套迁移时最初直接用cv2.resize默认的双线性插值处理二值图结果匹配结果抖动厉害改成INTER_NEAREST后就稳定了。从那以后我每次做图像识别的演示项目都会强制走一遍把固定参数列成配置、把插值方式显式指定的流程省掉了很多不必要的返工希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
单电感搞定升降压:IP5407移动电源芯片方案深度解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 2:34:17
Jetson AGX Orin 上 llama.cpp CUDA 编译避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 2:34:10
Monero RPC 模糊测试(Fuzzing)框架解析:绕过传输层直测 core_rpc_server 处理器 区块链金融科技 【免费下载链接】monero Monero: the secure, private, untraceable cryptocurrency 项目地址: https://gitcode.com/gh_mirrors/mo/monero 点击查看 免费下载 导读
本文以 tests/fuzz/fuzz_rpc/README.md 为骨架,结合 Monero 仓库中 t… · 2026/9/24 2:34:04
三电平拓扑选型指南:NPC与T型对比及工程实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 3:20:37
无线电是如何发射出去的? 本电路是"载波发生单元",不是"发射机整机"。电磁能量的辐射由天线完成,其条件是电长度 l≈λ/4 与阻抗匹配良好,辐射效率ηARr/(RrRl) 决定能量中电磁波的能量,本文并未涉及~
一、天线为什么能"… · 2026/9/24 3:20:37
数据驱动动画实战:Manim 图表、图论与矢量场可视化完全指南(video-use · manim-video) AI 技能/插件音视频视频处理人工智能 【免费下载链接】video-use Edit videos with coding agents 项目地址: https://gitcode.com/GitHub_Trending/vid/video-use 点击查看 免费下载 本指南以 skills/manim-video/references/graphs-and-data.md 为核心骨架&#… · 2026/9/24 3:20:31
经验模态重构:不均衡故障诊断中的数据扩增方法 在高端装备的状态监测与故障诊断中,设备在绝大多数运行时间内均处于正常状态,实际采集到的故障样本数量远少于健康样本,形成了典型的类别不均衡问题。若直接使用此类样本集训练深度学习模型,模型倾向于偏向多数类样本,… · 2026/9/24 3:20:24
你好,这是我决心转变的开始 我是一位广职大25届的大二学生,来自广东湛江,一位大一过的浑浑噩噩的学生,但是新学期我决定转变,从C语言学习之路开始,从编程入手开启我的专业新能源汽车学习之旅。我的目标的话,打算开始从C语言入手&#… · 2026/9/24 3:20:12
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44