开启左侧

微信跳一跳简单图像识别方法

[复制链接]
popdes 发表于 2018-1-28 13:16:49 | 显示全部楼层 |阅读模式
我想到的第一个方法: (缺陷是只能对图像颜色深度高的)
1516771966845495.png
  1. dev_set_draw ('margin')
  2. read_image (Image, 'C:/Users/6013_1.jpeg')
  3. stop ()
  4. rgb1_to_gray(Image, GrayImage)
  5. threshold (Image, Regions, 0, 135)
  6. opening_rectangle1 (Regions, RegionOpening, 15, 15)
  7.   
  8. connection(RegionOpening, ConnectedRegions)
  9. select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20045.9, 30137.6)
  10. opening_rectangle1 (SelectedRegions, RegionOpening1, 35, 35)
  11. count_obj (RegionOpening1, Number)
  12. for Index := 1 to Number by 1
  13.     select_obj (RegionOpening1, ObjectSelected, Index)
  14.     smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)
  15.     area_center (ObjectSelected, Area, Row1, Column1)
  16.     gen_circle (Circle, Row1, Column1, 5)
  17.     gen_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)
  18. endfor
复制代码
第二版改进了下按照区域连同 + 面积选择 来做. 基本实现了简单图形的功能
1516971606164095.png
  1. *dev_set_draw ('margin')
  2. read_image (Image, 'C:/Users/Administrator/Desktop/t1t/IMG_2330.PNG')
  3. stop ()
  4. rgb1_to_gray(Image, GrayImage)
  5. mean_image (GrayImage, ImageMean, 9, 9)
  6. regiongrowing (ImageMean, Regions, 3, 3, 1, 300)
  7. select_shape (Regions, SelectedRegions, 'area', 'and', 11592.2, 30018.2)
  8.   
  9. count_obj (SelectedRegions, Number)
  10. for Index := 1 to Number by 1
  11.     select_obj (SelectedRegions, ObjectSelected, Index)
  12.     area_center (ObjectSelected, Area, Row1, Column1)
  13.     gen_circle (Circle, Row1, Column1, 5)
  14. endfor
复制代码
嗯..如果遇到复杂的图像,还是差强人意. 所以我重新写了个专门找找小人的代码
  1. read_image (Image, 'C:/Users/Administrator/Desktop/t1t/IMG_2339.PNG')
  2. stop ()
  3. rgb1_to_gray(Image, GrayImage)
  4.   
  5. scale_image (GrayImage, ImageScaled1, 7.72727, -394)
  6. threshold (ImageScaled1, Regions, 0, 253)
  7. erosion_circle (Regions, RegionErosion, 15)
  8. fill_up (RegionErosion, RegionFillUp)
  9. area_center (RegionFillUp, Area, Row1, Column1)
  10. gen_circle (Circle, Row1, Column1, 5)
复制代码
再复杂的图像,例如下面的,矩形里有很多条纹,就不知道怎么处理好点了, 另外还有个 魔方 样式的..
IMG_2339.PNG

这两天想利用模板匹配来识别, 还在研究,不知道效果如何
Criss 发表于 2018-1-28 13:55:11 | 显示全部楼层
好像很厉害的样子哦!图像算法部分应该还好吧,找到每个屏幕对应的分辨率,对应的像素中心偏差和每个像素大概的时间大小就可以接近目标按压的时间了!图像部分主要要分割每个区域单独的最大的矩形或者圆形,然后需要定位小人所在的位置,模板定位可以搞定。
 楼主| popdes 发表于 2018-1-28 14:34:39 | 显示全部楼层
51Halcon 发表于 2018-1-28 13:55
好像很厉害的样子哦!图像算法部分应该还好吧,找到每个屏幕对应的分辨率,对应的像素中心偏差和每个像素大 ...

嗯, 新学hc , 模板匹配正在实验, 可能我模板物体选的太多了(其实是每种形状都弄成了个单独模板,汗) , 然后匹配的时候总是匹配到比实际更多,:L , 路漫漫,哈
 楼主| popdes 发表于 2018-1-30 17:20:34 | 显示全部楼层
本帖最后由 popdes 于 2018-1-30 17:28 编辑

第四版:
利用查找边缘 , 滤波之后按照行坐标排序,提取第一个边缘线, 画出这个边缘线的最小外接圆, 获取到外接圆的圆心坐标 即为 下一个跳板的中心坐标.
小人坐标继续利用上面的方法实现.
存在的问题: 可能边缘方法用的不好, 外接圆有时候圆心会靠边缘. 估计实际测试中有可能会跳出跳板导致摔死......
抛砖引玉吧, 这个边缘未进行优化和处理, 主要是刚刚接触halcon , 希望有人能购优化以下, 跳的更准点.......

工程下载: 跳一跳.zip (948.16 KB, 下载次数: 15)
1517302875632045.png 1517302889688834.png 1517302900967202.png 1517302915199036.png 1517302936339649.png

  1. dev_close_window ()
  2. for Index := 1 to 13 by 1
  3.      
  4.     dev_set_draw ('margin')
  5.     read_image (Image, 'C:/Users/RD-W/Desktop/跳一跳/tt' + Index)
  6.     read_image(BGImage1, 'C:/Users/RD-W/Desktop/跳一跳/bg.png')
  7.     dev_open_window_fit_image (BGImage1, 0, 0, -1, -1, WindowHandle)
  8.      
  9.     rgb1_to_gray(BGImage1, BGGrayImage)
  10.     rgb1_to_gray(Image, ImageGray)
  11.      
  12.     *找小人坐标
  13.     scale_image (ImageGray, xiaorenImageScaled, 7.72727, -394)
  14.     *缩放亮度
  15.     threshold (xiaorenImageScaled, xiaorenRegions, 0, 253)
  16.     *腐蚀
  17.     erosion_circle (xiaorenRegions, xiaorenRegionErosion, 15)
  18.     dev_set_color ('green')
  19.     *填充
  20.     fill_up (xiaorenRegionErosion, xiaorenRegionFillUp)
  21.     *获取小人双脚中心
  22.     area_center (xiaorenRegionFillUp, xiaorenArea, xiaorenRow1, xiaorenColumn1)
  23.     dev_set_color ('magenta')
  24.         dev_set_line_width (3)
  25.         *画十字坐标位
  26.     gen_cross_contour_xld (xiaorenCross, xiaorenRow1, xiaorenColumn1, 50, 0.785398)
  27.      
  28.     *stop()
  29.     dev_set_color ('green')
  30.     *找最上方跳板坐标
  31.     *设置ROI区域
  32.     gen_rectangle1 (Rectangle, 236, 0, 1334, 750)
  33.     *截图,只留下感兴趣区域
  34.     reduce_domain (ImageGray, Rectangle, ImageReduced)
  35.     reduce_domain (BGGrayImage, Rectangle, BGImageReduced)
  36.     *前景图减去背景图,并翻倍结果值,使对比更强烈
  37.     abs_diff_image (ImageReduced, BGImageReduced, ImageAbsDiff, 7)
  38.     dev_set_line_width (3)
  39.     *边缘查找
  40.     edges_sub_pix (ImageAbsDiff, Edges, 'mshen', 1, 40, 60)
  41.     *将临近边缘合并
  42.     union_adjacent_contours_xld (Edges, UnionContours1, 35, 2, 'attr_keep')
  43. *    union_collinear_contours_xld (Edges, UnionContours, 30, 10, 200, 0.7, 'attr_keep')
  44. *排序边缘线,按照行坐标大小顺序
  45.     sort_contours_xld (UnionContours1, SortedContours, 'upper_left', 'true', 'row')
  46.     *选择第一个边缘线
  47.     select_obj (SortedContours, ObjectSelected1, 1)
  48.     *多边形填充这个边缘线
  49.     gen_region_contour_xld (ObjectSelected1, Region, 'filled')
  50. *    smallest_rectangle2_xld (ObjectSelected1, Row1, Column1, Phi, Length1, Length2)
  51. *    gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi, Length1, Length2)
  52. *改变填充好的边缘图形外形为外接圆
  53.     shape_trans (Region, RegionTrans, 'outer_circle')
  54.         dev_set_color ('green')
  55.         *查找外接圆圆心坐标
  56.     area_center (RegionTrans, Area, Row, Column)
  57.      
  58.         dev_set_color ('magenta')
  59.         dev_set_line_width (3)
  60.         *画十字线
  61.         gen_cross_contour_xld (Cross, Row, Column, 50, 0.785398)

  62. *     threshold (ImageAbsDiff, Regions, 238, 255)
  63. *     erosion_circle (Regions, RegionErosion, 5)
  64. *     erosion_rectangle1 (RegionErosion, RegionErosion1, 11, 11)
  65. *     connection (RegionErosion1, ConnectedRegions)
  66. *     select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 9862.39, 50000)
  67. *     count_obj (SelectedRegions, Number)
  68. *     for Index := 1 to Number by 1
  69. *         select_obj (SelectedRegions, ObjectSelected, Index)
  70. *         area_center (ObjectSelected, Area, Row, Column)
  71. *         dev_set_color ('green')
  72. *         dev_set_line_width (3)
  73. *         gen_cross_contour_xld (Cross, Row, Column, 50, 0.785398)
  74. *     endfor
  75.     *测量小人中心点和跳板中心点距离
  76.     distance_pp (xiaorenRow1, xiaorenColumn1, Row, Column, Distance)
  77.      
  78.     *disp_message (WindowHandle, Distance, 'window', 310, 87, 'white', 'true')
  79.     *显示在窗体上
  80.     *dev_disp_text (Distance, 'window', 260, 263, 'white', [], [])
  81.     *把小人中心点和跳板中心点画线
  82.     gen_region_line (RegionLines, xiaorenRow1, xiaorenColumn1, Row, Column)
  83.     stop()
  84.      
  85. endfor
复制代码
话说,隔壁论坛回复人蛮多的,就是发个帖老出问题, 这边回复的虽少, 但是发帖啥的挺好...

 楼主| popdes 发表于 2018-1-30 17:22:20 | 显示全部楼层
下面这张就是代码中的bg.png图片了.. 就是跳一跳的纯色背景

背景图

背景图

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表