- 博客(182)
- 资源 (45)
- 收藏
- 关注
原创 使用PaddleOCR和OpenCV5实现OCR
本文介绍在OpenCV 5环境下绕过依赖限制,直接使用OpenCVSharp与OnnxRuntime调用PaddleOCRv5模型实现文字检测与识别的方法。通过加载det.onnx(检测)和rec.onnx(识别)模型,结合ppocrv5_dict.txt字典,实现了对证件类图像的高精度文字识别,识别结果包含文本内容及置信度,效果良好,适用于多场景OCR应用。
2026-11-06 14:16:07
170
原创 C#使用opencv和Yolo模型识别车牌号
本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。
2026-11-06 13:59:11
149
原创 ASP.NET前后端用户安全管理技术全解析
本文系统介绍ASP.NET Core中用户管理的核心技术,涵盖注册登录、密码加密(PBKDF2)、JWT身份认证及AccessToken/RefreshToken机制。通过轻量级Web API项目演示,强调安全实践:密码明文不存储,使用加盐哈希;登录后生成带有效期的JWT令牌,结合短时效AccessToken与安全存储的RefreshToken实现无状态身份验证,提升系统安全性与用户体验。
2026-11-05 13:52:21
121
原创 SCADA系统开发关键技术(七)
针对多设备数据采集的复杂性,ScadaSystem采用带发送时间与等待时间的数据包队列,按期待时间重排序,实现采集调度且控制优先;链路通过忙闲状态避免收发混乱,接收后由驱动校验完整性,超时抛错,解决重复接收与多设备共享链路问题。
2026-09-08 10:55:10
135
原创 SCADA系统开发关键技术(六)
针对ScadaSystem通信问题,采用WebSocket为主、API为辅,并设计高效自定义字符串格式。通过优先级处理、分批传送、延迟更新、前端按需注册及适当裁剪,解决大量信息更新与巨量消息传输,确保关键信息及时送达。
2026-09-02 11:10:37
228
原创 SCADA系统开发关键技术(五)
本文介绍SCADA系统中模块化插件(驱动)的设计,其不仅包含代码逻辑,还包含配置定义文件。以Modbus、HJ212等协议为例,说明各驱动需定制配置项。系统加载驱动后,前端根据配置定义生成界面,用户配置生成配置文件,驱动逻辑读取后执行任务。并以TCP客户端链路驱动为例,展示配置定义、界面及代码使用过程。
2026-09-01 15:10:22
169
原创 SCADA系统开发关键技术(四)
SCADA系统的数据核心是键值对仓库,设备属性(如室温、模式、目标温度)以“设备.因子”为键,可读写实现采集与控制。系统架构包括链路传输字节流、协议解析转换键值对、存储方案、可视化展示及数据处理(表达式、事件告警)。
2026-08-31 14:26:26
142
原创 SCADA系统开发关键技术(三)
ScadaSystem采用.NET反射技术实现模块化低耦合架构,主程序仅提供调用流程,通过配置加载DLL实例化模块。系统定义了链路、采集、上传、存储等模块基类,并根据实际应用场景(如请求响应、主动推送、定时存储)细分具体基类,各模块继承后适配开发。
2026-08-31 13:59:39
226
原创 SCADA系统开发关键技术(二)
ScadaSystem采用前后端分离架构:后端ASP.NET Core,前端Vue,满足跨平台与实时可视化。通信以WebSocket为主,辅以RESTful API处理图片等请求;传输采用字符串而非Protobuf,兼顾效率与灵活性。实践表明,.NET跨平台性强,但超低配置设备仍需C++开发,需权衡取舍。
2026-08-31 11:17:59
221
原创 SCADA系统开发关键技术(一)
本系统为一款跨平台工业数据采集与监控平台,支持Windows和Linux。它整合数据采集、反控、存储、上传、事件、报警及组态显示,各部分可灵活定制。采用统一配置方式,兼容不同设备、存储与通信链路。通过插件机制,无需修改主程序即可接入新设备协议,并支持多设备共用链路的高效并发采集。系统可实时显示通信字节流,并提供丰富的组态配置与自定义控件。后续文章将详述技术实现。
2026-08-31 10:30:38
161
原创 指针式仪表读数(机器视觉、OpenCV)
本文提出了一种基于OpenCV的指针式仪表自动读数方法,主要分为两个步骤:仪表定位和读数识别。在仪表定位阶段,采用特征点匹配方法,通过模板图片与待测图像的关键点匹配确定仪表区域,避免了需要大量训练数据的问题。读数识别阶段通过图像处理技术(二值化、直线检测等)提取刻度和指针,利用几何方法计算读数。针对仪表变形导致的误差,提出基于邻近刻度的优化算法,将读数误差从5.925降低到准确的6.4。实验表明,该方法在无需大量训练数据的情况下,能有效实现指针仪表的自动识别与读数。
2026-06-05 06:11:38
308
原创 C#使用YOLO26进行图像识别(目标检测)
纯属个人意见,用python做开发,对象类型不明确和包冲突的问题很烦人,所以还是想用熟悉的C#去做图像识别。其实用C#做也很简单。本文只实现使用模型进行检测,所以需要预先准备好已经训练好的模型。我们以官方训练好的模型yolo26n.pt为例。
2026-05-22 10:33:26
549
原创 OpenCV静态图像分割(抠图)
本文对比了OpenCV提供的多种图像分割方法在苹果图像分割中的效果。测试了漫水填充、分水岭、Grabcuts、Mean-Shift和K-Means等传统算法,发现这些方法要么需要人工干预,要么难以处理阴影等复杂情况。最后展示了深度学习模型U2-Net的优秀表现,它能自动精确分割出苹果主体并处理好阴影,在速度和精度上均优于传统方法。实验表明,对于复杂图像分割任务,深度学习模型比传统算法更具优势。
2026-05-21 13:58:20
282
原创 将PDF每一页导出一张图片(C#,.NET)
本文介绍使用.NET和PDFium库将PDF转换为图片的方法。通过添加PDFium.WindowsV2和PDFiumSharp NuGet包,可以轻松实现PDF到图片的转换。示例代码演示了如何加载PDF文档,遍历每一页,使用白色背景创建位图,渲染页面内容,并保存为PNG格式的图片文件。该方法支持指定输出路径和文件名,最终会生成与PDF页数相同的图片文件。整个过程简单高效,适用于需要将PDF文档转换为图片格式的应用场景。
2026-02-12 15:21:19
169
原创 OpenCV实现二值图细化(骨架提取)
本文介绍了使用OpenCVSharp在C#中实现图像细化(骨架提取)的两种经典算法:Zhang-Suen算法和Guo-Hall算法。通过Mat对象处理二值图像,算法采用迭代方式将线条细化至单像素宽度。程序首先创建标记矩阵,然后根据不同的算法类型(thinningType参数为1或2)进行像素点8邻域分析,通过预定义的查找表决定是否删除当前像素。两种算法均通过交替迭代处理图像,直到不存在可删除像素为止。文章还展示了原始二值图与两种算法处理后的骨架提取效果对比图。
2025-06-20 10:12:52
838
1
原创 OpenCV根据模板图像寻找环境中的目标
该文介绍了一种基于图像匹配的目标定位方法。通过将模板图像转换为灰度图,提取关键点并进行匹配,利用单应性矩阵将模板投影到目标图像中,从而实现目标定位。实验结果表明,该方法能准确匹配目标位置,并附有多组测试图片及匹配效果展示。
2025-06-18 13:08:04
308
原创 从一组线段中得出四边形的算法
摘要:本文提出了一种从OpenCV检测线段中构建透视矩形的算法。该算法通过组合4条线段,检查相邻线段夹角(接近90度)和顶点距离,筛选出可能的四边形候选。具体步骤包括:1)生成线段组合;2)排除夹角不合理的组合;3)排除顶点距离过大的组合;4)计算四条线段交点形成最终四边形顶点。算法通过双重循环遍历所有可能组合,并使用评分机制筛选最优结果。测试表明该方法能有效检测经过透视变换的矩形物体,即使原始线段并不完全相连。代码实现了完整的处理流程,包括线段组合生成、几何约束检查和顶点计算。
2025-06-11 13:31:39
524
原创 使用ONNX模型实现M-LSD算法
摘要:本文介绍了使用C#和ONNX模型实现M-LSD直线检测算法的完整流程。通过OpenCvSharp处理图像,加载512x512的ONNX模型进行推理,提取直线段并绘制检测结果。代码包含图像预处理、模型输入输出处理、直线筛选和后处理等步骤,最终生成带有检测直线的结果图像。该实现可有效检测图像中的显著直线,适合各种计算机视觉应用场景。
2025-06-09 15:32:38
373
原创 OpenCV定位地板上的书
本文介绍了一种通过图像处理技术从复杂背景中识别书本的方法。首先,将彩色图片转换为HSV色彩空间,并提取S(饱和度)分量,以增强书本与背景的对比度。接着进行二值化处理,使书本区域更为明显。随后,应用形态学的开运算和闭运算,消除书本外的小物体并将书本区域连通。最后,生成轮廓并计算其外包矩形,从而准确框出书本位置。该方法有效解决了书本与背景颜色相近时的识别难题,提升了图像处理的精确度和效率。
2025-05-08 16:41:11
411
原创 OpenCV实验室工具的使用
例如下面的代码是图像平滑时使用的OpenCV函数,软件的输入参数可以帮助理解这个函数的使用。当打开一张彩色图时,可以先变成灰度图,然后二值化,再生成轮廓。OpenCV实验室包含了常见的图像处理和分析功能,包括色彩空间转换、滤波与卷积、图像优化、位置变换、图像分析、直方图、目标检测、图像分割、轮廓分析等。OpenCV实验室工具是一个调用OpenCV常见函数,让用户调整参数,快速得到试验结果的工具软件。软件界面中包含三列,第一列是功能菜单,第二列是实现某一功能时需要输入的参数,第三列是图像处理历史。
2025-04-27 14:25:04
479
原创 各种颜色空间的相互转换方法(RGB,HSV,CMYK,灰度)
各个颜色空间原始值的取值范围:CMYK:[0,1]灰度:[0,255]以下给出各个颜色空间转换的伪代码。
2025-04-10 15:44:44
914
原创 WPF中RenderTargetBitmap问题解决
使用RenderTargetBitmap截取某一可视元素时,很多时候会出现元素并不是在图片左上角的问题。解决这一问题的方法是,在要截取元素外,再加一个Border。
2025-01-07 14:52:26
779
原创 在ScadaFramework里配置采集Modbus设备
ScadaFramework是一个实现SCADA功能的软件工具,经过简单配置之后,即可采集设备数据,并进行存储、监控、组态可视化,并可将数据上传至平台。本文将介绍如何在ScadaFramework中配置,以采集Modbus协议的设备。
2024-04-01 09:46:50
1226
原创 DLMS协议开发指引
某些电表一开始未进入DLMS传送模式,需要进行切换。按照IEC62056-21协议模式E的规定,先发送以下内容:典型的串口设置为:波特率300,校验位Even,数据位7。(也可校验位无,数据位8)V:ASCII码的2,代表使用HDLC。Y:ASCII码的2,代表使用HDLC。Z:ASCII码,波特率选择。1:600Bd2:1200Bd3:2400Bd4:4800Bd5:9600Bd6:19200Bd根据以上设置,此时波特率可调整为9600,进入DLMS数据传送。
2023-08-01 09:44:04
8731
2
原创 在组态软件中开发脚本功能的方法
大多数的组态软件都具有脚本功能,脚本可能是VBS、Lua、C#等语言,也可能是厂家自定义的一种语言。通过脚本,组态软件可以实现非常灵活的功能。。外部数据,最重要的是采集到的数据,也可能是用户创建的配置文件。而改变可视化元素,则包括创建、改变位置、改变状态、删除等操作。本文通过一个示例,介绍在组态软件中实现脚本功能的方法。
2023-06-07 11:05:41
4087
原创 ASP.NET Core Web API用户身份验证
ASP.NET Core Web API用户身份验证的方法有很多,本文只介绍JWT方法。JWT实现了服务端无状态,在分布式服务、会话一致性、单点登录等方面凸显优势,不占用服务端资源。简单来说,JWT的验证过程如下所示:(1)通过用户名和密码获取一个Token。(2)访问API时,加上这个Token。Token包含过期时间、用户角色等信息,可以在多种场合灵活使用。
2023-05-07 10:28:01
5937
6
原创 三级封锁协议实例
在网上看了很多三级封锁协议的例子,大部分都是不正确的(例如T1加了X锁后,T2还加S锁)。以下是正确的实例。首先描述一下三级封锁协议。一级封锁:要写数据,写前加X锁,事务结束才释放。二级封锁:在一级封锁的基础上,要读数据,读前加S锁,读后释放。三级封锁:在一级封锁的基础上,要读数据,读前加S锁,事务结束才释放。一级封锁可以解决丢失修改问题,二级封锁可以再解决读脏数据问题,三级封锁可以再解决不可重复读问题。
2023-04-19 11:20:21
1337
原创 在线流程图和思维导图开发技术详解(六)
在HTML中,给定一个文本范围,超长的文本会自动换行。但在SVG中,文本是不会换行的,只会超出后被裁剪。两者在样式的写法上基本相同,唯一需要注意的是HTML中的color需要转成SVG里的fill。扫描整个根div,生成一个节点树,标注每个节点的字体信息,以及选中信息。这也是很困难的,因为有些节点已经合并或分裂,选中的位置信息需要更新。,当我们把文字2的字体大小改为14px之后,它就跟文字1一样了,两段文字没必要用两个span,合在一起即可。本项目显示的文本皆是富文本,也就是在一个框里面,文本有多种样式。
2022-09-20 16:07:32
819
原创 在线流程图和思维导图开发技术详解(五)
最新的操作会被撤销,恢复操作之前的流程图。有一种方式是,保存一张初始图,然后把每次的操作都记录下来。还有一种方法,也是本项目所采用的方法,就是把所有图元的信息保存起来,序列化成一个字符串。当需要撤销时,从Stack里取出字符串,反序列化成图元信息,覆盖当前的图元信息,重新加载和渲染。在上一节中,我们已经提到,在数据保存时,svg数据也保存了下来。当存在图片时,img引用一个svg,svg又引用一张图片,就会显示不出现。项目后端使用.NET开发,在NuGet中引用一个名为Svg的库,即可实现svg的转换。
2022-09-20 16:05:52
797
原创 在线流程图和思维导图开发技术详解(四)
当鼠标按下时,我们需要判断按下的地方是在图元上(实际上还要分是否选中、是否锁定等情况)还是在空白的地方。最后鼠标弹起,完成一次事件。在所有处理器中,鼠标事件处理器是最为复杂的,因为在整个页面中,基本可以使用鼠标完成所有功能。除此之外,鼠标的动作还需要配置辅助键,例如CTRL和SHIFT,在拖动图元变换时会用到这两个键。每个动作之后,只需要对当前动作作出处理(例如改变光标、记录当前位置等),然后改变状态即可。可以看到,对于上面的动作,如果不断使用if/else去处理,这个代码层次将会非常多和冗长,难以管理。
2022-09-20 16:04:06
547
原创 在线流程图和思维导图开发技术详解(三)
例如在不保持比例的情况下,只要拖动位置跟“左”有关的,矩形的x坐标和宽度都要修改,而跟“右”有关的,只要修改宽度即可。在计算之前,整棵树的大小是未知的,树摆放在哪里不好把握。我们一开始计算的时候,会假定根节点的坐标是(0,0),然后计算出每个节点的相对坐标。以内部矩形的左上角为例,L1、L2为组矩形的长和宽,l1、l2是左上角点在两条边上的投影点距离组矩形原点的距离。旋转矩形的描述是rect(x,y,width,height,angle),直接给定一个鼠标点P(x,y),无法判断这个点跟旋转矩形的关系。
2022-09-20 16:02:30
2469
原创 在线流程图和思维导图开发技术详解(二)
图元数据描述是本项目开发的一个难点。图元数据的特点包括:(1)图元种类众多,每种图元有自己独特的属性。(2)某些种类的图元存在公共的属性。例如矩形、图片的位置都是通过一个矩形来描述的。(3)管理器对图元有共同的操作。例如把图片数据转化为可视HTML,鼠标拖动时的平移动作等。这些操作在图元内部的实现并不一致。(4)图元存在一些即使而不需要保存的属性,例如是否选中,这是一个不需要保存,每次打开时都有默认值的属性。在本项目中,图元具有以下的数据定义:}这就是图元的基类。
2022-09-20 15:58:01
1142
1
原创 在线流程图和思维导图开发技术详解(一)
本项目的最终结果是一个同时具有流程图和思维导图功能的Web版制图软件。能够制作出如下图所示的图:项目具有以下的一些功能:类似软件的常规功能:元件库、分组管理、层次管理、锁定管理、图形样式、文字样式、连接线样式等。用户可添加自定义图片,包括png、jpg、gif、svg等格式,以及一种项目自定义的格式。流程图和思维导图可同时在一个页面中完成编辑。思维导图可变换左侧、右侧、底部、双侧等模式。整图转换为png、svg、jpg等格式。文本支持内部多种样式。
2022-09-20 15:55:52
3192
原创 判断点是否在贝塞尔曲线(Bézier curve)上的方法
但贝塞尔曲线(Bézier curve)并不是y关于x的方程,而是(x,y)关于一个参数t的方程。利用同样的方法,我们也可以使用y求出若干个t。然后比较用x求出的t和用y求出的t,如果都在[0,1]范围内,而且是接近的,那我们可以认为点P就在贝塞尔曲线上。假设贝塞尔曲线经过点P0(x0,y0)、P1(x1,y1)、P2(x2,y2)、P3(x3,y3),现在要判断点P(x,y)是否在曲线上。现在,如果我们需要判断一个点P(x,y)是否在贝塞尔曲线上,就要找到一个t,代入方程中,求出(x,y)跟P一致。...
2022-08-09 15:16:48
2118
原创 contenteditable格式化html文本转svg
把文字包住,字体对应face属性,字体颜色对应color属性,字体大小对应size属性。我们知道,在一个div里加上contenteditable="true"之后,它就变成了一个可编辑的框,而且是能满足基本需求的富文本编辑框。算法的思想是一个字一个字的选取,获取选择部分的位置,当选择部分的y值比第一个字的y值大(而且超过了某个阈值),则从这个字符开始换行了。上文中已经说过,HTML里的文本是会自动换行的,但SVG里的文本不会。如果是BR结点,结束上一行,添加新的一行,只有BR结点这个元素,再新建一行。..
2022-07-28 17:32:40
1556
原创 svg文本<text>详解
在SVG中,text的基本用法如下:其效果如下图所示: 注意上图中红点的位置坐标即为(20,20)。可以看到,默认情况下,text使用以下默认属性:可以对文字的颜色、字体、字体大小、是否粗体、是否有下划线、是否斜体等进行设置。需要注意的是,样式基本与html相同,除了color,svg中使用fill进行颜色设置。其效果如下图所示:水平对齐的方式有三种,分别是左对齐、居中对齐、右对齐。其设置的属性是text-anchor,对应的值分别是start、middle、end。默认值是start。居中对齐...
2022-07-14 09:40:09
16119
原创 判断空间四点(多点)共面的计算方法
如果三点非共线,那么三点必然共面。如果现在有第四点,如何判断这个点跟前三点共面呢?如果有超过四个点,实际上也是从第四个点开始,一个个判断是否跟前三个点共面。可以使用向量和行列式的方法去计算。我们先来看行列式的几何意义。对于二阶行列式,它的行向量组成了一个平行四边形,而其值就是平行四边形的面积。类似的,对于三阶行列式,它的行向量组成了一个平行六面体,而其值就是这个平行六面体的体积。四个点刚好能形成三个向量,而如果四点不共面,那么这个平行六面体的体积就不会是0。反过来说,如果平行六面体的体积是0,也就是如果行列
2022-06-21 16:22:56
9306
1
原创 已知两点求直线一般方程,已知三点求平面一般方程
我们知道,直线的一般方程是,而平面的一般方程是。对于直线方程,有ABC三个未知数。但我们知道,已知两个点只能求出两个未知数。对于平面方程是同理的。事实上,一般方程里的参数是有冗余的。例如,和这两个方程事实上描述的是同一条直线。那我们可不可以直接把一个系数约掉呢,例如变成。很遗憾这行不通,因为A有可能是0。任何一个参数都有可能是0,无法约掉。这样的话,在求解的时候,我们就需要分类讨论。先判断某一个参数是否为0,如果是0,则可以去掉该参数。少了一个参数,点数和未知数的数量相同,就可以求解了。如果没有参数是0,那
2022-06-08 06:51:01
2054
1
原创 三维空间圆弧描述方法
在以下的描述方法中,我们用到:圆心:(x0,y0,z0),需3个数值。弧起点:(x1,y1,z1),需3个数值。弧终点:(x2,y2,z2),需3个数值。弧方向:(xd,yd,zd),长度不重要,只需表达出方向,所以需要2个数值。弧度:θ,需1个数值。描述方法:1、圆心+弧起点+弧终点+弧方向需要11个数值。可以描述所有圆弧。2、圆心+弧起点+弧方向+弧度需要9个数值。可以描述所有圆弧。3、弧起点+弧终点+弧方向需要8个数值。不能描述圆周。描述圆周时,弧起点和弧终点重合。4、弧起点+弧终点+弧上任一点需要9
2022-06-07 13:40:08
1838
WPF MVVM完整示例(登录窗口)
2019-03-29
OpenCvSharp测试程序DEMO
2020-05-06
C#实现4种经典迷宫生成算法和迷宫寻路算法
2018-12-05
M-LSD直线检测算法C#实现(包含ONNX模型)
2025-06-09
OpenCV图像处理与分析实验室工具
2025-04-27
方程求解源代码,一元二次方程,一元三次方程,一元四次方程
2022-08-09
格式化html文本转svg文本源代码
2022-07-28
C#实现的树形图控件源码
2022-06-02
虚拟Modbus协议设备软件
2022-06-02
BP神经网络基本架构实现(源代码)
2022-06-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅