2025电赛基于机器视觉的PCB表面缺陷检测系统_使用YOLOv5模型实现PCB表面六大缺陷类型和位置的检测_包括缺洞鼠咬开路短路毛刺余铜等缺陷_支持图片摄像头和视频检测_采用PyQt5库封装.zip 随着电子制造行业的迅猛发展,对印刷电路板(PCB)的质量检测提出了更高的要求。为了提高检测效率和准确率,基于机器视觉的PCB表面缺陷检测系统应运而生。本系统采用YOLOv5模型作为核心算法,旨在实现对PCB表面六大缺陷类型(缺洞、鼠咬、开路、短路、毛刺、余铜)的自动检测,并能够准确定位这些缺陷的位置。 YOLOv5模型,作为一种先进的目标检测算法,以其速度快和精度高的特点,在PCB表面缺陷检测领域表现出色。系统能够支持对单独图片、摄像头实时视频流以及视频文件中的PCB缺陷进行检测。通过高效的算法处理,系统能够在极短的时间内完成对图像数据的分析,实现快速检测。 为了提高系统的可用性和交互性,本项目采用PyQt5库进行用户界面的封装。PyQt5是一个创建跨平台应用程序的工具包,它允许开发人员使用Python编程语言快速开发具有图形用户界面的应用程序。通过PyQt5封装的应用程序,用户可以更加便捷地操作检测系统,查看检测结果,并进行必要的参数调整。 项目中包含了丰富的附赠资源,如附赠资源.docx,提供了详细的系统说明文档和操作指南,以供用户参考。说明文件.txt则为用户提供了一个简明的安装和运行指南,使用户可以快速上手操作。此外,源代码文件夹object-detection-pcb-main包含了系统的核心代码,用户可以在此基础上进行二次开发和定制,以满足不同场景下的特定需求。 整个系统的设计和实现,不仅体现了技术的先进性,也展示了将复杂算法简化应用于实际问题中的能力。随着未来技术的不断进步,基于机器视觉的PCB表面缺陷检测系统将会在智能化、自动化方面展现出更加广阔的前景。
2026-04-21 10:08:05 28.37MB python
1
一款基于 poi-tl 的高性能、内存优化的 Word模板生成工具类,通过流式处理、资源及时释放等技术,有效解决传统方式的内存溢出问题。支持文本、图片、表格、列表、条件与循环渲染等多种元素动态生成,适用于报告、合同、报表等多种文档生成场景 这款Word模板生成工具类以流式处理为核心,实现了高效和内存友好的文档生成,有效地解决了传统Word文档处理中常见的内存溢出问题。工具类借助了poi-tl框架,提供了一个高性能的开发环境,使得开发者能够通过编程方式动态地生成Word文档。其支持的特性十分全面,包括但不限于文本、图像、表格、列表以及更为复杂的条件和循环渲染技术。 在文本处理方面,开发者可以灵活地定义文档中的文本格式和内容布局,实现包括但不限于字体、大小、颜色、段落样式等多种文本属性的设置。对于图像元素,工具类允许在Word文档中插入各种格式的图片,比如JPEG、PNG等,并支持图片的缩放、裁剪等操作,以满足不同的视觉展示需求。 表格的生成与处理是此工具类的一大亮点。开发者可以动态地创建表格,并在表格中填充数据。表格的行列可以根据需要进行调整,使得文档内容的组织更为清晰和有序。此外,工具类还支持条件渲染和循环渲染技术,这为处理文档中的条件逻辑和重复元素提供了极大的便利。比如,在生成合同模板时,可以根据不同的合同条款动态生成相应的合同文本。 在文档生成的应用场景方面,此工具类尤为适用于报告、合同、报表等需要高效输出大量文档的场合。通过代码的方式生成文档,不仅可以极大地提高效率,还能够保持文档格式的一致性和准确性。它适合于各种需要进行自动化文档处理的企业级应用,比如财务报表的自动生成、客户合同的批量生成、产品手册的定制化输出等。 在使用这款工具类时,开发者将享受到流式处理带来的性能优势。流式处理意味着文档的生成是边创建边输出的过程,不同于传统的生成方式在内存中一次性处理整个文档,从而有效降低了内存的使用。这种处理方式在处理大型文档时尤为重要,它可以显著减少内存占用,并加快文档的生成速度。资源的及时释放机制进一步保证了内存使用的优化,避免了因资源未及时释放导致的内存泄漏问题。 这款Word模板生成工具类提供了强大的功能和灵活性,能够满足不同场景下的文档生成需求,同时也注重性能优化和内存管理,是文档自动化处理的有力工具。
2026-04-17 10:01:05 15KB wrod
1
功能特点 标定功能: 圆形标定:使用已知半径的圆形物体进行标定 矩形标定:使用已知尺寸的矩形物体进行标定 自定义标定:支持自定义物体标定(开发中) 测量功能: 圆形测量:测量圆形零件的半径 矩形测量:测量矩形零件的长度和宽度 支持与期望尺寸比较,计算误差 支持保存测量结果 输入方式: 图片输入:上传图片进行标定或测量 摄像头输入:使用摄像头实时捕获图像进行标定或测量 安装说明 确保已安装Python 3.7或更高版本 克隆或下载本项目到本地 安装依赖包: pip install -r requirements.txt 使用方法 运行应用: streamlit run app.py 在浏览器中打开显示的URL(通常是http://localhost:8501) 使用流程: 用户登录: 首次使用需要注册账号 使用已有账号登录系统 根据用户权限访问相应功能 首先进行标定: 图片模式:选择"标定"模式,上传标定图片,输入实际尺寸,点击"开始标定" 摄像头模式:选择"标定"模式,点击"打开摄像头",调整物体位置,输入实际尺寸,点击"开始标定" 然后进行测量: 图片模式:选择"测量"模式,上传测量图片,输入期望尺寸,点击"开始测量" 摄像头模式:选择"测量"模式,点击"打开摄像头",调整物体位置,输入期望尺寸,点击"开始测量" 查看测量结果,可选择保存结果 文件结构 app.py:主应用程序 auth.py:用户认证和权限管理模块 home_page.py:首页界面和导航模块 image_processing.py:图像处理模块 camera_utils.py:摄像头操作和图像采集 text_utils.py:文本处理和格式化 requirements.txt:依赖包列表 calibration/:存储标定数据 results/:存储测量结果 users/:用户数据和配置文件存储
1
办公自动化_Python数据处理_Excel表格数据批量填充Word文档模板_基于python-docx和pandas的合同报告自动生成工具_支持图片插入和动态文件名_提供图形用户
2025-12-12 09:43:29 80.14MB
1
参加比赛的作品,开发周期一个月,使用了 Wafer2 框架,后台采用腾讯云提供的 Node.js SDK 接入对象存储 API ,前端核心代码实现了类似于图片编辑器的功能,支持图片和文字的移动、旋转、缩放、生成预览图以及编辑状态的保存,动画部分采用 CSS 动画实现小程序中的模态输入框部分使用了自己封装的 InputBox 组件代码已移除 AppId 等敏感信息,可自行添加自己的 AppId 和 AppSecret 以配置后台环境,实现登录测试,详细添加方法见下文「使用方法」,若本地运行可通过修改 app.json 文件中 page 字段的顺序来查看不同页面微信小程序定制需求请联系作者微信:aweawds (注明来意)效果展示      使用方法首先点击右上角 Star ʕ •ᴥ•ʔ获取Demo代码执行 git clone https://github.com/goolhanrry/Weapp-Demo-LemonJournal.git或 点击此处 下载最新版本的代码解压后在微信开发者工具中打开 Weapp-Demo-LemonJournal 文件夹即可如需进行登录测试,还要执行以下步骤准备好自己的 AppId 和 AppSecret(可在微信公众平台注册后获取)在 project.config.json 的 appid 字段中填入 AppId在 /client/utils/util.js 中相应位置填入 AppId 和 AppSecret在微信开发者工具中重新导入整个项目,上传后台代码后编译运行即可核心代码组件的移动、旋转和缩放主要思路是把  标签(对应图片)和  标签(对应文字)封装在同一个自定义组件  中,通过对外暴露的 text 变量是否为空来进行条件渲染,然后绑定 onTouchStart() 、onTouchEnd() 和 onTouchMove() 三个事件来对整个组件的位置、角度、大小、层级以及 “旋转” 和 “移除” 两个按钮的行为进行操作onTouchStart: function (e) {     // 若未选中则直接返回     if (!this.data.selected) {         return     }     switch (e.target.id) {         case 'sticker': {             this.touch_target = e.target.id             this.start_x = e.touches[0].clientX * 2             this.start_y = e.touches[0].clientY * 2             break         }         case 'handle': {             // 隐藏移除按钮             this.setData({                 hideRemove: true             })             this.touch_target = e.target.id             this.start_x = e.touches[0].clientX * 2             this.start_y = e.touches[0].clientY * 2             this.sticker_center_x = this.data.stickerCenterX;             this.sticker_center_y = this.data.stickerCenterY;             this.remove_center_x = this.data.removeCenterX;             this.remove_center_y = this.data.removeCenterY;             this.handle_center_x = this.data.handleCenterX;             this.handle_center_y = this.data.handleCenterY;             this.scale = this.data.scale;             this.rotate = this.data.rotate;             break         }     } }, onTouchEnd: function (e) {     this.active()     this.touch_target = ''     // 显示移除按钮     this.setData({         removeCenterX: 2 * this.data.stickerCenterX - this.data.handleCenterX,         removeCenterY: 2 * this.data.stickerCenterY - this.data.handleCenterY,         hideRemove: false     })     // 若点击移除按钮则触发移除事件,否则触发刷新数据事件     if (e.target.id === 'remove') {         this.triggerEvent('removeSticker', this.data.sticker_id)     } else {         this.triggerEvent('refreshData', this.data)     } }, onTouchMove: function (e) {     // 若无选中目标则返回     if (!this.touch_target) {         return     }     var current_x = e.touches[0].clientX * 2     var current_y = e.touches[0].clientY * 2     var diff_x = current_x - this.start_x     var diff_y = current_y - this.start_y     switch (e.target.id) {         case 'sticker': {             // 拖动组件则所有控件同时移动             this.setData({                 stickerCenterX: this.data.stickerCenterX   diff_x,                 stickerCenterY: this.data.stickerCenterY   diff_y,                 removeCenterX: this.data.removeCenterX   diff_x,                 removeCenterY: this.data.removeCenterY   diff_y,                 handleCenterX: this.data.handleCenterX   diff_x,                 handleCenterY: this.data.handleCenterY   diff_y             })             break         }         case 'handle': {             // 拖动操作按钮则原地旋转缩放             this.setData({                 handleCenterX: this.data.handleCenterX   diff_x,                 handleCenterY: this.data.handleCenterY   diff_y             })             var diff_x_before = this.handle_center_x - this.sticker_center_x;             var diff_y_before = this.handle_center_y - this.sticker_center_y;             var diff_x_after = this.data.handleCenterX - this.sticker_center_x;             var diff_y_after = this.data.handleCenterY - this.sticker_center_y;             var distance_before = Math.sqrt(diff_x_before * diff_x_before   diff_y_before * diff_y_before);             var distance_after = Math.sqrt(diff_x_after * diff_x_after   diff_y_after * diff_y_after);             var angle_before = Math.atan2(diff_y_before, diff_x_before) / Math.PI * 180;             var angle_after = Math.atan2(diff_y_after, diff_x_after) / Math.PI * 180;             this.setData({                 scale: distance_after / distance_before * this.scale,                 rotate: angle_after - angle_before   this.rotate             })             break         }     }     this.start_x = current_x;     this.start_y = current_y; }编辑状态的保存一篇手帐包含的组件类型包括 sticker(软件自带的贴纸)、image(用户上传的图片)和 text(自定义文字)三种,全部保存在一个如下格式的 json 对象中,每个独立组件都包含了一个不重复的 id 以及相关的信息,保存时由客户端生成该对象并编码成 json 字符串存储在数据库,恢复编辑状态时通过解析 json 字符串获得对象,再由编辑页面渲染{     "backgroundId": "5",                                        背景图id     "assemblies": [         {             "id": "jhjg",                                       组件id             "component_type": "image",                          组件类型(自定义图片)             "image_url": "https://example.com/jhjg.png",        图片地址             "stickerCenterX": 269,                              中心横坐标             "stickerCenterY": 664,                              中心纵坐标             "scale": 1.7123667831396403,                        缩放比例             "rotate": -3.0127875041833434,                      旋转角度             "wh_scale": 1,                                      图片宽高比             "z_index": 19                                       组件层级         },         {             "id": "gs47",             "component_type": "text",                           组件类型(文字)             "text": "test",                                     文字内容             "stickerCenterX": 479,             "stickerCenterY": 546,             "scale": 1.808535318980528,             "rotate": 29.11614626607893,             "z_index": 10         },         {             "id": "chjn",             "component_type": "sticker",                        组件类型(贴纸)             "sticker_type": "food",                             贴纸类型             "sticker_id": "1",                                  贴纸id             "image_url": "https://example.com/weapp/stickers/food/1.png",             "stickerCenterX": 277,             "stickerCenterY": 260,             "scale": 1.3984276885130673,             "rotate": -16.620756913892055,             "z_index": 5         }     ] }
2025-08-09 09:39:27 6.81MB 开源项目
1
通过poi3.8 解析文件夹内的doc,并以webview加载转换后的html,点击按钮保存整个webview内容 以png图片方式保存。 doc如果有table 排版有瑕疵。 支持doc有图片。
2024-10-10 14:28:29 8.4MB Android webview poi
1
Android多媒体选择器支持图片和视频。.zip,android file picker 文件选择器
2023-03-07 11:54:31 255KB 开源项目
1
高仿微信图片选择器(支持单图,多图,视频选择,支持图片自由缩放,视频播放等功能)
2023-03-07 11:50:57 1.47MB Android开发-图片加载展示
1
laravel博客 Vien Blog-一种基于Laravel5.8开发的,支持markdown编辑以及图片拖拽上传的博客系统,SEO友好 博主网站 宝塔教程 感谢大鸟博客写了宝塔建造本博客的教程,详情戳 项目Github地址 Github: ,欢迎星级。 友链 使用构建应用可添加友链至点击查看已添加的友链 更新 20200520添加sitemap自动生成功能更新后需要执行composer update安装依赖,项目目录下执行php artisan sitemap:generate立即生成 20200520功能添加(图片自动水印),添加粉色主题更新后需要执行php artisan migra
2022-11-21 21:53:47 11.85MB blog markdown laravel markdown-blog
1
官网的html2pdf不支持中文,根据底层tcpdf实现中文的支持。 这个是最简版的示例,html2pdf完整的示例代码,可以参见 https://github.com/cychai/html2pdf
2022-06-17 10:26:25 16.2MB html2pdf php 中文
1