一、读入一张图片
二、故意设置偏心的ROI(模板)区域,由左上角轮廓图可知,创建时是将ROI区域的中心移动至原点,此时圆心处为
*此时圆心为形状模板的质心位置,而非区域模板的中心位置
area_center_xld (ModelContours, Area, Row1, Column1, PointOrder)
gen_circle (Circle1, Row1, Column1, 3)
dev_display (Circle1)
三、将创建的模板移动至模板创建位置处显示(原点处轮廓可以消除,此处没消去),同时也可以获取创建模板时工件位置坐标
四、令读一张图,做模板匹配
用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 ()