要求
- 自动创建模板
- 叶子和果实 重心通过仿射变换显示在logo上
- 计算叶子与果实重心连线基于模板重心的连线的角度
示例图片
示例、基准图片:
待检测图一:
待检测图二:
待检测图三:
待检测图四:
运行结果
各待检测图片与示例图片的角度偏移:
1.图一
2.图二
3.图三
4.图四
halcon代码
read_image (Image, 'F:/halcon/myfile/苹果logo/基准.jpg')
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
dev_open_window (0, 0, Width/3, Height/3, 'black', WindowHandle)
dev_set_part (0, 0, Height, Width)
*提取出logo的主体边缘
threshold (GrayImage, Region, 250, 255)
connection (Region, ConnectedRegions)
area_center (ConnectedRegions, Area, Row, Column)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 40000, 999999)
closing_circle (SelectedRegions, RegionClosing, 5)
gen_contour_region_xld (RegionClosing, Contours, 'border')
*根据边缘信息创建可缩放的形状模板
create_scaled_shape_model_xld(Contours, 'auto',rad(-180), rad(360), 'auto', 0.9, 1.1, 'auto', 'auto', 'ignore_local_polarity', 5, ModelID)
*在模板图中再次寻找模板对应的图像
find_scaled_shape_model(Image, ModelID, rad(-180), rad(360), 0.9, 1.1, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)
*分别对两个区域获取中心并连线
area_center(SelectedRegions, Area, Row1, Column1)
gen_cross_contour_xld(Cross, Row1, Column1, 56, 0.785398)
gen_region_line(RegionLines, Row1[0], Column1[0], Row1[1], Column1[1])
set_display_font(WindowHandle,18,'mono','false','false')
*遍历文件夹下所有图片,根据模板寻找对应图像,并对两区域中心连线,计算与模板中连线的夹角
list_files ('F:/halcon/myfile/作业2/苹果logo', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image2, ImageFiles[Index])
*寻找模板对应图像
find_scaled_shape_model(Image2, ModelID, rad(-180), rad(360), 0.9, 1.1, 0.5, 1, 0.5, 'interpolation', 0, 0.9, Row2, Column2, Angle2, Scale, Score2)
if(|Row2|)
*计算从模板到目标图形的齐次变换矩阵
vector_angle_to_rigid(Row, Column, Angle, Row2, Column2, Angle2, HomMat2D)
*分别计算两个独立图形重心相对于模板的仿射变换坐标
affine_trans_pixel(HomMat2D, Row1[0], Column1[0], RowTrans0, ColTrans0)
affine_trans_pixel(HomMat2D, Row1[1], Column1[1], RowTrans1, ColTrans1)
gen_cross_contour_xld(Cross2, [RowTrans0,RowTrans1], [ColTrans0,ColTrans1], 56, 0.785398)
*对仿射变换后两点进行连线
gen_region_line(RegionLines1, RowTrans0, ColTrans0, RowTrans1, ColTrans1)
*计算连根线的夹角
angle_ll(Row1[0], Column1[0], Row1[1], Column1[1], RowTrans0, ColTrans0, RowTrans1, ColTrans1, Angle2)
dev_display_shape_matching_results(ModelID, 'red', Row2, Column2, Angle2, 1, 1, 0)
dev_set_color('green')
dev_display(RegionLines)
dev_set_color('red')
dev_display(RegionLines1)
disp_message (WindowHandle, '红色(找到的图形)与绿色(模板图形)的夹角:'+deg(Angle2)+'°', 'image', RowTrans1, ColTrans1+10, 'green', 'false')
else
disp_message (WindowHandle, '未找到模板对应图形', 'image', 10, 10, 'red', 'false')
endif
stop()
endfor
clear_shape_model(ModelID)