前言
基于Halcon的指针识别
一、思路
首先从原图像中选择一块多边形区域,使之包围指针部分,将该区域分割出来,作为参考的形状模板;接着确定形状模板的金字塔层的级数和对比度参数;然后创建形状模板,并检查创建出的形状模板轮廓是否理想;最后,读取检查图像进行模板匹配,从图像上获取指针形状的位置坐标和旋转角度。
二、测试–结果
三、源码
*指针识别
*清空显示窗口
dev_close_window()
*读取模板图像。这里的模板图像是单通道灰度图像,如果是彩色的,还需要做一步转换
read_image(ModelImage, 'D:/USER/Desktop/design/dataset/meter1.jpg')
*获取图像的尺寸,便于创建合适的窗口进行显示
get_image_size(ModelImage, Width, Height)
*创建窗口并设置显示参数
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
dev_display (ModelImage)
dev_set_color ('red')
dev_set_line_width (5)
*设置指针区域的多边形形状坐标
Rows := [410,308,312,327,428,410]
Cols := [135,267,283,283,143,135 ]
*创建形状多边形,该多边形区域应完全的覆盖指针所在的区域。该区域即为感兴趣区域
gen_region_polygon_filled (ROI, Rows, Cols)
*创建参考图像,从原模板图像中裁剪出多边形形状区域
reduce_domain (ModelImage, ROI, ImageROI)
*检查形状模板参数,查看金字塔层级的图像
inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 2, 50)
*显示形状模板图像。以此检查形状模板区域是否理想
dev_display (ShapeModelRegions)
*创建形状模板
create_shape_model (ImageROI, 2, 0, rad(360270), 'auto', 'none', 'ignore_global_polarity', 20, 10,ModelID)
*获取形状模板的轮廓。用于匹配成功后的显示
get_shape_model_contours (ShapeModel, ModelID, 1)
*读取要检测的图像。这里的检测图像也是单通道灰度图像,如果是彩色的,还需要做一步转换
read_image(SearchImage, 'D:/USER/Desktop/design/dataset/meter2.jpg')
*进行基于形状模板的匹配,在图中寻找到指针的位置。
*返回指针的坐标,旋转角度,以及匹配分数
find_shape_model (SearchImage, ModelID, -rad(360900), rad(360270), 0.7, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
*如果匹配分数达到要求,则匹配成功
if (|Score| > 0.9)
*用于从匹配结果数据中创建一个刚体的仿射变换矩阵
vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck,MovementOfObject)
*将形状模板进行仿射变换,使之显示在指针的新位置上
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
*将匹配结果显示出来
dev_display (SearchImage)
dev_display (ModelAtNewPosition)
endif
*匹配结束,释放模板资源
clear_shape_model (ModelID)
总结
慢慢看吧~加油
|