
现有如下,对其进行腐蚀并统计前后region个数。
erosion_circle 前, region 个数为 16 。 erosion_circle 后,中可看到的 region 个数为 8 ,但实际 region 个数仍为 16 。
在 变量窗口 -> 图像变量 选择 ConnectedRegions ,右键点击 显示目录->选择 可看到腐蚀前 region 的详细信息。
在 变量窗口 -> 图像变量 选择 RegionErosion ,右键点击 显示目录->选择 可看到腐蚀后 region 的详细信息。
比较 region 前后变化可发现, erosion_circle 只是将 region 相应的值缩小为 0 , region 个数并未改变。
先使用 select_shape 筛掉面积为0或中心为(0,0)的 region ,再用 count_obj 统计 region 个数。
halcon的模板匹配可以归为三类:
1、基于灰度:灰度,互相关ncc
2、基于形状:形状,组件
3、基于描述符:描述匹配
应用场合:定位对象内部的灰度值没有大的变化,没有缺失部分,没有干扰图像和噪声的场合。
1创建模板:create_template()
2寻找模板:best_match()
3释放模板:clear_template()
应用场合:搜索对象有轻微的变形,大量的纹理,图像模糊等场合,速度快,精度低。
1创建模板:create_ncc_model()
2寻找模板:find_ncc_model(),find_ncc_models()
3释放模板:clear_ncc_model()
4get_ncc_model_region (ModelRegion, ModelID)
smallest_rectangle2 (ModelRegion, Row3, Column3, Phi, Length1, Length2)
应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合。
算法步骤:
1获取组件模型里的初始控件 gen_initial_components()
参数:
ModelImage [Input] 初始组件的
InitialComponents [Output] 初始组件的轮廓区域
ContrastLow [Input] 对比度下限
ContrastHigh [Input] 对比度上限
MinSize [Input] 初始组件的最小尺寸
Mode[Input] 自动分段的类型
GenericName [Input] 可选控制参数的名称
GenericValue [Input] 可选控制参数的值
2根据图像模型,初始组件,训练来训练组件和组件相互关系 train_model_components()
3创建组件模型 create_trained_component_model()
4寻找组件模型 find_component_model()
5释放组件模型 clear_component_model()
应用场合:定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑。
1创建形状模型:create_shape_model()
2寻找形状模型:find_shpae_model()
3释放形状模型:clear_shape_model()
应用场合:搜索对象有轻微的变形。
1创建模板:create_local_deformable_model()
2寻找模板:find_local_deformable_model()
3释放模板:clear_deformable_model()
应用场合:搜索对象有轻微的变形,透视的场合,根据一些描述点的位置和灰度值来进行匹配。
1创建模板:create_calib_descriptor_model()
2寻找模板:find_calib_descriptor_model()
3释放模板:clear_descriptor_model()
可以用Halcon建立深度学习模型,并用到实际项目中。
流程大概是使用免费的 Halcon Deeplearing Label Tool制作模型后,导出成 hdl 文件,并在应用程序中用 ApplyDlClassifier 应用模型。
经过测试, ApplyDlClassifer 在第一次运行时,无论数据集有多大,执行时间在500ms左右(AMD 5800X + Nvidia P2200),能够明显感受到卡顿,而在第二次运行时,就感受不到卡顿。所以我考虑,在应用程序启动时,使用线程对模型进行预热。
预热听着高深,其实就是读取模型( ReadDlClassifier ) 并送入一张空白图。
下面演示我的做法:
21 封装一个自己的Application类
22 我将Halcon算子封装成一个单例类,并使用 getAlgorithmGlobalData 获得这个单例对象。 slotDoModelWarmUp 是这个单例类一个槽函数。
23 在 slotDoModelWarmUp 中开多线程,对模型进行预热。
我将Halcon深度学习算子要用到的变量封装成一个 context 结构体,放在单例类中。为了节约开销,我使用引用,直接获取这个单例对象。这样,在向线程中传参数时,需要一个 std::ref 。
线程函数如下:
classifierHandle 是一个引用变量,这使得我可以直接 *** 控单例类中的数据成员,而不是使用拷贝。
经过测试,在AMD 5800X + Nvidia P2200下,推理速度达到了1166ms。
以上就是关于Halcon:腐蚀或开运算后region个数并未改变全部的内容,包括:Halcon:腐蚀或开运算后region个数并未改变、halcon模板匹配总结、性能优化——使用多线程加速Halcon深度学习算子等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)