Halcon实现3维点云平面拟合

Halcon实现3维点云平面拟合

go 复制代码
function main()
    WindowHandle = open_window()
    ObjectModel3D = load_3D_model("1.om3")
    ObjectModel3DSelected = remove_noise(ObjectModel3D)
    [X, Y, Z] = extract_coordinates(ObjectModel3DSelected)
    [NX, NY, NZ, C] = fit_plane(X, Y, Z)
    visualize(ObjectModel3DSelected, NX, NY, NZ, C, WindowHandle)

打开并配置窗口

go 复制代码
function open_window()
    dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
    set_display_font(WindowHandle, 14, 'mono', 'true', 'false')
    return WindowHandle

加载3D模型

go 复制代码
function load_3D_model(filename)
    read_object_model_3d(filename, 'm', [], [], ObjectModel3D, Status)
    check_status(Status)
    return ObjectModel3D

去除3D模型中的噪点

go 复制代码
function remove_noise(ObjectModel3D)
    connection_object_model_3d(ObjectModel3D, 'distance_3d', 1, ObjectModel3DConnected)
    select_object_model_3d(ObjectModel3DConnected, 'num_points', 'and', 1000, 99999, ObjectModel3DSelected)
    return ObjectModel3DSelected

提取3D模型的坐标信息

go 复制代码
function extract_coordinates(ObjectModel3D)
    get_object_model_3d_params(ObjectModel3D, 'point_coord_x', X)
    get_object_model_3d_params(ObjectModel3D, 'point_coord_y', Y)
    get_object_model_3d_params(ObjectModel3D, 'point_coord_z', Z)
    return [X, Y, Z]

拟合平面

function fit_plane(X, Y, Z)

计算点的重心

XM = mean(X)

YM = mean(Y)

ZM = mean(Z)

复制代码
# 计算对称矩阵M(A)
DX = X - XM
DY = Y - YM
DZ = Z - ZM
MA11 = sum(DX * DX)
MA22 = sum(DY * DY)
MA33 = sum(DZ * DZ)
MA12 = sum(DX * DY)
MA13 = sum(DX * DZ)
MA23 = sum(DY * DZ)

create_matrix(3, 3, [MA11,MA12,MA13,MA12,MA22,MA23,MA13,MA23,MA33], MatrixID)

# 求取特征值和特征向量
eigenvalues_symmetric_matrix(MatrixID, 'true', EigenvaluesID, EigenvectorsID)

# 获取法向量
get_value_matrix(EigenvectorsID, 0, 0, NX)
get_value_matrix(EigenvectorsID, 1, 0, NY)
get_value_matrix(EigenvectorsID, 2, 0, NZ)

# 计算平面的常数C
C = NX * XM + NY * YM + NZ * ZM
if C < 0.0
    NX = -NX
    NY = -NY
    NZ = -NZ
    C = -C
endif
return [NX, NY, NZ, C]

可视化函数

go 复制代码
# 可视化函数
function visualize(ObjectModel3DSelected, NX, NY, NZ, C, WindowHandle)
    # 设置可视化参数
    VisualizationPlaneSize = 40
    GenParamName = ['lut','color_attrib','light_position','alpha']
    GenParamValue = ['color1','coord_z','0.0 0.0 -0.3 1.0', 0.9]

    # 获取3D对象的主要轴(可选)
    moments_object_model_3d(ObjectModel3DSelected, 'principal_axes', Pose)

    # 生成拟合平面的3D对象模型
    gen_plane_object_model_3d(Pose, [-1,-1,1,1] * VisualizationPlaneSize, [-1,1,1,-1] * VisualizationPlaneSize, IntersectionPlane)

    # 设置可视化窗口的角度和位置
    create_pose(-65, -40, 2400, 150, 0, -60, 'Rp+T', 'gba', 'point', PoseIn)

    # 设置标题和操作说明
    Title = '3D object & fitplane'
    Instructions[0] = 'Rotate: Left button'
    Instructions[1] = 'Zoom: Shift + left button'
    Instructions[2] = 'Move: Ctrl + left button'

    # 在窗口中可视化3D对象和拟合平面
    visualize_object_model_3d(WindowHandle, [ObjectModel3DSelected, IntersectionPlane], [], PoseIn, GenParamName, GenParamValue, Title, [], Instructions, Pose)
end function

状态检查

go 复制代码
function check_status(Status)
    if Status != "OK"
        # Handle the error here
相关推荐
老蒋新思维1 小时前
创客匠人峰会深度解析:知识变现的 “信任 - 效率” 双闭环 —— 从 “单次交易” 到 “终身复购” 的增长密码
大数据·网络·人工智能·tcp/ip·重构·数据挖掘·创客匠人
大刘讲IT1 小时前
面向中小企业的企业AI Agent未来3年构建蓝图规划
人工智能·经验分享·ai·开源·制造
yzx9910131 小时前
深度学习的进化之路:从感知机到通用智能的曙光
人工智能·深度学习
是开心的栗子呀1 小时前
阿里云天池:预测二手车交易价格的机器学习项目-高效实现MAE低于500分
人工智能·机器学习·阿里云·ai·云计算
智算菩萨1 小时前
走向场景,走向融合:2025年末国产大模型的平台化竞赛与Agent新范式
人工智能·语言模型·aigc
KAI智习2 小时前
一张图看懂AI Agent的6种模式—MAS
人工智能·agent·多智能体·mas
玩转单片机与嵌入式2 小时前
在STM32F103单片机上跑通AI模型:为什么选正弦波作为Hello World?
人工智能·stm32·单片机
闲谈共视2 小时前
基于去中心化社交与AI智能服务的Web钱包商业开发的可行性
前端·人工智能·去中心化·区块链
老马啸西风2 小时前
成熟企业级技术平台-10-跳板机 / 堡垒机(Bastion Host)详解
人工智能·深度学习·算法·职场和发展
c#上位机2 小时前
halcon求区域交集——intersection
图像处理·人工智能·计算机视觉·c#·halcon