模板图片:目标是获取图像左上角位置的数字
直接想法,直接用一个框将数字框出来,然后对图片进行模板匹配(不可行,因为图像中的数字不是固定的)
所以需要选择图像中的固定不变的区域来作为模板,然后根据模板区域来找到我们的目标区域,案例以左上角的商标名称作为模板区域
代码:案例图片在C:\Users\HJ\AppData\Roaming\MVTec\HALCON-21.05-Progress\examples\images\blister(根据自己安装halcon的位置来寻找)
*读取模板图片,了解目标需求:获取图片左上角的数字并识别出来 read_image (TemplateImage, 'C:/Users/HJ/Desktop/test_image/cd_cover/cd_cover_01.png') get_image_size (TemplateImage, Width, Height) dev_close_window () dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_display(TemplateImage) *第一想法肯定是:既然要找数字,直接模板匹配找数字就好了,但是模板匹配找的是与图像中与模板类似的区域,但数字明显会发生变化。 *所以需要找所有图像上固定不会变的区域来作为模板,并求出这个区域的中心,本例以左上角的商标名称作为模板区域 draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1(NumberRectangle, Row1, Column1, Row2, Column2) reduce_domain(TemplateImage, NumberRectangle, TemplateImageReduced) area_center(NumberRectangle, Area, CenterModelROIRow, CenterModelROIColumn) *选择完模板区域之后,我们的目标区域(数字)在模板区域的下面,所以再用一个框将目标区域框出来 *这样子就知道了目标区域与模板区域之间的关系,在后续进行模板匹配的时候,匹配到模板区域之后,就可以通过仿射变换将目标区域找出来 gen_rectangle1 (NumberROI, Row2, Column1, Row2 + 30, Column2) *创建一个shape模型,角度范围0-rad(360) create_shape_model(TemplateImageReduced, 'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) get_shape_model_contours(ShapeModel, ModelID, 1) ImageFiles := 'cd_cover/cd_cover_' for I := 1 to 4 by 1 read_image(SearchImage, ImageFiles + I$'.2d') find_shape_model (SearchImage, ModelID, 0, rad(360), 0.7, 1, 0.7, 'least_squares', 0, 1, RowMatch, ColumnMatch, AngleMatch, Score) if (|Score| > 0) *先对模板区域进行仿射变换,找到图片中的模板区域 vector_angle_to_rigid (0, 0, 0, RowMatch, ColumnMatch, AngleMatch, MovementOfModel) affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfModel) *做一个仿射变换,获取模板区域的仿射变换矩阵,因为模板匹配的结果默认是以(0,0)作为原点,所以需要映射到实际图片中的位置 vector_angle_to_rigid (CenterModelROIRow, CenterModelROIColumn, 0, RowMatch, ColumnMatch, AngleMatch, MovementOfObject) affine_trans_region(NumberROI, RegionAffineTrans, MovementOfObject, 'nearest_neighbor') *获取到目标区域之后,求目标区域(矩阵)的逆,然后将该逆矩阵和原图做矩阵运算,生成新的图像 hom_mat2d_invert(MovementOfObject, HomMat2DInvert) affine_trans_image(SearchImage, RectifiedSearchImage, HomMat2DInvert, 'constant', 'false') *生成的图像是旋转正了的,区域与模板图像的区域位置相同,所以就可以获取前出目标区域 reduce_domain(RectifiedSearchImage, NumberROI, RectifiedNumberROIImage) endif endfor clear_shape_model(ModelID)