Halcon例程(基于3D形状匹配识别方法)详解 —— create_shape_model_3d_lowest_model_level.hdev

一、例程简介

最近在研究3D识别方面的东西,查了不少资料,发现halcon里有不少关于三维物体识别的例程,这里对其中一个做出详解。该例程是基于三维匹配方法的,因为有三维模型SM3,所以不需要自己创建;另因为例程中的图像有多种不同的姿态,建立三维模型所需要的内存会很大,所以设定最低模型级别,显著降低了算法运行时间,但相对的,会损失算法的鲁棒性和检索时间。
在这里插入图片描述

二、例程详解

dev_update_off ()
* 设置面扫相机参数,参数可通过相机校正来获取。此算子为库函数,通过Division畸变模型生成一个相机参数元组。
* 其中参数含义为(焦距,模拟径向透镜畸变的畸变系数,传感器上两个相邻单元之间的水平距离,传感器上两个相邻单元之间的垂直距离,光心列坐标,光心行坐标,图宽,图高,输出相机参数)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)
{ CameraParam :=['area_scan_division',Focus,Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight]
return () }
* 获取相机参数,返回要求的图像宽参数。
get_cam_par_data (CamParam, 'image_width', IWidth)
{
*返回相机的类型和参数名
get_cam_par_names (CameraParam, CameraType, CameraParamNames)
* 
* 找到相机数据的索引并返回对应的值。
ParamValue := []
*依次读取参数名,ParamName在get_cam_par_names已被赋值,为'image_width'
for Index := 0 to |ParamName| - 1 by 1
    ParamNameInd := ParamName[Index]
    if (ParamNameInd == 'camera_type')
        ParamValue := [ParamValue,CameraType]
        continue
    endif
    * I为'image_width'在CameraParamNames的索引值,为7
    I := find(CameraParamNames,ParamNameInd)
    if (I != -1)
    *将图宽值赋值给ParamValue
        ParamValue := [ParamValue,CameraParam[I]]
    else
        throw ('Unknown camera parameter ' + ParamNameInd)
    endif
endfor
return () }
get_cam_par_data (CamParam, 'image_height', IHeight)
* 
read_image (Image, 'tile_spacers/tile_spacers_color_01')
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (3)
dev_clear_window ()
disp_message (WindowHandle, 'Reading the 3D shape model file from disk ...', 'window', 12, 12, 'black', 'false')
* 如果磁盘没有可用的话就创建3D模型
try
*  读取3D形状模型,具体地址在C盘MVTec文件夹下examples\hdevelop\3D-Matching\Shape-Based。
    read_shape_model_3d ('tile_spacer.sm3', ShapeModel3DID)
catch (Exception)
    * 读目标3D模型的DXF文件,CAD格式,但因为上一步可以运行,所以这一部分没用了。
    * 参数(文件名,文件单位的转换尺度(单位为100um),参数名,参数值,3D模型句柄,状态信息)
    read_object_model_3d ('tile_spacer.dxf', 0.0001, [], [], ObjectModel3DID, DXFStatus)
    *为指定操作准备3D模型,可以计算所需要的值并储存在objectModel3D
    *参数(3D模型句柄,目的,指定是否应覆盖已存在的数据,参数名,参数值)
    prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])
    disp_message (WindowHandle, 'Reading the 3D shape model file from disk ... not found!', 'window', 12, 12, 'red', 'false')
    disp_message (WindowHandle, 'Creating the 3D shape model (may take a few seconds) ...', 'window', 42, 12, 'black', 'false')
    count_seconds (S1)
    * 创建3D形状模型,是通过计算三维物体模型在用户指定的姿势范围内的不同视图而生成的。通过在三维物体模型周围放置虚拟摄像机,并将三维物体模型投影到每个虚拟摄像机位置的图像平面上,自动生成视图;
    * 因此,在生成三维形状模型时,不使用对象的图像,只使用在objectModel3D中传递的三维对象模型,所有视图的形状表示都存储在三维形状模型中,该模型返回到shapeModel3DID中。在创建三维形状模型之前,必须校准相机,以防止畸变。
    * 参数(3D模型句柄,相机参数,沿x轴/x分量旋转的罗德里格斯矢量,y轴,z轴,参考向量的旋转值,模型视图的最小经度,
    * 最大经度,模型视图的最小纬度,最大纬度,模型视图的最小摄影机滚动角度,最大角度,模型视图的最小摄影机对象距离,最大距离,搜索图像中对象的最小对比度,用于控制运算符行为的(可选)参数的名称(最低模型级别),可选参数值,句柄)
    create_shape_model_3d (ObjectModel3DID, CamParam, 0, 0, 0, 'gba', -rad(60), rad(60), -rad(60), rad(60), 0, rad(360), 0.26, 0.27, 10, 'lowest_model_level', 3, ShapeModel3DID)
    count_seconds (S2)
    T := S2 - S1
    disp_message (WindowHandle, 'Creation time: ' + T$'.3' + ' s', 'window', 72, 12, 'black', 'false')
    try
        disp_message (WindowHandle, 'Writing model to disk ...', 'window', 102, 12, 'black', 'false')
        *存储3D模型
        write_shape_model_3d (ShapeModel3DID, 'tile_spacer.sm3')
    catch (Exception)
        disp_message (WindowHandle, 'Writing model to disk ... failed!', 'window', 102, 12, 'red', 'false')
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endtry
endtry
*显示模型信息
disp_lowest_model_level_info (WindowHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 匹配
Times := []
NumImages := 12
for I := 1 to NumImages by 1
    read_image (Image, 'tile_spacers/tile_spacers_color_' + I$'02')
    dev_display (Image)
    * 
    * 查找三个三维模型的实例,将“border”模型设置为“true”,因为对象可能会接触图像边界
    * 程序开始到现在过去的时间
    count_seconds (Seconds1)
    *在图像中找出一个3D模型的最佳匹配
    *参数(输入图像,3D模型的句柄,最低分数(值越大,搜索速度越快),贪婪度(值越大,搜索越快,但更容易失败),
    (该值决定搜索过程中金字塔层的数量,设为0,则数量为创建模型时的指定值),
    控制操作行为的参数名,参数值,模型的3D位姿,姿态参数的36个协方差或6个标准差,分数)
    find_shape_model_3d (Image,  ShapeModel3DID,0.7, 0.85, 0, ['num_matches','max_overlap','border_model'], [3,0.75,'true'], Pose, CovPose, Score)
    count_seconds (Seconds2)
    计算匹配时间
    Time := Seconds2 - Seconds1
    Times := [Times,Time]
    *通过使用匹配的姿势将三维形状模型投影到图像中,将找到的匹配项可视化
    for J := 0 to |Score| - 1 by 1
        *显示轮廓
        PoseTmp := Pose[J * 7:J * 7 + 6]
        *将三维形状模型的边投影到图像坐标中。
        project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, PoseTmp, 'true', rad(30))
        dev_set_color ('yellow')
        dev_display (ModelContours)
        * 显示3D模型的坐标系
        dev_set_colored (3)
        disp_3d_coord_system (WindowHandle, CamParam, PoseTmp, 0.015)
    endfor
    for K := 0 to |Score| - 1 by 1
        * 显示找到的位姿的参数
        PoseTmp := Pose[K * 7:K * 7 + 6]
        *自定义函数,显示位姿信息
        display_match_pose (ShapeModel3DID, PoseTmp, WindowHandle)
        {
        *查找模型参数(参考点坐标),
         get_shape_model_3d_params (ShapeModel3DID, 'reference_point', ReferencePoint)
         *查找相机参数
       get_shape_model_3d_params (ShapeModel3DID, 'cam_param', CamParam)
* 
* Project the reference point
* 将三维姿态转换为齐次变换矩阵。
pose_to_hom_mat3d (Pose, HomMat3D)
*对点应用任意仿射3D变换
affine_trans_point_3d (HomMat3D, ReferencePoint[0], ReferencePoint[1], ReferencePoint[2], X, Y, Z)
*将3D点投影到(亚)像素图像坐标中。
project_3d_point (X, Y, Z, CamParam, Row, Column)
* 显示参考点坐标
Message := 'Pose:'
Message[1] := '   X: ' + (1000 * Pose[0])$'4.1f' + ' mm'
Message[2] := '   Y: ' + (1000 * Pose[1])$'4.1f' + ' mm'
Message[3] := '   Z: ' + (1000 * Pose[2])$'4.1f' + ' mm'
Message[4] := '   Alpha: ' + Pose[3]$'4.1f' + '°'
Message[5] := '   Beta: ' + Pose[4]$'4.1f' + '°'
Message[6] := '   Gamma: ' + Pose[5]$'4.1f' + '°'
disp_message (WindowHandle, Message, 'image', Row, Column - 30, 'black', ['#ffffffcc','false'])
return () }
    endfor
    *在左上角显示匹配用时
    disp_message (WindowHandle, |Score| + ' Match(es) found in ' + Time$'4.2f' + ' s', 'window', 12, 12, 'dark green', ['white','false'])
    if (I < NumImages)
        disp_continue_message (WindowHandle, 'black', ['white','false'])
        stop ()
    endif
endfor
* 
disp_end_of_program_message (WindowHandle, 'black', ['white','false'])

三、总结

下面对上述基于形状的3D匹配方法进行总结,主要包含以下几个步骤:
1.读取/创建3D模型read_object_model_3d/create_shape_model_3d;
2.对二维图像进行3D匹配,计算得分,find_shape_model_3d
3将匹配结果可视化,project_shape_model_3d,project_3d_point
总的来看,这种3D匹配方法还是比较好用的,对于物体间遮挡的情况也可以进行识别,难点在于调参吧。该方法的原理根据三维模型的位姿信息来对图像中的目标进行搜索并判断,返回一个匹配度值,网上没有更为详细的代码,应该是比较难吧,基于点云的还有不少资料,目前业界关于3D识别方面的项目还没有很普遍,研究者较少,希望后面有所改善。
如果大家有意见和想法,可以一起交流,注意点赞评论哦。

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Halcon create_shape_model是一个Halcon图像处理软件中的函数,用于创建形状模型。形状模型是一种用于在图像中查找特定物体的模型,它可以识别物体的形状、大小、旋转角度等特征。通过Halcon create_shape_model函数,用户可以根据需要创建自己的形状模型,以便在后续的图像处理中使用。 ### 回答2: Halcon是一种非常强大的机器视觉软件,它提供了各种各样的工具和函数来帮助用户进行图像处理和分析。在Halcon中,create_shape_model是其中一个非常重要的函数,它允许用户创建自己的形状模板,并用于在图像中查找相同的形状。 首先,我们需要明确什么是形状模板。形状模板是一个由边缘组成的结构,可以用于表示某种形状的特征。例如,如果我们要在图像中查找一个特定的圆形,我们可以使用create_shape_model函数创建一个圆形模板,然后在图像中使用find_shape_model函数来查找这个圆形。 使用create_shape_model函数创建模板时,我们需要提供一个输入图像,然后选择我们想要创建模板的区域。create_shape_model函数会自动提取区域中的边缘,并将它们组合成一个形状模板。我们也可以选择对模板进行一些额外的处理,例如平移、旋转和缩放,以适应不同尺度和角度的形状。 一旦我们创建好了形状模板,我们就可以将其用于在图像中查找相同的形状。使用find_shape_model函数,我们可以指定我们想要查找的模板,然后在图像中搜索该模板。find_shape_model函数会返回一个包含所有符合条件的形状的列表,并将它们标记出来,以便用户可以进一步处理或分析这些形状。 总的来说,create_shape_model是一个非常有用的函数,它为用户提供了一种快速而精确的方法来创建自己的形状模板,并在图像中查找相同的形状。无论您是处理图像还是分析数据,都可以使用create_shape_model函数来加快您的工作流程,并提高您的工作效率。 ### 回答3: Halcon是一个工业级的计算机视觉库,提供了丰富的图像处理和分析功能。其中,create_shape_modelHalcon中一个非常重要的函数,用于创建基于形状的图像模型。 首先,我们需要明确一个概念,即“形状模型(shape model)”。形状模型是指将目标物体的形状信息抽象出来的一个数学模型,通常是基于轮廓线、边界等信息,用于描述目标物体的形状形状模型是Halcon中一种常用的目标识别方法,其特点是对目标物体的形状不敏感,能够实现较高的识别精度。 create_shape_model函数用于根据一组训练图像,生成一个形状模型。具体步骤如下: 1. 预处理:首先,需要对训练图像进行预处理,包括图像去噪、二值化、边缘检测等操作。目的是提取出目标物体的边缘、轮廓等形状信息。 2. 提取特征:对预处理后的图像进行特征提取,从而得到用于描述目标物体形状的特征向量。Halcon中提供了多种特征提取算法,如灰度分布、霍夫变换等。 3. 建立模型:将提取到的特征向量按照一定的规则组合成形状模型,并存储到硬盘上,以备后续使用。 使用create_shape_model函数可以自动化地完成上述步骤,从而快速地生成一个形状模型。用户只需要输入训练图像(通常为包含目标物体的正面图像)和相关参数,即可得到一个形状模型。 create_shape_model函数的输出是一个包含形状模型信息的文件,用户可以通过该文件进行目标识别、定位等工作。值得一提的是,使用形状模型进行目标识别时,需要对输入图像进行预处理,并使用find_shape_model函数搜索目标物体在图像中的位置。 总之,create_shape_modelHalcon中一个非常重要的函数,用于生成基于形状的目标模型。它可以大大简化模型建立的流程,提高识别精度和效率。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值