基于匹配模板的术语自动翻译方法 halcon学习_模板匹配
日期:2023-03-11 12:39:36 / 人气: 1060 / 发布者:成都翻译公司
模板匹配中有基于点、基于灰度值、基于描述符、基于相关性、基于形状、基于组件的方法。基于相关性的模板匹配在创建模板时,会将模板角度转为0°;基于相关性的模板匹配ps:使用基于互相关的时候,要使用灰度图像!基于灰度值的模板匹配基于形状的模板匹配ps:创建函数第二个参数金字塔层数不要写1,不然识别起起来困难(而且应该离焦状态就找不到了)ps:学会灵活运用halcon自带例子,把它当字典用。模板匹配有基于点、基于灰度值、基于描述符、基于相关性、基于形状和基于组件的方法。
一般流程:裁剪→创建模板→查找对象→仿射变换→显示
基于相关性的模板匹配会在创建模板时将模板角度转换为0°;
创建模板时,基于形状的模板匹配会将模板角度转为0°基于匹配模板的术语自动翻译方法,并将坐标移动到图像的左上角(0,0))。
基于相关性的模板匹配
1、 演示-模板匹配(基于相关性)-find_ncc_model_exposure
2、 Correlation适用于光照不均和明暗变化的场合(优点),但背景不宜太复杂(缺点)。
当照度变化很大时,使用良好的相关性,不要使用基于灰度的。
3、 可以通过调整参数来改变匹配效果。并且金字塔层数越多,搜索速度越快;反之,搜索速度越慢。
4、 相关值越接近1,越相关。
5、 实现模板匹配有两种方式:①助手②代码
6、 集合助手-创建参数→ 相对于create_ncc_model
…////Collection Assistant-Application → 相对于 find_ncc_model
ps:*大匹配数为0,表示查找所有匹配
7、 创建模板的方式可以是手绘,也可以是blob分析,然后就得拉出来了。减少域()
8、 助手方法,在图片中找到飞机(注意我用的图片,不是视频)
步:
先看一张图片-打开配对助手
创建tab-template资源:图像窗口(或使用文件或采集助手)-绘制ROI区域-基于互相关选择
应用选项卡-图片文件-加载-选择加载图片的名称-(勾选总是查找)-调整*低分
代码生成-插入代码
ps:我是来先插入图片的。如果使用摄像头,可以直接在抓图和应用的地方使用抓图助手。
ps:使用基于互相关,显示时为框架,如果基于形状,则显示为轮廓
ps:使用互相关时,使用灰度图像!!!
9、 代码方法,找到图中的平面
步:
看图→绘制ROI区域→area_center区域信息→裁剪ROI区域
创建ncc模板→找到ncc模板→仿射变换→显示
ps:基于归一化互相关(NCC)比较两幅图像的相似度是一种常见的图像处理方法。NCC算法可以有效降低光照对图像比对结果的影响。
ps:学会灵活使用复制粘贴
read_image (Image, 'C:/Users/yuan/Desktop/7.tif')
gen_rectangle2 (ROI_0, 415.916, 176.48, rad(-40.041), 19.9162, 16.9716)
area_center (ROI_0, Area, RowRef, ColumnRef)
reduce_domain (Image, ROI_0, ImageReduced)
dev_display (Image)
dev_set_draw ('margin')
create_ncc_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'use_polarity', ModelID)
find_ncc_model (Image, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, Angle, HomMat2D)
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
dev_display (Image)
dev_display (RegionAffineTrans)
ps:仿射变换函数刚开始是这样打的
vector_angle_to_rigid (RowRef, ColumnRef, rad(-40.041), Row, Column, angle, HomMat2D)
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D,'nearest_neighbor')
这时候就说明模板匹配找到的区域不是有角度的,不是水平的。
这是因为在创建ncc模板的时候,ROI_0的角度自动转为0°,所以仿射变换的起始角度应该变成0。记住这种情况在获取仿射矩阵的时候,起始角度是直接只需填写0°,并为改变的角度写下角度。
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 角度, HomMat2D)
ps:另外需要注意的就是创建和查找ncc模板的功能,第一次打出来的时候
create_ncc_model (ImageReduced,'auto', 0, 0,'auto','use_polarity', ModelID)
find_ncc_model (Image, ModelID, 0, 0, 0.5, 1, 0.5,'true', 0, Row, Column, Angle, Score)
三、的四个位置是搜索的起始角度和结束角度,这里改成rad(0和rad(360),像这样。
find_ncc_model (Image, ModelID, rad(0), rad(360), 0.5, 1, 0.5,'true', 0, Row, Column, Angle , 分数)
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, Angle, HomMat2D)
ps:由于仿射变换,查找ncc目标的函数第6个位置只能填1(匹配一个),否则会因为格式报错。
10、 一次代码匹配多架飞机
read_image (Image, 'C:/Users/yuan/Desktop/7.tif')
gen_rectangle2 (ROI_0, 415.916, 176.48, rad(-40.041), 19.9162, 16.9716)
area_center (ROI_0, Area, RowRef, ColumnRef)
reduce_domain (Image, ROI_0, ImageReduced)
dev_display (Image)
dev_set_draw ('margin')
create_ncc_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'use_polarity', ModelID)
find_ncc_model (Image, ModelID, rad(0), rad(360), 0.5, 3, 0.5, 'true', 0, Row, Column, Angle, Score)
if(|Score|>0)
for Index := 1 to 3 by 1
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row[Index-1], Column[Index-1], Angle[Index-1], HomMat2D)
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
dev_display (Image)
dev_display (RegionAffineTrans)
endfor
endif
ps:匹配了3个平面,所以行、列等值都是3个数字。
ps:|score|的值 是向量的维度!不是绝对值!
基于灰度值的模板匹配
1、 基于灰度值的目标匹配使用Mean Absolute Differences (MAD)
2、 rad() 函数将角度转换为弧度基于匹配模板的术语自动翻译方法,deg() 函数将弧度转换为角度。
3、 disp_arrow() 函数用于显示箭头。注意disp显示只是一个显示,在变量窗口是看不到数值的。
4、 rot 表示旋转搜索,mg 表示金字塔搜索。
best_match(), best_match_rot(), best_match_mg(), best_match_rot_mg()
fast_match(), fast_match_rot(), fast_match_mg(), fast_match_rot_mg()
基于形状的模板匹配
教程的前几课都是关于demo的,我们先来看看demo。
1、 对光线要求高,不适合室外自然光
2、基于形状的模板匹配创建模板时,ROI的位置自动移动到像素点(0,0)位置,角度旋转到0°。
3、 创建:
create_shape_model(), create_shape_model_xld(), create_scale_shape_model() / *后这个函数带有缩放功能
ps:如果用get_shape_model()创建模板,得到的是xld的轮廓,用于仿射变换函数中,显示的图形为轮廓。affine_trans_contour_xld() 使用这种仿射变换来显示轮廓。也可以不显示轮廓而想显示绘制的矩形框,那么affine_trans_region()函数,仿射变换之前绘制的roi区域,注意roi的行列角要填充在仿射前面矩形,而不是 (0,0,0).
ps:创建函数的第二个参数金字塔层不要写1,否则会很难识别(而且应该是失焦,找不到)
4、 查找:
find_shape_model(), find_scale_shape_model(), find_shape_models() / *后这个函数找到多个模板
5、 仿射变换:
平移和旋转:vector_angle_to_rigid()
比例:hom_mat2d_scale()
6、 显示:
dev_disp(图片)
dev_disp(RegionAffineTrans)
7、 详细了解demo,学习应用到实战项目中
ps:轮廓n。形状、轮廓
8、 演示模板匹配(形状)-align_measurements()
9、 演示模板匹配(形状)-create_average_shape_model():
①channels_to_image(Templates,MultichannelImage)
将多张图片变成多通道图片
②mean_n(MultichannelImage,ImageMean)
平均变成通道(然后用平均图像作为模板进行创建)
10、 演示-模板匹配(形状)-align_measurements()
write_shape_model(ModelID,'green-dot.shm')
将模板保存在 .shm 文件中,以备将来直接使用
检查形状模型()
检查模型轮廓
11、 演示-模板匹配(形状)-create_roi_via_vision()
dev_set_part(左上x,左上y,右下x,右下y)
这之后显示的图片都显示了划定的区域
12、 演示-模板匹配(形状)-create_shape_model_xld()
binary_threshold() //快速二值化
13、 演示-模板匹配(形状)-inspect_shampoo_label()
添加频道()
向区域添加灰度值
14、 演示-模板匹配(形状)-matching_coins()
前一个循环是创建模板,后一个循环是查找和显示
15、 演示-模板匹配(形状)-reuse_model()
write_shape_model()
存储为.sbm文件(上面是.shm文件,帮助也是shm文件,看不懂,但是这个例子中使用了.sbm文件,我试了一下,可以用),您可以保存创建的模型。
16、 demo-模板匹配(形状)-synthetic_circle
如果set_shape_model_para()函数中的第二个参数GenParamName是'timeout',这个函数的作用就是在时间过去后停止搜索。
油漆_xld(), 油漆区域()
从轮廓到图像,从区域到图像
17、 demo-模板匹配(形状)-pm_measure_board
我讲了(电路板芯片)定位+测量。通过定位电路板芯片的中心位置和角度,可以定位两排引脚,用两个矩形框来选择。
ps:对于膨胀腐蚀,二值图是面积的增减,灰度图是灰度值(亮度)的增减。
18、 demo-模板匹配(形状)-pm_multiple_models
以后做更多模板完全可以复制粘贴这个例子
inspect_shape_model() 用于检查模型的轮廓。如果您不满意,可以在创建后进行修改。使用特征直方图进行过滤。请注意,选择该功能时应将 xld 放在前面。
create_shape_model (Image, 5, rad(0), rad(360), 'auto', 'pregeneration', 'use_polarity', 30, 10, ModelID)
get_shape_model_contours (ModelCont, ModelID, 1)
select_shape_xld (ModelCont, ModelContours, 'contlength', 'and', 20, 1000)
下面的代码是为了方便直接建模,不用修改,然后进行仿射变换然后显示。
count_obj (ModelContours, NumModel)
count_obj (Models, NumModels)
concat_obj (Models, ModelContours, Models)
IndexS := [IndexS,NumModels + 1]
IndexE := [IndexE,NumModels + NumModel]
ModelIDs := [ModelIDs,ModelID]
用这张图更容易理解这段代码。(个人使用)
19、 演示-模板匹配(形状)-multiple_dxf_model
识别部分和前面的例子一样,区别在上半部分。
read_contours_xld_dxf() //这个demo的重点
本demo读取dxf文件,将轮廓转换为图像,然后创建轮廓
20、实战(实时查找瓶盖上的文字):
(基本上,写重要几乎很简单)
①:助手模式:
检测选项卡-需要点击执行,结果会显示到检测选项卡
②:编码方式:
裁剪(手绘或blob方法)→创建模板→查找识别→仿射变换→显示
在搜索函数的下一行添加一个if(|Score|> 1),防止找不到frame时出错
ps:取消勾选运行模式。连续运行时,创建模板时左上角显示的轮廓会消失。
ps:学会灵活使用halcon自己的例子,当成字典来使用。
相关阅读Relate
热门文章 Recent
- 公证处翻译毕业证模板-毕业证公证学历公证认证2023-03-11
- 澳洲户口簿翻译模板 澳洲500学生签证材料2023-03-11
- 翻译类英文简历模板 英语翻译大学生个人简历(女,22岁)2023-03-11
- 身份证翻译模板acca 关于如何报考ACCA证书2023-03-11
- 美国未婚妻签证翻译模板 法律职业资格证书翻译2023-03-11
- 社保翻译模板 【每日一法】社会保险法实施细则及其相关司法解释2023-03-11
- 高中学校毕业证翻译模板 大专有没有学位证书 有高中毕业证,但没有参加高考,可以读大专学校吗?2023-03-11
- 日文翻译简历模板 日语翻译个人简历表格精选版.docx 6页2023-03-11
- 翻译以什么为模板链 Obsidian超链接语法详述2023-03-11
- 皇家艺术学院学位证书翻译模板 西安翻译学院毕业证样本毕业证编号2023-03-11


