本示在前面几个halcon ROI示例的基础上继续扩展,更靠进实标情况。为了使ROI匹配更灵活,就要求可以让用户或工程根据实际使用情况自己去画ROI,想画几个是几个。数量不能在代码里写死。
这次升级的主要是增加了一个while循环根据用户的鼠标按键来进行判断是否继续画,还是退出画ROI。
效果
代码
dev_set_color ('red') dev_set_draw ('margin') *获取窗口句柄对象 dev_get_window (WindowHandle) *读取图片 read_image (Image, 'E:/stevenChen/机器视觉学习/HDevelop/视觉图片/ROI/1.bmp') *生成一个空区域 gen_empty_region (ROIRegion) dev_disp_text ('开始绘制ROI区域', 'window', 'top', 'left', 'green', [], []) *选取ROI mbutton := 1 while(mbutton == 1) *画矩形 *参数说明 *WindowHandle (输入参数)窗口句柄 *Row, Column (输出参数)矩形的中心坐标 draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2) *生成矩形 *根据上面算子的输出参数生成一个矩形 *Rectangle 输出参数,生成的矩形 *Row1, Column1 (输入参数)矩形的左上角坐标 *Row2, Column2 (输入参数)矩形的右上角坐标 gen_rectangle2 (Rectangle2, Row, Column, Phi, Length1, Length2) *连接两个对象,ObjectsConcat = [Objects1,Objects2] *参数列表: *第1个参数Objects1是输入对象,即对象1 *第2个参数Objects2是输入变量,即对象2 *第3个参数ObjectsConcat是输出变量,即连接后的区域 concat_obj (ROIRegion, Rectangle2, ROIRegion) *获取鼠标按键,按下鼠标左键 继续绘制,按下鼠标右键结束绘制 get_mbutton (WindowHandle, Row1, Column1, mbutton) endwhile *把所有的输入区域合并为一个区域 *功能:函数将Region元组内的全部区域合并成一个独立的区域,保存于RegionUnion *参数: *Region (input_object) ——要计算其并集的区域,也就是一个个的输入区域 *RegionUnion (output_object) ——所有输出区域的并集 *要素数: RegionUnion <= Region union1 (ROIRegion, RegionUnion) *锁定ROI并创建模板 *单ROI *获得特定区域Region位置的图像,获取区域图像 *Image (输入参数)输入的图像 *Rectangle 输入参数)输入的区域,上面画的矩形区域 *ImageReduced (输出参数)输出的图像,是Image中Rectangle的那部分图像 reduce_domain (Image, RegionUnion, ImageReduced) *用于创建形状模板 *形状模板是一种用于检测和匹配特定形状的工具,常用于目标识别、物体定位和测量等应用中。 *参数说明: *ObjectModel:包含待创建模板的形状的二值图像。 *NumLevels:金字塔层数,用于多尺度匹配。可设为“auto”或0—10的整数 *AngleStart:起始角度(以度为单位),用于模板的旋转范围。rad(-180) *AngleExtent:旋转角度的范围(以度为单位)。rad(-180), rad(180)表示360度匹配 *AngleStep:旋转角度的步长,可以是’auto’或具体的值。 *ScaleMin:最小缩放比例。 *ScaleMax:最大缩放比例。 *ScaleStep:缩放比例的步长。 *Optimization:优化模式,用于加速模板匹配。 *Metric:模板匹配的度量方式。 *Contrast:对比度增强系数。 *MinContrast:最小对比度阈值。 *ModelID:输出的模板ID。 *https://blog.csdn.net/xiaogongzhu001/article/details/131120014 *1.NumLevels(金字塔的层数),金字塔的层数越大,找到匹配使用的时间就越小。(金字塔的层数越大,提取到的特征越少,精准度越低,所以对应的识别时间少) *如果金字塔的层数设置的太大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些。 *参数解析及优化 https://blog.csdn.net/the_future_way/article/details/115345989 *create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) create_shape_model (ImageReduced, 'auto', rad(-180), rad(180), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) *-----模板创建结束---------------------------------- *-----开始测试---------------------------------------------- *4.加载测试图像 read_image (Image1, 'E:/stevenChen/机器视觉学习/HDevelop/视觉图片/ROI/120.bmp') *5.使用已有模板句柄来匹配 *形状模板匹配 *形状匹配原理:模板创建后,会根据模板中的边缘等关系去图像中进行搜索,可以理解成提取模板中的灰度发生变化的那些点, *然后再去图像中匹配,这样的效果是对干扰比较稳定,匹配速度快,并且即使边缘发生部分遮挡,匹配效果依旧较好 *参数说明 *参数1:输入图像--单通道图像 *参数2:模板句柄 *参数3:搜索时的起始角度 rad(-180), rad(180) 正好是一圈 *参数4:搜索时的终止角度,必须与创建模板时的有交集 *参数5:被找到的模板最小分数--大于等于这个值才能被匹配 * 默认值:0.5 建议值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 * 典型值范围:0≤MinScore ≤ 1 * 最小增量:0.01 建议增量:0.05 *参数6:要找到的模板最大实例数 *参数7:要找到的模型实例的最大重叠 * 默认值:0.5 建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 * 典型值范围:0≤ MaxOverlap≤ 1 最小增量:0.01 建议增量:0.05 *参数8:计算精度的设置 * 'none', 'interpolation', 'least_squares', 'least_squares_high', 'least_squares_very_high' * 'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4' * 'max_deformation 5', 'max_deformation 6' *参数9:搜索时金字塔的层级 *参数10:贪婪度,搜索启发式,一般都设为0.8,越高速度快,容易出现找不到的情况 * 0≤ Greediness ≤ 1 *最后4个:输出匹配位置的行和列坐标、角度、得分 【中心坐标】 *https://blog.51cto.com/liming19680104/5152387 *find_shape_model (Image1, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) find_shape_model (Image1, ModelID, rad(-180), rad(180), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) *6.把匹配轮廓显示到图像中 *ModelContours 输出参数,匹配到的模块轮廓, *ModelID 输入参数,模板ID, *Level 金字塔层数 get_shape_model_contours(ModelContours, ModelID, 1) *从点和角度计算刚性仿射变换 *参数: *Row1 (输入参数) ——原始点的行坐标 *Column1 (输入参数) ——原始点的列坐标 *Angle1 (输入参数) ——原始点的角度 *Row2 (输入参数) ——转换点的行坐标 *Column2 (输入参数) ——转换点的列坐标 *Angle2 (输入参数) ——转换点的角度 *HomMat2D (输出参数) ——输出转换矩阵 *原文链接:https://blog.csdn.net/m0_51271525/article/details/121017373 vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D) *仿射变换轮廓 *对XLD轮廓进行任意仿射2D变换 *将任意仿射2D变换,即缩放、旋转、平移和倾斜(倾斜)应用于轮廓中给定的xld轮廓,并以ContoursAffineTrans的形式返回变换后的轮廓 *参数: *Contours (输入参数) ——输入XLD轮廓。 *ContoursAffineTrans (输出参数) ——转换后的XLD轮廓 *HomMat2D (输入参数) ——输入转换矩阵 affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D) *显示结果 dev_display (Image) dev_set_color ('green') dev_display (ContoursAffineTrans) *释放模板句柄 clear_shape_model (ModelID)
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cjh16606260986/article/details/136478558