Halcon图片标定,使得后续图片处理过后变成与模板图片一样
随便选择一张图片
对这张图片进行旋转矫正之后,图片就变成了一个模板图片。它的区域region位置如图所示:
当来了一张新的图片的时候,让它与region比较,与模板的位置有明显的偏差, 如图所示:
我们的目标就是让这张新的图片经过处理后与模板区域重合。如下图所示:
其实总体功能和旋转抠图差不多,只是使用的函数有一点差异。
代码总合:
代码所用的图片在:C:\Users\HJ\AppData\Roaming\MVTec\HALCON-21.05-Progress\examples\images\blister(根据自己安装halcon的位置来寻找)
*读取一张图进行处理,并以处理后的图为模板,让后续的图片都办成这张图的模样 read_image (Image, 'C:/Users/HJ/Desktop/test_image/blister/blister_01.png') threshold(Image, Region, 100, 255) connection(Region, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 9999999) shape_trans(SelectedRegions, RegionTrans, 'convex') *计算region的方向(角度),Phi是区域最远处点和x轴的夹角 orientation_region(RegionTrans, Phi) *获取区域的中心 area_center(RegionTrans, Area, Row, Column) if ((1.57<Phi and Phi<3.142) or (-3.142<Phi and Phi<-1.57)) vector_angle_to_rigid(Row, Column, Phi, Row, Column, 3.14159, HomMat2D) else vector_angle_to_rigid(Row, Column, Phi, Row, Column, 0, HomMat2D) endif *旋转图片和区域 affine_trans_image(Image, ImageAffineTrans, HomMat2D, 'constant', 'false') affine_trans_region(RegionTrans, RegionTrans, HomMat2D, 'nearest_neighbor') *计算旋转之后的区域的中心, 也就是模板区域的中心 area_center (RegionTrans, AreaRef, RowRef, ColumnRef) list_files ('C:/Users/HJ/Desktop/test_image/blister', ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) Width := 550 Height := 400 for Index := 0 to |ImageFiles| - 1 by 1 *数据前处理 read_image (Image2, ImageFiles[Index]) threshold(Image2, Region_Each, 100, 255) connection(Region_Each, ConnectedRegions_Each) select_shape(ConnectedRegions_Each, SelectedRegions_Each, 'area', 'and', 15000, 9999999) shape_trans(SelectedRegions_Each, RegionTrans_Each, 'convex') *计算当前区域的方向(角度) orientation_region(RegionTrans_Each, Phi_Each) *获取当前区域的中心 area_center(RegionTrans_Each, Area_Each, Row_Each, Column_Each) if ((1.57<Phi_Each and Phi_Each<3.142) or (-3.142<Phi_Each and Phi_Each<-1.57)) *利用当前区域的中心、角度 和 模板区域的中心和角度来进行计算, 生成一个仿射变换的矩阵 vector_angle_to_rigid(Row_Each, Column_Each, Phi_Each, RowRef, ColumnRef, 3.14159, HomMat2D1) else vector_angle_to_rigid(Row_Each, Column_Each, Phi_Each, RowRef, ColumnRef, 0, HomMat2D1) endif *根据仿射变换矩阵来对图片进行调整,变成和模板图片一样的 affine_trans_image(Image2, ImageAffineTrans_Each, HomMat2D1, 'constant', 'false') endfor