如下图所示为偏转摆正后的图像,截取“PROD”固定字符创建NCC模板 ;NCC 算法= normalized cross correlation,归一化互相关匹配法
* 图像增强
scale_image (ImageReduced, ImageScaled, 2.74194, -129)
threshold (ImageScaled, Regions, 179, 255)
erosion_circle (Regions, RegionErosion1, 2)
shape_trans (RegionErosion1, RegionTrans1, 'rectangle2')
area_center (RegionTrans1, Area, Row, Column)
orientation_region (RegionTrans1, Phi)
* 摆正文字区域
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
affine_trans_image (ImageReduced, ImageAffineTrans, HomMat2D, 'constant', 'false')
stop()
*创建NCC模板
AngleStart :=rad(0)
AngleExtent := rad(360)
* 创建固定字符模板PROD
gen_rectangle1 (ROIPROD, 799.583, 230.216, 836.25, 313.578)
reduce_domain (ImageAffineTrans, ROIPROD, ImageReducedProd)
create_ncc_model (ImageReducedProd, 'auto', AngleStart, AngleExtent, 'auto', 'use_polarity', ModelProdID)
write_ncc_model (ModelProdID, 'model_prod.ncm')
stop()
此处创建模板时设定的角度为0~360,参考Halcon的帮助文档描述如下:
AngleStart (input_control) angle.rad → (real)
Smallest rotation of the pattern.
Default value: -0.39
Suggested values: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0
AngleExtent (input_control) angle.rad → (real)
Extent of the rotation angles.
Default value: 0.79
Suggested values: 6.29, 3.14, 1.57, 0.79, 0.39
Restriction: AngleExtent >= 0
AngleStart :=rad(0)
AngleExtent := rad(360)
* 裁剪图像,匹配模板
find_ncc_model (ImageReduced, ModelProdID, AngleStart, AngleExtent, 0.8, 1, 0.5, 'true', 0, Row1, Column1, Angle, Score)
arc:=deg(Angle)
stop()
由上2附图所示:可得出结论模板按逆时针方向匹配原图,所旋转的角度即为Angle输出参数的值;
注意网上有人提出过类似问题:在定义模板create_ncc_model时 角度如果为0~360,小于1度的时候halcon会返回负值,
在大于1度的时候根据你设定的0-360的范围,返回的是正角度。
本人实际测试未发现返回负值情况:
另外注意find_ncc_model 中minScore 参数的设置,设置过高可能导致模板匹配不到的情况。
补充:
smallest_rectangle2 (RegionUnion, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
中的Phi 为-Pi/2 到 Pi/2 相比 下面的Phi 范围-Pi 到Pi 更优。
shape_trans (RegionErosion1, RegionTrans1, 'rectangle2')
orientation_region (RegionTrans1, Phi)