Halcon模板匹配算子find_shape_model里的参数Row, Column, Angle(单位:弧度)含义是什么?
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
先看官方文档怎么说
The position and rotation of the found instances of the model is returned in Row, Column, and Angle. Additionally, the score of each found instance is returned in Score. 找到的模型实例的位置和旋转以行,列和角度返回。 此外,每个找到的实例的分数都在Score中返回。 find_shape_model(Image : : //搜索图像 ModelID, //模板句柄 AngleStart, // 搜索时的起始角度 AngleExtent, //搜索时的角度范围,必须与创建模板时的有交集 MinScore, //最小匹配值,输出的匹配的得分Score 大于该值 NumMatches, //定义要输出的匹配的最大个数 MaxOverlap, //当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出 //如果MaxOverlap=0, 找到的目标区域不能存在重叠, 如果MaxOverla p=1,所有找到的目标区域都要返回。 SubPixel, //计算精度的设置,五种模式,多选2,3 NumLevels, //搜索时金字塔的层数 Greediness : //贪婪度,搜索启发式,一般都设为0.9,越高速度快,容易出现找不到的情况 //0安全慢;1块不稳定;其他就是介于中间值 Row,Column, Angle, Score) //输出匹配位置的行和列坐标、角度、得分。
再来做个小实验
画图举例说明,Row, Column, Angle到底指的是什么距离?
1、已知图1和图2。小实验需要从图1取出模板,然后在图2找到相同的物体。
2、从图1框选ROI,ROI的像素中心点是B,ROI就是模板。
3、使用find_shape_model算子,在图2找到了物品,算子返回了Row, Column, Angle三个参数。
4、如下图所示,A,B,C点三者的对应关系是求出来了。
A是图1左上角的起点;
B是ROI的像素中心点,也是图2的起点;
C是匹配到的物体像素中心点。
A与B之间的宽和高分别是(row1,col1)
B与C之间的宽和高分别是(row2,col2)
结论:
find_shape_model算子,其返回值Row, Column参数指的就是row2和col2。
最后来看看halcon源码的实现
*读图1 read_image (Image1, '1.jpg') *获取图像宽高 get_image_size (Image1, Width, Height) dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_display (Image1) *彩色转灰度图 count_channels (Image1, Channels) if (Channels == 3) rgb1_to_gray (Image1, Image1) *真彩色转灰度图 elseif (Channels == 4) decompose4 (Image1, ImageR, ImageG, ImageB, ImageA) compose3 (ImageR, ImageG, ImageB, MultiChannelImage) rgb1_to_gray (MultiChannelImage, Image1) endif *从图1选取ROI,建立模板 draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) area_center (Rectangle, Area, RowRef, ColumnRef) reduce_domain (Image1, Rectangle, ImageReduced) create_shape_model (ImageReduced, 'auto', 0, rad(180), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) get_shape_model_contours (ShapeModel, ModelID, 1) *读图2 read_image (Image2, '2.jpg') *模板匹配 find_shape_model (Image2, ModelID, 0, rad(180), 0.1, 1, 0.5, 'least_squares', 0, 0.7, Row, Column, Angle, Score) if (|Score| > 0) dev_set_color ('yellow') dev_clear_window() vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, MovementOfObject) affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject) dev_display (ImageNew1) dev_display (ModelAtNewPosition) endif
代码里使用了仿射变换:
1、Halcon二维仿射变换,严格按照平移-->旋转-->缩放的先后顺序实施;
2、一切以ROI模板的中心点(即鼠标选取的模板图像的像素中心,上文中描述的点B)为零点,。图2找到的任何物品,都是以ROI的中心点为基准的;
3、图2,ROI模板从B点出发,平移(Row,Column),达到C点,再旋转Angle,最后缩放(如果是find_scaled_shape_model算子)。如此就可以找到物品的准确位置。