halcon 模板匹配
学习模板匹配,拿自己的U盘做了个小demo:
read_image (Image,'G:/halcon练习用/center.jpg')dev_close_window()dev_open_window_fit_image(Image,0,0,-1,-1,WindowHandle)dev_update_off()dev_display(Image)* gen_rectangle1(Rectangle, 1300, 2000, 1400, 2300)* reduce_domain(GrayImage,Rectangle,ImageReduced0)
* dev_clear_window()
* dev_display(ImageReduced0)rgb1_to_gray(Image,GrayImage)dev_display(GrayImage)
* threshold(Image,Regions,100, 255)threshold(Image,Regions,0, 25)connection(Regions,ConnectedRegions)count_obj(ConnectedRegions, num)select_shape (Regions, LargestRegion, 'area', 'and', 100000, 9999999)fill_up(LargestRegion, RegionFillUp)
* dev_display(RegionFillUp)connection(RegionFillUp,ConnectedRegions2)count_obj(ConnectedRegions2, num)select_shape (ConnectedRegions2, LargestRegion2, 'area', 'and', 100000, 9999999)*膨胀
dilation_circle(LargestRegion2, RegionDilation, 8)
count_obj (RegionDilation, NumberRegions)
* gen_rectangle1(Rectangle, 1300, 2000, 2900, 2300)reduce_domain(GrayImage,RegionDilation,ImageReduced)*计算模板区域中心坐标
area_center (ImageReduced, Area_model, Row_model, Column_model)
*规定模板ROI_region的可变角度范围0-360,旋转角度变化为0
create_shape_model(ImageReduced,'auto',rad(0), rad(360),rad(0),['none','no_pregeneration'],'ignore_global_polarity','auto','auto',ModleID)
*将创建的模板存成指定路径的文件
write_shape_model (ModleID, 'G:/halcon练习用/u盘识别.shm')
*获取图像类型
get_image_type (ImageReduced, Type)
if (Type == 'byte')dev_display (ImageReduced) // 如果是有效图像,显示它
elsedev_error_var (Error, 1)
endifstop ()name:=['center','left','right']for i:=0 to |name|-1 by 1read_image (ImageSample,'G:/halcon练习用/'+name[i]+'.jpg')dev_display(ImageSample)find_shape_model (ImageSample, ModleID, rad(0), rad(360), 0.1, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
* Image_Row:=[Image_Row,Row]
* Image_Column:=[Image_Column,Column]
* Image_Angle:=[Image_Angle,Angle]
* Image_Score:=[Image_Score,Score]*对匹配到的中心与模板的中心求取映射关系:仿射变换 vector_angle_to_rigid(Row_model,Column_model,rad(0),Row,Column,Angle,HomMat2D)*根据映射关系求出模板对应的图像范围affine_trans_region(ImageReduced,RegionAffineTrans,HomMat2D,'nearest_neighbor')gen_contour_region_xld (RegionAffineTrans, XLD1, 'border')dev_clear_window()dev_display (XLD1)*将检测到的区域(RegionAffineTrans)保存为图片reduce_domain(ImageSample,RegionAffineTrans,ResultReduced) dev_display(ResultReduced)
endfor
图像:
很简单甚至还有点错误,但是大致思路和最后仿射变换是常用方法;