Halcon3D倾斜平面矫正至水平面

前言

在相当多的3d检测中,由于各种因素的干扰,我们所检测的平面通常并不是一个水平面,或者被检测的面不是水平面的情况。尤其是在倾斜面的缺陷检测和平面度检测中,使用被测面与拟合基准面进行计算很难做到准确的定位到缺陷的情况,由于被测量的平面属于倾斜状态,所以,也不能直接使用点云z轴筛选的形式去完成。
所以我们需要将被检测的平面进行平面矫正,矫正为近似水平面状态,得以实现对测量的精准度。

1.halcon程序

dev_get_window (WindowHandle)
*读取单通道深度图
read_image (Image, 'D:/1NewWork/Halcon3D/1.tif')
*获取图像的高宽
get_image_size (Image, Width, Height)
*生成对应图像的X与Y灰度面
gen_image_surface_first_order (X, 'real', 0,1, 0, 0, 0, Width, Height)
gen_image_surface_first_order (Y, 'real', 1, 0, 0, 0, 0, Width, Height)*未矫正的图像
gen_rectangle2 (ROI_0, 36.108, 31.8289, rad(-75.4188), 37.7147, 8.15956)
reduce_domain (Image, ROI_0, ImageReduced2)
xyz_to_object_model_3d (X,Y, ImageReduced2, 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模型
*visualize_object_model_3d (WindowHandle,ObjectModel3D , [], [], [],[], [], [], [], PoseOut)*矫正的图像
*矫正区域的ROI
gen_rectangle1 (ROI_0, 25.0932, 22.1184, 33.7322, 33.7711)
reduce_domain (Image, ROI_0, ImageReduced)
*获取灰阶平面
moments_gray_plane (ROI_0, ImageReduced, MRow, MCol, Alpha, Beta, Mean)
*创建平行于灰阶平面的面
gen_image_surface_first_order (ImageSurface1, 'real', Alpha, Beta, Mean, MRow, MCol, Width, Height)
*2个面相减得到矫正后的面
sub_image (Image, ImageSurface1, ImageSub, 1, 0)
dev_display (Image)
dev_display (ImageSub)gen_rectangle2 (ROI_0, 35.892, 30.1026, rad(-75.805), 35.199, 6.05358)
reduce_domain (ImageSub, ROI_0, ImageReduced1)
xyz_to_object_model_3d (X,Y, ImageReduced1, ObjectModel3D1)
fit_primitives_object_model_3d(ObjectModel3D1, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3D9)
*获取到平面参数,显示平面方程
get_object_model_3d_params(ObjectModel3D9, 'primitive_parameter', plane1)

在这里插入图片描述
根据平面夹角求解公式,求解得初始平面夹角141度,矫正后平面夹角0.33度
在这里插入图片描述

2.halcon程序解析

2.1初始图像夹角

在这里插入图片描述
在文章中,我选取一个在实际中非常常见的过度倾斜面,然后对倾斜面进行平面矫正。


*未矫正的图像
gen_rectangle2 (ROI_0, 36.108, 31.8289, rad(-75.4188), 37.7147, 8.15956)
reduce_domain (Image, ROI_0, ImageReduced2)
xyz_to_object_model_3d (X,Y, ImageReduced2, 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)

我们先对倾斜平面进行裁切提取,并拟合出倾斜平面,用于比较矫正后的平面方程,求解初始平面夹角
在这里插入图片描述

2.2计算矫正平面

*矫正的图像
*矫正区域的ROI,选择倾斜平面所在的位置
gen_rectangle1 (ROI_0, 25.0932, 22.1184, 33.7322, 33.7711)
reduce_domain (Image, ROI_0, ImageReduced)
*获取灰阶平面,计算灰阶平面位姿
moments_gray_plane (ROI_0, ImageReduced, MRow, MCol, Alpha, Beta, Mean)
*创建平行于灰阶平面的面
gen_image_surface_first_order (ImageSurface1, 'real', Alpha, Beta, Mean, MRow, MCol, Width, Height)
*2个面相减得到矫正后的面,即可将倾斜平面矫正到水平面
sub_image (Image, ImageSurface1, ImageSub, 1, 0)

2.3生成矫正后的3d模型

*裁剪原倾斜面位置,用于验证矫正情况
gen_rectangle2 (ROI_0, 35.892, 30.1026, rad(-75.805), 35.199, 6.05358)
reduce_domain (ImageSub, ROI_0, ImageReduced1)
xyz_to_object_model_3d (X,Y, ImageReduced1, ObjectModel3D1)
fit_primitives_object_model_3d(ObjectModel3D1, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3D9)
*获取到平面参数,显示平面方程
get_object_model_3d_params(ObjectModel3D9, 'primitive_parameter', plane1)

最终输出平面方程参数plane1作为验算

总结

当平面进行矫正后,即可对新的3d模型进行处理和检测。由于矫正平面受到倾斜平面上的噪点影响,可以预先进行高斯滤波,可以有效的提高矫正精度。

*获取灰阶平面,计算灰阶平面位姿
moments_gray_plane (ROI_0, ImageReduced, MRow, MCol, Alpha, Beta, Mean)
*创建平行于灰阶平面的面
gen_image_surface_first_order (ImageSurface1, 'real', Alpha, Beta, Mean, MRow, MCol, Width, Height)

如上2行所述,获取到矫正参数后,可以对任意区域进行矫正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576908.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git:git rm --cached和git rm -f和git restore --staged的区别(附带详细步骤测试)和git diff比较本地分支和远程分支的区别(细分到文件/文件)

git rm --cached和git rm -f和git restore --staged的区别 当试图删除一个已经git add在暂存区的文件,我们使用 git rm --cached:从暂存区中移除,但保留在工作区中,且工作区中的文件内容在执行命令前需要还原到最后一次git add的…

Python程序怎么打包成exe文件

前言 pyinstaller可以将.py文件打包成.exe可执行文件,即使别人的电脑上没有搭建Python环境,也是可以直接运行程序的。 pyinstaller安装 首先打开cmd,在里面输入下面这一行命令,回车即可。 pip install pyinstaller 我运行命令…

网络七层模型之表示层:理解网络通信的架构(六)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

MYSQL数字函数实操宝典:场景化SQL语句一网打尽

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 MYSQL数字函数:不可不知的数据处理利器 文章目录 Part 1: 准备 &#x…

基于springboot+vue+Mysql的财务管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

python实现app自动化时一直连不上Appium

背景 在尝试python做APP自动化测试时,发现连不上Appium,我是连接模拟器里的APP 过程 一直以为是我调用初始化APP类方法时,实例化不对;一直翻阅资料也没有个所以然;后来发现模拟器APP的版本是Android 12;py…

正弦实时数据库(SinRTDB)的使用(6)-历史插值查询

前文已经将正弦实时数据库的使用进行了介绍,需要了解的可以先看下面的博客: 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

Voodoo中国区刘毅:全球爆款休闲游戏的创意选品与研发发行 | TopOn观察

10月28日,由TopOn联合罗斯基主办的“游戏赛道新机会”主题沙龙在成都举办。活动邀请了多位国内外知名公司及游戏爆款产品的负责人分享,分别从各自的方向及经验出发,以数据、案例、产品分析、行业趋势等多个维度,为行业从业者带来独…

设计模式 —— 设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 开闭原则 对扩展开放,对修改关闭。在程序需…

记CMakeLists.txt中已经配置-fPIC参数但未生效的解决方案

文章目录 1. 问题背景2. CMake中添加-fPIC的方式3. 检查-fPIC是否添加成功4. CMakeLists.txt中已经配置-fPIC参数但未生效的解决方案 1. 问题背景 博主的库会被编译成一个供第三方使用的静态库,第三方在使用博主的库编译动态库时,若不加-fPIC会报unreso…

vue3封装Element动态表单组件

1. 封装组件DymanicForm.vue 使用component实现动态组件组件不能直接使用字符串传入,所以根据传入的组件名称找到对应的组件校验规则,可使用rule传入自定义规则,也可以使用封装好的基本规则 示例中使用了checkRequired暴露重置方法和校验方法…

奥比中光深度相机(二):PyQt5实现打开深度摄像头功能

文章目录 奥比中光深度相机(二):PyQt5实现打开深度摄像头功能官方给出的调用深度相机源码环境精炼 UI界面设计逻辑代码构建槽函数连接提取视频流在界面中显示深度视频流注意关闭相机 总体代码效果演示运行main.py代码选择相机打开摄像头关闭摄…