Halcon 用点来拟合平面

这篇具有很好参考价值的文章主要介绍了Halcon 用点来拟合平面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

项目要求用多个点来拟合一个平面,然后再用其他平面上的点来计算这个点到平面的距离,halcon 有现成的拟合函数。

MatLab 版本:Matlab 最小二乘法 拟合平面_Σίσυφος1900的博客-CSDN博客

二、算子解释

*输入点云数据然后生成3D模型
gen_object_model_3d_from_points(X, Y, Z, ObjectModel3D)
 * X, Y, Z  分别是点x、y、z方向上的集合
 * ObjectModel3D 是输出的3D模型
*拟合成想要的平面
fit_primitives_object_model_3d (ObjectModel3D, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut)

*fit_primitives_object_model_3d( : : ObjectModel3D, ParamName, ParamValue : ObjectModel3DOut)
*ObjectModel3D:输入模型
*ParamName:拟合的参数 :fitting_algorithm, max_radius, min_radius, output_point_coord, output_xyz_mapping, primitive_type
*ParamValue:对应'primitive_type'------'cylinder'(圆柱体), 'sphere'(球体), 'plane'(平面)。对应'primitive_type'------'least_squares', 'least_squares_huber', 'least_squares_tukey'几种最小二乘法,这里选择plane和least_squares
*ObjectModel3DOut:输出的平面

三、代码演示

X:=[-0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04]
Y:=[-0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]
Z:=[-0.0, -0.0, -0.0, -0.0, -0.1, -0.0, -0.0, -0.1, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0]
*输入点云数据然后生成3D模型
gen_object_model_3d_from_points(X, Y, Z, ObjectModel3D)
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
*拟合成想要的平面
fit_primitives_object_model_3d (ObjectModel3D, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut)

*fit_primitives_object_model_3d( : : ObjectModel3D, ParamName, ParamValue : ObjectModel3DOut)
*ObjectModel3D:输入模型
*ParamName:拟合的参数 :fitting_algorithm, max_radius, min_radius, output_point_coord, output_xyz_mapping, primitive_type
*ParamValue:对应'primitive_type'------'cylinder'(圆柱体), 'sphere'(球体), 'plane'(平面)。对应'primitive_type'------'least_squares', 'least_squares_huber', 'least_squares_tukey'几种最小二乘法,这里选择plane和least_squares
*ObjectModel3DOut:输出的平面


visualize_object_model_3d (WindowHandle,[ObjectModel3D,ObjectModel3DOut], [],[], \
      ['color_0','color_1','alpha_1','disp_pose'], ['green','gray',0.5,'true'],'RectBOX', [], [], Pose)
*获取法向量,Normal的前三个数值就是单位法向量
get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', Normals)

halcon计算点到平面,3D,halcon,平面,几何学,机器学习

 平面方程:ax+by+cz+d=0;

gen_object_model_3d_from_points(X, Y, Z, ObjectModel3D)
paraName:=['primitive_type', 'fitting_algorithm']
paraVal:=['plane', 'least_squares_tukey']
fit_primitives_object_model_3d(ObjectModel3D, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3DOut)
get_object_model_3d_params(ObjectModel3DOut, 'primitive_parameter', plane)

* 计算平面方程(a,b,c,d)
A:= plane[0]
B:= plane[1]
C:= plane[2]
D:= plane[3]

那么计算点到平面的距离就是:

Distance:=a*X + b*Y + c*Z - d

X:=[-0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04, -0.04, -0.03, -0.02, -0.01, 0.0, 0.01, 0.02, 0.03, 0.04]
Y:=[-0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.04, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.03, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.02, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]
Z:=[-0.0, -0.0, -0.0, -0.0, -0.1, -0.0, -0.0, -0.1, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0]


gen_object_model_3d_from_points(X, Y, Z, ObjectModel3D)
paraName:=['primitive_type', 'fitting_algorithm']
paraVal:=['plane', 'least_squares_tukey']
fit_primitives_object_model_3d(ObjectModel3D, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3DOut)
get_object_model_3d_params(ObjectModel3DOut, 'primitive_parameter', plane)

* 计算平面方程(a,b,c,d)
A:= plane[0]
B:= plane[1]
C:= plane[2]
D:= plane[3]

x:=[-0.04, -0.03, -0.02, -0.01] 
y:=[-0.04, -0.04, -0.04, -0.04] 
z:=[-0.0, -1.0, 10.0, 30.0] 


Distance:=A*x +B*y + C*z - D

halcon计算点到平面,3D,halcon,平面,几何学,机器学习

四、用最小二乘法来拟合的平面

【MQ笔记】超简单的最小二乘法拟合平面(Python)_M&Q的博客-CSDN博客_最小二乘法拟合平面

halcon计算点到平面,3D,halcon,平面,几何学,机器学习

 上述方程可以用来表示。由于A是一个的矩阵,因此我们先在等号两边分别乘以 的转置矩阵,使系数矩阵变为的方阵,之后,通过乘以系数矩阵的逆矩阵求解,也就是说,。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


# 创建函数,用于生成不同属于一个平面的100个离散点
def not_all_in_plane(a, b, c):
    x = np.random.uniform(-10, 10, size=100)
    y = np.random.uniform(-10, 10, size=100)
    z = (a * x + b * y + c) + np.random.normal(-1, 1, size=100)
    return x, y, z


# 调用函数,生成离散点
x, y, z = not_all_in_plane(2, 5, 6)

# 创建系数矩阵A
a = 0
A = np.ones((100, 3))
for i in range(0, 100):
    A[i, 0] = x[a]
    A[i, 1] = y[a]
    a = a + 1
# print(A)

# 创建矩阵b
b = np.zeros((100, 1))
a = 0
for i in range(0, 100):
    b[i, 0] = z[a]
    a = a + 1
# print(b)

# 通过X=(AT*A)-1*AT*b直接求解
A_T = A.T
A1 = np.dot(A_T, A)
A2 = np.linalg.inv(A1)
A3 = np.dot(A2, A_T)
X = np.dot(A3, b)
print('平面拟合结果为:z = %.3f * x + %.3f * y + %.3f' % (X[0, 0], X[1, 0], X[2, 0]))

# 计算方差
R = 0
for i in range(0, 100):
    R = R + (X[0, 0] * x[i] + X[1, 0] * y[i] + X[2, 0] - z[i]) ** 2
print('方差为:%.*f' % (3, R))

# 展示图像
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection='3d')
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set_zlabel("z")
ax1.scatter(x, y, z, c='r', marker='o')
x_p = np.linspace(-10, 10, 100)
y_p = np.linspace(-10, 10, 100)
x_p, y_p = np.meshgrid(x_p, y_p)
z_p = X[0, 0] * x_p + X[1, 0] * y_p + X[2, 0]
ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)
plt.show()

 halcon计算点到平面,3D,halcon,平面,几何学,机器学习

利用最小二乘法公式求导
通过离散点拟合平面,也就是说,要找到一个平面(),使这平面到各个点的“距离”最近,根据最小二乘法,,也就是说我们要求得一组a,b,c,使得对于已有的离散点来说,S的值最小。

halcon计算点到平面,3D,halcon,平面,几何学,机器学习

求解该恰定方程即可得到a,b,c。上述方程也可以用表示,该方程可以通过两边同时乘以系数矩阵的逆矩阵求得,即。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
# 创建函数,用于生成不同属于一个平面的100个离散点
def not_all_in_plane(a, b, c):
    x = np.random.uniform(-10, 10, size=100)
    y = np.random.uniform(-10, 10, size=100)
    z = (a * x + b * y + c) + np.random.normal(-1,1,size=100)
    return x, y, z
 
 
# 调用函数,生成离散点
x2, y2, z2 = not_all_in_plane(2, 5, 6)
 
#创建系数矩阵A
A=np.zeros((3,3))
for i in range(0,100):
    A[0,0]=A[0,0]+x2[i]**2
    A[0,1]=A[0,1]+x2[i]*y2[i]
    A[0,2]=A[0,2]+x2[i]
    A[1,0]=A[0,1]
    A[1,1]=A[1,1]+y2[i]**2
    A[1,2]=A[1,2]+y2[i]
    A[2, 0] = A[0,2]
    A[2, 1] = A[1, 2]
    A[2, 2] = 100
#print(A)
 
#创建b
b = np.zeros((3,1))
for i in range(0,100):
    b[0,0]=b[0,0]+x2[i]*z2[i]
    b[1,0]=b[1,0]+y2[i]*z2[i]
    b[2,0]=b[2,0]+z2[i]
#print(b)
 
#求解X
A_inv=np.linalg.inv(A)
X = np.dot(A_inv, b)
print('平面拟合结果为:z = %.3f * x + %.3f * y + %.3f'%(X[0,0],X[1,0],X[2,0]))
 
#计算方差
R=0
for i in range(0,100):
    R=R+(X[0, 0] * x2[i] + X[1, 0] * y2[i] + X[2, 0] - z2[i])**2
print ('方差为:%.*f'%(3,R))
 
# 展示图像
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection='3d')
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set_zlabel("z")
ax1.scatter(x2,y2,z2,c='r',marker='o')
x_p = np.linspace(-10, 10, 100)
y_p = np.linspace(-10, 10, 100)
x_p, y_p = np.meshgrid(x_p, y_p)
z_p = X[0, 0] * x_p + X[1, 0] * y_p + X[2, 0]
ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)
plt.show()

 halcon计算点到平面,3D,halcon,平面,几何学,机器学习文章来源地址https://www.toymoban.com/news/detail-555779.html

到了这里,关于Halcon 用点来拟合平面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Halcon 3D相关算子(二)

    (1) moments_object_model_3d( : : ObjectModel3D, MomentsToCalculate : Moments) 功能:计算3D对象模型的平均值或中心二阶矩。要计算3D物体模型点的平均值,在MomentsToCalculate中选择\\\'mean_points\\\';如果要计算二阶中心矩,则选择\\\'central_moment_2_points\\\',结果是x、y、z、x-y、x-z和y-z轴的方差;要计算3D物

    2024年01月20日
    浏览(53)
  • Halcon 3D相关案例分享

    本文是工作和学习过程中整理的3D相关案例,内容包括但不限于: 预处理、检测、量测以及配准… 具体展开可见如下思维导图。 一、预处理 1、平滑滤波 平滑滤波用到的主要算子是: smooth_object_model_3d 算子说明 操作符 smooth_object_model_3d 使用方法指定的方法对 ObjectModel3D 中的

    2024年02月07日
    浏览(39)
  • Halcon中的一些3D算子

    1.read_object_model_3d  从文件读取一个3d模型 如下图,读的一个ply文件出来是个3d点云模型  2.visualize_object_model_3d  交互式展示3d模型 即上个算子读出来后,通过这个算子可以把3d模型显示出来旋转、平移,缩放来观察操作 算子签名 visualize_object_model_3d( : : WindowHandle, ObjectModel3D,

    2024年02月11日
    浏览(37)
  • Halcon 3D 切片法检测物料

            在上一篇中,学习了鞋底切片法来求轮廓,那个思路是比较简单的,其次还提到了法向量重建的方法,目前由于没有用法向量重建来做那个项目,所以还是有很大的疑问,后续会继续学习那个方法然后重新在做一次,和切片法做一个对比,今天来学一习Halcon 自带的例

    2023年04月08日
    浏览(33)
  • [Halcon&3D] 3D手眼标定理论与示例解析

    📢博客主页:https://loewen.blog.csdn.net 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 丶布布 原创,首发于 CSDN, 转载注明出处 🙉 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨ 一. 3D手眼标定理论基础 因为3D相机知道的是点云坐标,机械手是空

    2024年02月16日
    浏览(41)
  • [Halcon&3D] 主流的3D光学视觉方案及原理

    📢博客主页:https://loewen.blog.csdn.net 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 丶布布 原创,首发于 CSDN, 转载注明出处 🙉 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨ 一. 前言 传统工业机器视觉中, 3D 视觉与 2D 视觉技术的最大区别在

    2024年02月06日
    浏览(50)
  • 嚼一嚼Halcon中的3D手眼标定

    一、问题概述 1、何为手眼标定? 要让机器人的手抓住杯子,就必须知道 杯子跟手的相对位置关系 ,而杯子的位置则是通过机器人的眼睛看见的,所以,我们只需要知道 机器人的手和眼睛的转换关系 ,就可以随时抓取机器人眼睛所看到的物体了。 2、手眼标定的2种形式 1)

    2024年02月04日
    浏览(38)
  • [Halcon&3D] 3D鞋点胶的点云边界提取

    📢博客主页:https://loewen.blog.csdn.net 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 丶布布 原创,首发于 CSDN, 转载注明出处 🙉 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨ 一. 边界提取的常规思路 3D鞋实物图如下所示: 鞋点胶的点云边界

    2024年02月09日
    浏览(43)
  • [3D&Halcon] 3D鞋点胶的点云边界提取

    📢博客主页:https://loewen.blog.csdn.net 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 丶布布 原创,首发于 CSDN, 转载注明出处 🙉 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨ 一. 边界提取的常规思路 3D鞋实物图如下所示: 鞋点胶的点云边界

    2024年02月15日
    浏览(122)
  • 3D点云平面拟合算法

    假设你有一组 3D 中的 n 个点,并且想要为它们拟合一个平面。 在本文中,我将推导出一个简单的、数值稳定的方法,并提供它的源代码。 听起来很好玩? 我们开始吧! NSDT工具推荐 : Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包