这里在一张大图的基础上进行两次截取转正,并将最后截取的小截图处理结果分别仿射回前面的截图和原图上,以下为处理代码。
1
dev_set_color (‘#00ffff80‘)
read_image (Image1, ‘1.png‘)
hom_mat2d_identity (HomMat2DIdentity)
*第一层
gen_rectangle1 (ROI_0, 60.3445, 104.379, 1968.53, 2357.43)
reduce_domain (Image1, ROI_0, ImageReduced0)
crop_domain (ImageReduced0, ImagePart0)
hom_mat2d_translate (HomMat2DIdentity, -60.3445, -104.379, HomMat2DTranslate)
dev_clear_window ()
dev_display (ImagePart0)
*第二层
gen_rectangle1 (ROI_1, 205.954, 18.8135, 1799.63, 2211.46)
reduce_domain (ImagePart0, ROI_1, ImageReduced1)
crop_domain (ImageReduced1, ImagePart1)
hom_mat2d_translate (HomMat2DTranslate,-205.954, -18.8135, HomMat2DTranslate2)
dev_clear_window ()
dev_display (ImagePart1)
* threshold (ImagePart1, RegionSecond, 128, 255)
* hom_mat2d_invert (HomMat2DTranslate2, HomMat2DInvert)
* affine_trans_region (RegionSecond, RegionAffineTrans1, HomMat2DInvert, ‘nearest_neighbor‘)
*第三层
gen_rectangle2 (ROI_2, 1142.62, 1067.04, rad(-1.27898), 766.416, 62.5084)
reduce_domain (ImagePart1, ROI_2, ImageReduced2)
hom_mat2d_rotate (HomMat2DTranslate2, rad(1.27898), 1142.62, 1067.04, HomMat2DRotate)
hom_mat2d_translate (HomMat2DRotate, 62.5084 - 1142.62, 766.416 - 1067.04, HomMat2DTranslate3)
*输出截图
threshold (ImageReduced2, Region, 0, 255)
hom_mat2d_rotate (HomMat2DIdentity, rad(1.27898), 1142.62, 1067.04, HomMat2DRotate1)
affine_trans_image (ImageReduced2, ImageAffineTrans, HomMat2DRotate1, ‘constant‘, ‘false‘)
affine_trans_region (Region, RegionAffineTrans, HomMat2DRotate1, ‘nearest_neighbor‘)
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReducedTarget)
crop_domain (ImageReducedTarget, ImagePartTarget)
threshold (ImagePartTarget, RegionTarget, 128, 255)
dev_clear_window ()
dev_display (ImagePartTarget)
dev_display (RegionTarget)
stop ()
*返回第一层
hom_mat2d_invert (HomMat2DTranslate3, HomMat2DInvertFirst)
affine_trans_region (RegionTarget, RegionAffFirst, HomMat2DInvertFirst, ‘nearest_neighbor‘)
dev_clear_window ()
dev_display (Image1)
dev_display (RegionAffFirst)
stop ()
*经测试,hom_mat2d_compose确实存在精度损失
* hom_mat2d_compose (HomMat2DInvertFirst, HomMat2DTranslate2, HomMat2DCompose)
* affine_trans_region (RegionTarget, RegionAffSecond, HomMat2DCompose, ‘nearest_neighbor‘)
affine_trans_region (RegionAffFirst, RegionAffSecond, HomMat2DTranslate2, ‘nearest_neighbor‘)
dev_clear_window ()
dev_display (ImagePart1)
dev_display (RegionAffSecond)
stop ()
第一层截图
第二层截图并转正(在第一层截图的基础上截取)
最后小截图处理结果
返回原图
返回第一次截图
其实就是在每一次截图的时候计算截取过程中产生的矩阵,即一个旋转和平移,如果截取的是一个Rectangle1正矩形,那么就只有平移,这个平移量其实就是Rectangle1左上角的的行列坐标,很容易计算。
对于Rectangle2,平移和转正前他的角度和中心坐标是已知的,平移后他的中心行坐标为Length2,中心列坐标为Length1,角度为0,那么通过这6个值就可以计算得到矩阵。
得到的矩阵是原图像空间到截图空间的仿射,最后在截图空间得到的处理结果还需返回到想要的图像空间上,那么只要得到这个逆矩阵即可,根据每次截图产生的矩阵,可以直接通过Halcon中现有的求逆矩阵
算子得到逆矩阵,便可将处理结果返回原图。