halcon模板匹配结果row,column是否是质心坐标/将形状模板在模板创建位置显示/获取创建模板时工件位置坐标/将匹配的模板二维变换到实际位置/

一、读入一张图片
在这里插入图片描述
二、故意设置偏心的ROI(模板)区域,由左上角轮廓图可知,创建时是将ROI区域的中心移动至原点,此时圆心处为

*此时圆心为形状模板的质心位置,而非区域模板的中心位置
area_center_xld (ModelContours, Area, Row1, Column1, PointOrder)
gen_circle (Circle1, Row1, Column1, 3)
dev_display (Circle1)

area_center_xld

三、将创建的模板移动至模板创建位置处显示(原点处轮廓可以消除,此处没消去),同时也可以获取创建模板时工件位置坐标
在这里插入图片描述
四、令读一张图,做模板匹配
在这里插入图片描述
用find_scaled_shape_model得出的Row, Column处画圆并显示,很明显,此处不是质心,而是模板ROI匹配处的中心位置
在这里插入图片描述
5、二维矩阵变换,将模板轮廓在匹配处显示,并将转换后轮廓圆心显示(也可以说得此时形状模板质心坐标)
在这里插入图片描述
由此,各处各心得位置也就明了。

完整代码

dev_close_window ()

*read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_.bmp')
*read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_01.bmp')
read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_3.bmp')

get_image_size (Image, Width, Height)
dev_open_window (0, 0,  Width, Height, 'black', WindowHandle)

dev_set_line_width (3)
dev_set_part (0, 0, Height-1, Width-1 )
dev_set_color ('blue')
dev_display(Image)


draw_rectangle2 (WindowHandle, Row, Column, Phi1, Length1, Length2)
gen_rectangle2 (ModelRegion, Row, Column, Phi1, Length1, Length2)
*draw_circle (WindowHandle, Row, Column, Radius)
*gen_circle (ModelRegion, Row, Column, Radius)
reduce_domain (Image, ModelRegion, TemplateImage)
*创建模板时,是将roi区域的中心点移动至像素坐标系(0,0),而不是形状模板的质心移动至原点
create_shape_model (TemplateImage, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelId)
*ModelId为包含形状模板的区域模板,但当提取轮廓时,只会获得形状模板的轮廓(因为区域模板只有形状模板的轮廓)
get_shape_model_contours (ModelContours, ModelId,1)
dev_set_color ('red')
dev_display (ModelContours)

*此时圆心为形状模板的质心位置,而非区域模板的中心位置
area_center_xld (ModelContours, Area, Row1, Column1, PointOrder)
gen_circle (Circle1, Row1, Column1, 3)
dev_display (Circle1)
stop ()

*创建二维平移矩阵,将形状模板移动到创建模板处显示
hom_mat2d_identity (HomMat2DI)
hom_mat2d_translate (HomMat2DI, Row, Column, HomMat2DT)
affine_trans_contour_xld (ModelContours, ModelContAffTrans, HomMat2DT)
dev_display (ModelContAffTrans)
area_center_xld (ModelContAffTrans, Area, RowT, ColumnT, PointOrder)
gen_circle (CircleT, RowT, ColumnT, 3)
dev_display (CircleT)

stop ()
*——————————————————————————模板匹配————————————————————
*read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_3.bmp')
read_image (Image, 'C:/Users/连山人/Desktop/图/模板创建实验/Image_20.bmp')
*在scale中查找匹配图形
find_scaled_shape_model (Image, ModelId, 0, 360, 0.9, 1.1, 0.6, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Anglerad, Scale, Score)
*此时圆心为ROI区域(区域模板)匹配位置的中心(转换过角度),非匹配后形状模板轮廓质心
gen_circle (Circle, Row, Column, 3)
dev_display (Circle)

*——-——转换形状模板轮廓至匹配位置显示————————

*ModelId为包含形状模板的区域模板,但当提取轮廓时,只会获得形状模板的轮廓(因为区域模板只有形状模板的轮廓)
get_shape_model_contours (ModelContours, ModelId,1)

    hom_mat2d_identity (HomMat2)
    *将缩放添加到齐次二维转换矩阵中,以0,0为基点,进行扩大
    hom_mat2d_scale (HomMat2, Scale, Scale, 0, 0, HomMat2)
    *将旋转添加到齐次二维转换矩阵中,绕点0,0旋转
    hom_mat2d_rotate (HomMat2, Anglerad, 0, 0, HomMat2)
    hom_mat2d_translate (HomMat2, Row, Column, HomMat2)
    *区域根据齐次二维转换矩阵中的参数要求进行仿射变换,坐标根据括号中参数来设置
    affine_trans_contour_xld (ModelContours, TransContours, HomMat2)
    dev_display (TransContours)

*转换后为形状模板轮廓实际匹配质心处
area_center_xld (TransContours, Area, Row2, Column2, PointOrder)
gen_circle (Circle2,  Row2, Column2, 3)
dev_display (Circle2)

stop ()
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要在Halcon中将模板轮廓显示在图像上,可以使用dev_display_contour函数。该函数用于将指定的轮廓显示在输出窗口中,例如在Halcon的图形窗口或HALCON Visual Studio Code中的调试窗口中。 以下是一个简单的示例代码,可以将模板轮廓显示在图像上: ``` dev_display (Image) // 显示图像 dev_display_contour (TemplateContours, 'blue', 'none') // 显示轮廓,颜色为蓝色,无填充 ``` 其中,Image是输入的图像,TemplateContours是模板的轮廓,'blue'指定了轮廓的颜色为蓝色,'none'指定轮廓不需要填充。 如果要在图像中同显示多个轮廓,可以在dev_display_contour函数中传入多个轮廓。例如: ``` dev_display_contour ([TemplateContours1, TemplateContours2], 'blue', 'none') ``` 这将同显示TemplateContours1和TemplateContours2的轮廓,颜色为蓝色,无填充。 ### 回答2: Halcon是一种强大的机器视觉软件,它提供了丰富的图像处理和分析工具。在Halcon中,要将模板轮廓显示到图像上,可以通过以下步骤实现: 1. 首先,加载图像。使用Halcon的“read_image”函数加载一张图像。例如,可以使用以下代码加载名为“image.jpg”的图像: read_image(Image, 'image.jpg') 2. 接下来,定义并创建一个图层。使用Halcon的“create_ianotate_calib”函数创建一个图层,并将其与图像关联起来。例如,可以使用以下代码创建一个名为“Annotation”和图像分辨率相同的图层: create_iannotate_calib(Image, Annotation, '1', 1) 3. 然后,将模板轮廓添加到图层中。使用Halcon的“disp_image”函数显示图像,并使用“set_color”函数设置轮廓颜色。接下来,使用“disp_region”函数将模板的轮廓添加到图层中。例如,可以使用以下代码将名为“Template”中的轮廓添加到“Annotation”图层中,并设置颜色为红色: disp_image(Image, Annotation) set_color(Annotation, 'red') disp_region(Template, Annotation) 4. 最后,显示图像和模板轮廓。使用Halcon的“get_display_obj”函数将图层中的内容显示到屏幕上。例如,可以使用以下代码显示图像和模板轮廓: get_display_obj(Annotation, WinHandle) set_part(Template) set_display_obj_props('visible', 'true') sdl_display_obj(WinHandle, Annotation) 通过以上步骤,我们可以将模板轮廓显示到图像上。请注意,上述代码仅为示例,实际使用可能需要根据应用程序的需求进行适当的修改。 ### 回答3: 要将Halcon模板轮廓显示在图像上,可以按照以下步骤进行操作: 1. 首先,使用Halcon的find_shape_model函数找到图像中的模板轮廓。这个函数会返回一个包含模板轮廓位置信息的数据结构。 2. 然后,使用Halcon的get_shape_model_contours函数从上一步中获得的数据结构中提取出模板轮廓。 3. 接下来,使用Halcon的gen_contour_polygon_xld函数将模板轮廓转换成多边形表示。 4. 为了在图像上显示模板轮廓,可以使用Halcon的disp_region函数将多边形轮廓显示为颜色填充的区域。 5. 最后,可以使用Halcon的disp_image函数将原始图像和带有模板轮廓的区域显示在同一幅图像上,以便进行直观观察和分析。 通过以上步骤,我们可以将Halcon模板轮廓显示在图像上,从而方便了视觉检测和定位任务的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值