halcon中一个基于形状匹配的例子

最近有项目做相关内容,边学便总结吧。


使用范围:定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑,主要是要求形状要比较好提取,边界特征明显。

例子中涉及到的相机标定的相关知识有空再补。。。。。

主要思想是:

创建模板和匹配模板

1.创建模板首先要纠正图像:在标定时就会有      生成一个投影映射,描述一个世界坐标系的像平面与a平面z=0之间的映射:gen_image_to_world_plane_map (Map, CamParam, Pose, 646, 482, 596, 448, PixelDist, 'bilinear') 就是将世界坐标系的z转化成0的操作。然后再用函数map_image (Image, Map, ImageRectified) 直接处理图像。

2.下面就是ROI的提取:gen_rectangle1 (Rectangle, 120, 220, 340, 450)
                                       area_center (Rectangle, Area, RowRef, ColumnRef)
                                      reduce_domain (ImageRectified, Rectangle, ImageReduced)

                                     这3个函数一起使用,得到ImageReduced这个ROI

3.而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理。这时候需要使用inspect_shape_model()这个函数获得这个模板的轮廓,用于后面的匹配,这个函数的参数要手动去调节,对于一些图像质量不太好的,比较麻烦。再将轮廓转化成xld 形式 gen_contours_skeleton_xld,下面继续select_contours_xld ()来进一步挑选轮廓,获得比较好的轮廓。

4.create_shape_model()创建模板来匹配,有许多参数其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;(这段话转载https://www.2cto.com/kf/201701/590746.html)

5.下面就是打开另外一幅图像进行匹配。

 map_image (Image, Map, ImageRectified)
 find_shape_model (ImageRectified, ModelID, 0, rad(360), 0.5, 0, 0.5, 'least_squares', 0, 0.8, Row, Column, Angle, Score)

利用 find_shape_model()去找模板。

6.找到之后,使用vector_angle_to_rigid()和affine_trans_contour_xld()。前一个是从点和角度计算刚性仿射变换,后面这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像(对XLD轮廓应用任意仿射2D变换)。

           get_contour_xld (ModelBorderTrans, Ys, Xs)
            X := Xs * PixelDist
            Y := Ys * PixelDist
            Z := gen_tuple_const(|X|,0.0)
            * Apply an arbitrary affine 3D transformation to points.
            affine_trans_point_3d (HomMat3D, X, Y, Z, Xc, Yc, Zc)
            *Project 3D points into (sub-)pixel image coordinates.
            project_3d_point (Xc, Yc, Zc, CamParam, R, C)
            *Generate an XLD contour from a polygon
            gen_contour_polygon_xld (ModelWorld, R, C)
            X := [Column[I] * PixelDist,Column[I] * PixelDist + cos(Angle[I]) / 100]
            Y := [Row[I] * PixelDist,Row[I] * PixelDist - sin(Angle[I]) / 100]
            Z := gen_tuple_const(|X|,0.0)
            affine_trans_point_3d (HomMat3D, X, Y, Z, Xc, Yc, Zc)
            project_3d_point (Xc, Yc, Zc, CamParam, R, C)
            dev_set_color ('green')
            dev_display (ModelWorld)
            dev_set_color ('orange')
            disp_arrow (MainWindowHandle, R[0], C[0], R[1], C[1], 2)

也可以继续求各自坐标系的下的轮廓的左边,可以用于工业上机器人。

 

 

你可能感兴趣的:(机器学习,halcon)