本帖最后由 popdes 于 2018-1-30 17:28 编辑
第四版:
利用查找边缘 , 滤波之后按照行坐标排序,提取第一个边缘线, 画出这个边缘线的最小外接圆, 获取到外接圆的圆心坐标 即为 下一个跳板的中心坐标. 小人坐标继续利用上面的方法实现. 存在的问题: 可能边缘方法用的不好, 外接圆有时候圆心会靠边缘. 估计实际测试中有可能会跳出跳板导致摔死...... 抛砖引玉吧, 这个边缘未进行优化和处理, 主要是刚刚接触halcon , 希望有人能购优化以下, 跳的更准点.......
工程下载:
跳一跳.zip
(948.16 KB, 下载次数: 17)
- dev_close_window ()
- for Index := 1 to 13 by 1
-
- dev_set_draw ('margin')
- read_image (Image, 'C:/Users/RD-W/Desktop/跳一跳/tt' + Index)
- read_image(BGImage1, 'C:/Users/RD-W/Desktop/跳一跳/bg.png')
- dev_open_window_fit_image (BGImage1, 0, 0, -1, -1, WindowHandle)
-
- rgb1_to_gray(BGImage1, BGGrayImage)
- rgb1_to_gray(Image, ImageGray)
-
- *找小人坐标
- scale_image (ImageGray, xiaorenImageScaled, 7.72727, -394)
- *缩放亮度
- threshold (xiaorenImageScaled, xiaorenRegions, 0, 253)
- *腐蚀
- erosion_circle (xiaorenRegions, xiaorenRegionErosion, 15)
- dev_set_color ('green')
- *填充
- fill_up (xiaorenRegionErosion, xiaorenRegionFillUp)
- *获取小人双脚中心
- area_center (xiaorenRegionFillUp, xiaorenArea, xiaorenRow1, xiaorenColumn1)
- dev_set_color ('magenta')
- dev_set_line_width (3)
- *画十字坐标位
- gen_cross_contour_xld (xiaorenCross, xiaorenRow1, xiaorenColumn1, 50, 0.785398)
-
- *stop()
- dev_set_color ('green')
- *找最上方跳板坐标
- *设置ROI区域
- gen_rectangle1 (Rectangle, 236, 0, 1334, 750)
- *截图,只留下感兴趣区域
- reduce_domain (ImageGray, Rectangle, ImageReduced)
- reduce_domain (BGGrayImage, Rectangle, BGImageReduced)
- *前景图减去背景图,并翻倍结果值,使对比更强烈
- abs_diff_image (ImageReduced, BGImageReduced, ImageAbsDiff, 7)
- dev_set_line_width (3)
- *边缘查找
- edges_sub_pix (ImageAbsDiff, Edges, 'mshen', 1, 40, 60)
- *将临近边缘合并
- union_adjacent_contours_xld (Edges, UnionContours1, 35, 2, 'attr_keep')
- * union_collinear_contours_xld (Edges, UnionContours, 30, 10, 200, 0.7, 'attr_keep')
- *排序边缘线,按照行坐标大小顺序
- sort_contours_xld (UnionContours1, SortedContours, 'upper_left', 'true', 'row')
- *选择第一个边缘线
- select_obj (SortedContours, ObjectSelected1, 1)
- *多边形填充这个边缘线
- gen_region_contour_xld (ObjectSelected1, Region, 'filled')
- * smallest_rectangle2_xld (ObjectSelected1, Row1, Column1, Phi, Length1, Length2)
- * gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi, Length1, Length2)
- *改变填充好的边缘图形外形为外接圆
- shape_trans (Region, RegionTrans, 'outer_circle')
- dev_set_color ('green')
- *查找外接圆圆心坐标
- area_center (RegionTrans, Area, Row, Column)
-
- dev_set_color ('magenta')
- dev_set_line_width (3)
- *画十字线
- gen_cross_contour_xld (Cross, Row, Column, 50, 0.785398)
-
- * threshold (ImageAbsDiff, Regions, 238, 255)
- * erosion_circle (Regions, RegionErosion, 5)
- * erosion_rectangle1 (RegionErosion, RegionErosion1, 11, 11)
- * connection (RegionErosion1, ConnectedRegions)
- * select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 9862.39, 50000)
- * count_obj (SelectedRegions, Number)
- * for Index := 1 to Number by 1
- * select_obj (SelectedRegions, ObjectSelected, Index)
- * area_center (ObjectSelected, Area, Row, Column)
- * dev_set_color ('green')
- * dev_set_line_width (3)
- * gen_cross_contour_xld (Cross, Row, Column, 50, 0.785398)
- * endfor
- *测量小人中心点和跳板中心点距离
- distance_pp (xiaorenRow1, xiaorenColumn1, Row, Column, Distance)
-
- *disp_message (WindowHandle, Distance, 'window', 310, 87, 'white', 'true')
- *显示在窗体上
- *dev_disp_text (Distance, 'window', 260, 263, 'white', [], [])
- *把小人中心点和跳板中心点画线
- gen_region_line (RegionLines, xiaorenRow1, xiaorenColumn1, Row, Column)
- stop()
-
- endfor
复制代码 话说,隔壁论坛回复人蛮多的,就是发个帖老出问题, 这边回复的虽少, 但是发帖啥的挺好...
|