Halcon3D表面平面度检测-平面差值法
//倾斜平面矫正
https://blog.csdn.net/m0_51559565/article/details/137146179
//平面度和平面缺陷检测,平面矫正法
https://blog.csdn.net/m0_51559565/article/details/137163729
前言
通常我们对表面平面度进行检测时,通常使用2种方式。1:通过大卷积核的高斯滤波进行拟合平面,然后求取拟合平面与3D模型间的点间的距离。2:通过平面矫正,将被测试平面矫正到水平面后,对平面以上和平面以下的点云进行筛选。(关于平面矫正,可以点击文章开头链接查看)。
本文主要讨论通过大卷积核的高斯滤波进行平面拟合,求取拟合平面与3D模型的距离。
1.halcon程序
dev_get_window (WindowHandle)
*读取3通道彩色融合图
read_image (Image, 'D:/1NewWork/Halcon3D/XYZ彩色融合图.tiff')
*拆分3个通道
decompose3 (Image, x, y, z)
*将3个通道图像转换为3D模型
xyz_to_object_model_3d (x,y, z, ObjectModel3D)
*显示动态3D模型
threshold (z, Regions, 107.77, 200)
*对二值化图像进行腐蚀,剔除产品边缘,通常使用5。
*当前模拟表面出现的凹陷情况
erosion_circle (Regions, RegionErosion, 50)
reduce_domain (z, RegionErosion, ImageReduced)
*设置等平面前,对平面进行大卷积核的高斯滤波,防止噪点的存在印象平面精度
gauss_filter (ImageReduced, ImageGauss, 7)
*测量基准平面
xyz_to_object_model_3d (x,y, ImageGauss, ObjectModel3D)
*创建测量拟合平面
fit_primitives_object_model_3d(ObjectModel3D, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3D9)
*获取到平面参数,可用于验算
get_object_model_3d_params(ObjectModel3D9, 'primitive_parameter', plane)*visualize_object_model_3d (WindowHandle, ObjectModel3D9, [], [], [], [], [], [], [], PoseOut)
*对被检测面进行高斯滤波,用于去除噪点。
*如果要求测量精度较大时,推荐高斯卷积核设置为1,或者进行滤波,防止缺陷被覆盖
gauss_filter (ImageReduced, ImageGauss1, 3)
*被测量面
xyz_to_object_model_3d (x,y, ImageGauss1, ObjectModel3D1)
*计算2个测量面的所有点云距离
distance_object_model_3d (ObjectModel3D1, ObjectModel3D9, [], 0, [],[])
*获取结果
get_object_model_3d_params (ObjectModel3D1, '&distance', Z)*visualize_object_model_3d (WindowHandle, ObjectModel3D1, [], [], [], [], [], [], [], PoseOut)tuple_max (Z, Max)
tuple_mean (Z, Mean)
tuple_min (Z, Min)tuple_abs (Max, AbsMax)
tuple_abs (Min, AbsMin)
tuple_max2 (AbsMax, AbsMin, Max2)*结果验证
2.halcon程序解析
2.1选取图像区域
dev_get_window (WindowHandle)
*读取3通道彩色融合图
read_image (Image, 'D:/1NewWork/Halcon3D/XYZ彩色融合图.tiff')
*拆分3个通道
decompose3 (Image, x, y, z)
*将3个通道图像转换为3D模型
xyz_to_object_model_3d (x,y, z, ObjectModel3D)
*显示动态3D模型
threshold (z, Regions, 107.77, 200)
*对二值化图像进行腐蚀,剔除产品边缘,通常使用5。
*当前模拟表面出现的凹陷情况
erosion_circle (Regions, RegionErosion, 50)
初始状态下,我们先进行预处理,提取到我们需要被检测的区域。在上述程序中,我为了模拟实际情况下表面存在缺陷的情况,将下层托盘也归为同一个检测区域。
2.2生成测量基准平面
*设置等平面前,对平面进行大卷积核的高斯滤波,防止噪点的存在印象平面精度
gauss_filter (ImageReduced, ImageGauss, 7)
*测量基准平面
xyz_to_object_model_3d (x,y, ImageGauss, ObjectModel3D)
*创建测量拟合平面
fit_primitives_object_model_3d(ObjectModel3D, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3D9)
*获取到平面参数,可用于验算
get_object_model_3d_params(ObjectModel3D9, 'primitive_parameter', plane)
实际3D相机采集的时候可能会因为各种原因造成有噪点的情况,所以在拟合测量平面时,可以先进行大卷积核的高斯滤波剔除噪点,可以有效提高测量平面精度。
当然在拟合平面时,缺陷可能会对略微对平面有些许影响,通常都是忽略不计的,halcon拟合平面选取最小二乘法即可有效减少缺陷对拟合平面结果的影响。
实际测试情况中,文中缺陷10cm,实际可以测得9.9cm。误差忽略不计。
2.3计算点云距离
*对被检测面进行高斯滤波,用于去除噪点。
*如果要求测量精度较大时,推荐高斯卷积核设置为1,或者进行滤波,防止缺陷被覆盖
gauss_filter (ImageReduced, ImageGauss1, 3)
*被测量面
xyz_to_object_model_3d (x,y, ImageGauss1, ObjectModel3D1)
*计算2个测量面的所有点云距离
distance_object_model_3d (ObjectModel3D1, ObjectModel3D9, [], 0, [],[])
*获取结果
get_object_model_3d_params (ObjectModel3D1, '&distance', Z)
在计算被检测的平面时,推荐使用1或者3卷积核的高斯滤波进行预处理。可以有效的在实际环境中减少误判率,主要仍然是来自相机采集的噪点的影响。
2.4统计和判断数据
tuple_max (Z, Max)
tuple_mean (Z, Mean)
tuple_min (Z, Min)tuple_abs (Max, AbsMax)
tuple_abs (Min, AbsMin)
tuple_max2 (AbsMax, AbsMin, Max2)
计算最大误差的点云。
总结
此方法,适用于对3D相机采集效果良好,并且无需标记,只输出NG情况的方案。由于在计算2平面点云距离时,他得到的是一个距离的数组,当我们在去对数组进行处理时,会及其的耗费时间。
所以一般推荐矫正平面的形式。
查看如何平面矫正可以访问,文章开头链接中的我的另一个博客
相关文章:

Halcon3D表面平面度检测-平面差值法
//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179 //平面度和平面缺陷检测,平面矫正法 https://blog.csdn.net/m0_51559565/article/details/137163729前言 通常我们对表面平面度进行检测时,通常使用2种方式。1:…...

golang 在多线程中避免 CPU 指令重排
发布日期:2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程,是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候,为了提高…...
自动化更新包文件--shell脚本
自动化更新包文件--shell脚本 背景手动更包自动化更包 背景 作为一名实施工程师,当然也协助做些测试的工作,当产品功能开发后,研发会将本次迭代涉及的前后端包文件提供过来。有时会因为一些原因研发没法现场开发,那就需要我们配合…...

Vue element-plus 导航栏 [el-menu]
导航栏 [el-menu] Menu 菜单 | Element Plus el-menu有很多属性和子标签,为网站提供导航功能的菜单。 常用标签: 它里面有两个子标签。el-menu-item,它其实就是el-menu每一个里面的item,item就是真实匹配到路由的每个栏目&#…...

数据结构——数组
数组定义: 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。 性…...
python asyncio websockets server
python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…...

视频素材免费网站有哪些?8个视频素材库网站下载推荐
在视频创作领域,选择正确的高质量无水印素材网站能够极大地丰富您的作品,让每一帧都鲜活起来。下面,我们继续为您介绍更多优质的视频素材网站,每一个都是您创作旅程中的宝贵资源。 1. 蛙学府(中国) 集合了…...

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异
引言 随着互联网的快速发展,信息的获取变得比以往任何时候都更加便捷。在数字化时代,人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息,然而,这种机械式的检索方式有时候并不…...
xargs后调用bash自定义函数(写该函数文本到脚本, 并引导PATH)
xargs后调用bash自定义函数 需要3步骤,如下 function to_markdown_href_func() { fp$1 #echo $fpecho -e "\n[${fp}](${PREFIX}/${fp})" }BIN/tmp/bin/ F$BIN/to_markdown_href_func.sh mkdir -p $BIN 获得函数to_markdown_href_func的文本 ,写文本到 /tmp/bin/to_ma…...
学术论文写作新利器:ChatGPT技巧详解
ChatGPT无限次数:点击直达 学术论文写作新利器:ChatGPT技巧详解 在如今信息爆炸的时代,学术论文写作变得愈发重要且具有挑战性。随着人工智能技术的不断发展,ChatGPT作为一种强大的写作辅助工具,为学术论文创作者提供了全新的可能…...
Spring整合JDBC
1、引入依赖 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><depen…...
详解Qt中的布局管理器
Qt中的布局管理是用于组织用户界面中控件(如按钮、文本框、标签等)位置和尺寸调整的一种机制。说白了就是创建了一种规则,随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器,每种都有其特定用途和特点。以下是对Qt…...

MyBatis 参数重复打印的bug
现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…...

ES6学习之路:迭代器Iterator和生成器Generator
迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…...

如何使用 DynamiCrafter Interp Loop 无缝连接两张照片
DynamiCrafter Interp Loop 是一个基于 AI 的工具,可以用来无缝连接两张照片。它使用深度学习技术来生成中间帧,从而使两张照片之间的过渡更加自然流畅。 使用步骤 访问 DynamiCrafter Interp Loop 网站:https://huggingface.co/spaces/Dou…...

今天起,Windows可以一键召唤GPT-4了
ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了? 把 Copilot 按钮放在 Window…...

使用Kaggle API快速下载Kaggle数据集
前言 在使用Kaggle网站下载数据集时,直接在网页上点击下载可能会很慢,甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包: pip install…...
java 通过 microsoft graph 调用outlook(二)
这次提供一些基础调用方式API PS: getMailFolders 接口返回的属性中,包含了未读邮件数量unreadItemCount 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava<…...

【机器学习】代价函数
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...

[leetcode] 100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&a…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...