天天看点

仿射变换学习

affine_trans_(iamge,region,xld):仿射变换-作用到iamge,region、xld等都可以

vector_angle_to_rigid():得到一个刚性仿射变换矩阵

orientation_region():得到指定区域的弧度(与x轴正方向的弧度)

hom_mat2d_identity ():得到一个单位矩阵

hom_mat2d_translate ():得到一个平移变换矩阵

hom_mat2d_rotate ():得到一个旋转变换矩阵

hom_mat2d_scale ():得到一个缩放变换矩阵

* 得到充电头区域与x轴正方形的弧度

orientation_region (Regions, Phi)

* 得到充电头的面积和中心点坐标

area_center (Regions, Area, Row, Column)

* 得到一个刚性仿射的变换矩阵

vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)

* 根据旋转的变换矩阵进行仿射变换

affine_trans_region (Regions, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

* 得到一个单位矩阵

hom_mat2d_identity (HomMat2DIdentity)

* 得到一个平移的变换矩阵

hom_mat2d_translate (HomMat2DIdentity, 500, 500, HomMat2DTranslate)

* 得到一个平移加旋转的变换矩阵

hom_mat2d_rotate (HomMat2DTranslate, rad(-90), Column, Row, HomMat2DRotate)

* 得到一个平移、旋转、缩放的变换矩阵

hom_mat2d_scale (HomMat2DRotate, 0.5, 0.5, Column, Row, HomMat2DScale)

* 根据变换矩阵进行仿射变换

affine_trans_region (RegionAffineTrans, RegionAffineTrans1, HomMat2DScale, 'nearest_neighbor')

*对匹配到的中心与模板的中心求取映射关系:仿射变换 

    vector_angle_to_rigid(Row_model,Column_model,rad(0),Row,Column,Angle,HomMat2D)

    *根据映射关系求出模板对应的图像范围

    affine_trans_region(ROI_region,RegionAffineTrans,HomMat2D,'nearest_neighbor')

模板匹配

*读取并显示图像;

*确定模板ROI及检测ROI;

*创建模型;

*匹配模板;

*ROI仿射变换,得到ROI位置

dev_update_off()

dev_close_window ( )

*#读取整个文件夹的图像

*1 列出指定路径下的文件

list_files ('./Files', 'files', Files)

tuple_regexp_select (Files, '\\.jpg$', Files)

read_image (Image, Files[0])

dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

dev_display (Image)

*2 根据模板形状创建相应区域

read_image (T, './moban/moban_1.jpg')

get_image_size (T, Width, Height)

dev_set_color ('red')

*圆形

gen_circle (shape, 2093, 1630, 1773)

*矩形

*gen_rectangle1 (shape, 164.5, 126.5, 323, 476.5)

*多边形轮廓

*dev_set_color ('green')

*dev_set_line_width (3)

*坐标数组

*rows1:=[20,100,100,20,20]

*cols1:=[20,20,250,250,20]

*radius:=[20,20,20,20,20]

*rows2:=[20,20,100,100,20]

*cols2:=[320,550,550,320,320]

*带圆角的多边形轮廓

*gen_contour_polygon_rounded_xld (Contour, rows1, cols1, radius, 1)

*不带圆角的多边形轮廓

*gen_contour_polygon_xld (Contour1, rows2, cols2)

*生成十字形状

*gen_cross_contour_xld( : Cross : Row, Col, Size, Angle :)

*3 将模板从所在区域分离

* read_image (image, 'D:/0halcon/demo/20220425/2.jpg')*可以选择一个文件

*opening_circle (Image, RegionOpening, 3.5)

reduce_domain (Image, shape, ImageReduced)

*4 创建模板

*圆用create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'use_polarity', 30, 10, ModelID)

*算子原型:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

*–Template :用于创建模板的图像,是原图的模板ROI区域;

*–NumLevels:金字塔层的最大层数;

*–AngleStart:模板的最小旋转角度,以弧度为单位;

*–AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到

*–AngleStep:角度步长,以弧度为单位;

*–Optimization:生成模型的优化方法;

*–Metric:模板匹配的条件,在模板与图像亮暗发生反转时可使用;

*–Contrast:创建模型时,模型点的对比度;

*–MinContrast :在搜索的图像中,搜索对象的最小对比度,必须<Contrast;

*–ModelID:模型的句柄。

*5 设置原点

area_center (shape, Area, Row1, Column1)

set_shape_model_origin (ModelID, Row1, Column1)

*set_shape_model_origin (ModelID, -Row, -Column)

*6 获取初始模板轮廓

get_shape_model_contours (ModelContours, ModelID, 1)

dev_set_color ('red')

dev_set_draw ('margin')

dev_display (ModelContours)

*7 匹配模板 

for Index := 0 to |Files|-1 by 1

    read_image (Image, Files[Index])

    *7.1在另一幅图中查找对应区域  //进行模板匹配找模板

    *开运算

    *opening_rectangle1 (Image, RegionOpening, Width, Height)

    find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)

    *算子原型:find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, *NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)*

    *– Image :输入图像;

    *–ModelID:模型的句柄;

    *–AngleStart:模板的最小旋转角度,以弧度为单位;

    *–AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到

    *–MinScore:要搜索到的模型实例的最小得分,如果低于此分数,则搜索不到;

    *–NumMatches:要搜索到的模型实例的个数;

    *–MaxOverlap:要找到的模型实例的最大重叠;

    *–SubPixel:确定找到的目标是否使用亚像素精度提取;

    *–NumLevels:搜索过程中使用的金字塔级别的数量 ;

    *–Greediness :搜索启发式的“贪婪度”,(0:安全但缓慢;1:快,但可能匹配不到)

    *–Row:找到的模型实例的行坐标,坐标值是找到模板的原点在图像坐标系中的行坐标;

    *–Column:找到的模型实例的列坐标,坐标值是找到模板的原点在图像坐标系中的列坐标;

    *–Angle:找到的模型实例的角度;

    *–Score: 找到的模型实例的分数。

    *7.2坐标转行,得到模板的ROI和检测ROI,确定匹配位置的轮廓

    *7.2.1 先获取模板轮廓,获取轮廓在(0,0)位置;

    *7.2.2:求模板匹配实例---的旋转矩阵;    

    *7.2.3:利用仿射变换---得到匹配实例--轮廓;    

    *7.2.4:轮廓转成区域;

    if (Row3>=0) //如果找到模板数>0

        *显示找到的--模板轮廓

        dev_display_shape_matching_results (ModelID, 'red', Row3, Column3, Angle, 1, 1, 0)

        *循环遍历每个查到的实例

        for I := 0 to |Score| - 1 by 1

            vector_angle_to_rigid (Row3, Column3, Angle, Row3, Column3, Angle, HomMat2D1)

            *算子原型:vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

            *–Row1:原始点的行坐标;

            *–Column1:原始点的列坐标;

            *–Angle1:原始点的角度;

            *–Row2:变换点的行坐标;

            *–Column2:变换点的列坐标;

            *–Angle2:变换点的角度;

            *–HomMat2D:输出的变换矩阵。

            *给旋转矩阵添加缩放信息

            hom_mat2d_scale (HomMat2D1, 2, 2, Column3, Row3, HomMat2DScale)

            *通过初始模板和旋转矩阵运算---得到模板实例轮廓

            affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)

            *轮廓转区域

            gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')

            *得到匹配图像的轮廓线

            affine_trans_contour_xld (ContoursAffineTrans, ContoursAffineTrans1, HomMat2DScale)

            affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

        endfor

        *dev_set_color ('red')

        *dev_display (RegionAffineTrans)

     endif

endfor

**获取指定轮廓上点的像素坐标

*get_contour_xld (ContoursAffineTrans, Row1, Col)

dev_close_window ()

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

read_image (Car, 'D:/Camera/test/image/car3.jpg')

decompose3 (Car, R, G, B)

trans_from_rgb (R, G, B, H, S, V, 'hsv')

* emphasize (S, ImageEmphasize, 7, 7, 5)

invert_image (S, ImageInvert)

threshold (ImageInvert, Regions1, 0, 137)

fill_up (Regions1, RegionFillUp1)

connection (RegionFillUp1, ConnectedRegions2)

select_shape (ConnectedRegions2, SelectedRegions1, 'area', 'and', 14935.1, 74489.8)

shape_trans (SelectedRegions1, RegionTrans, 'convex')

area_center (RegionTrans, Area, Row, Column)

orientation_region (RegionTrans, Phi)

vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)

*  affine_trans_image (ImageReduced, ImageAffineTrans, HomMat2D, 'constant', 'false')

 affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

 affine_trans_image (Car, CarAffineTrans, HomMat2D, 'constant', 'false')

 reduce_domain (CarAffineTrans, RegionAffineTrans, ImageReduced)

 rgb1_to_gray (ImageReduced, GrayImage)

threshold (GrayImage, Regions, 62, 249)

connection (Regions, LetterRegions)

opening_rectangle1 (LetterRegions, RegionOpening, 4, 4)

select_shape (RegionOpening, SelectedRegions, ['area','height'], 'and', [343.12,62], [2000,88.257])

sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'column')

read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)

invert_image (CarAffineTrans, CarImageInvert)

do_ocr_multi_class_mlp (SortedRegions, CarImageInvert, OCRHandle, Class, Confidence)

disp_message (WindowHandle, Class, 'window', 12, 12, 'black', 'true')

继续阅读