因爱智能

halcon学习笔记(2)——clip例子学习(直方块图和特征直方块图)

例子在HDevelop自带例子里面,叫clip;这里讲我实验的内容,机械视觉目的:检测照片中图像,标记中心位置及其方向,代码如下:

[plain] view plain copy

  1. dev_update_window ('off')  
  2. read_image (Image, 'E:/test2.jpg')  
  3. get_image_size (Image, Width, Height)  
  4. dev_close_window ()  
  5. dev_open_window (0, 0, Width , Height, 'black', WindowID)  
  6. dev_display (Image)  
  7. set_display_font (WindowID, 14, 'mono', 'true', 'false')  
  8. disp_continue_message (WindowID, 'black', 'true')  
  9. stop ()  
  10. threshold (Image, Regions, 49, 95)  
  11. connection (Regions, Regions)  
  12. select_shape (Regions, SelectedRegions, 'area', 'and', 1380, 2242)  
  13. dev_set_draw ('fill')  
  14. dev_set_colored (12)  
  15. dev_display (SelectedRegions)  
  16. disp_continue_message (WindowID, 'black', 'true')  
  17. stop ()  
  18. dev_display (Image)  
  19. dev_set_color ('green')  
  20. dev_display (SelectedRegions)  
  21. orientation_region (SelectedRegions, Phi)  
  22. area_center (Regions, Area, Row, Column)  
  23. dev_set_line_width (3)  
  24. dev_set_draw ('margin')  
  25. Length := 80  
  26. for i := 0 to |Phi| - 1 by 1  
  27.     dev_set_color ('blue')  
  28.     disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)  
  29.     disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')  
  30. endfor  

         这是原始图,找了张白纸自己记号笔画的,然后用手机拍的照片。

         

        结果图像如上图。

        下面一步一步说代码:

dev_update_window ('off')

这句如字面意思,就关闭窗口图形的刷新


read_image (Image, 'E:/test2.jpg')

这句也如字面,读取图像,可以在算子窗口输入,然后在filename打开图片所在位置,点击确定即可直接插入上面的程序,算子窗口如下:



get_image_size (Image, Width, Height)

如字面意思,获取图像的尺寸;



dev_close_window ()

dev_open_window (0, 0, Width , Height, 'black', WindowID)

dev_display (Image)

set_display_font (WindowID, 14, 'mono', 'true', 'false')

disp_continue_message (WindowID, 'black', 'true')

stop ()

上面这几句也如字面意思,主要是窗口显示的样式及消息提醒什么的(比如按F5继续等),写程序也可运行,窗口会默认显示步骤;


threshold (Image, Regions, 49, 95)

这句很重要,是灰度直方块图的阈值算子,这个一定要点击灰度直方块图命令来输出,你可以通过调节阈值范围来去除不需要的图形和干扰,如下图中右图里,红色90的那条线就是,就是灰度阈值范围在0-90之间,调节时候右图回随着阈值变化而变化,记得点插入代码上面“阈值”前面有个小图标,这个是实时显示的,不然你调时候右图不会刷新,调到你满意然后点击插入代码就可以,如上面的代码:



connection (Regions, Regions)

这句写就可以了,如字面计算连通域的命令,是为了特征直方块图做准备的;


select_shape (Regions, SelectedRegions, 'area', 'and', 1380, 2242)

这句是特征直方图的代码,灰度直方图一样,不用写,在特征直方图中调出即可,样式如下图:





dev_set_draw ('fill')

dev_set_colored (12)

dev_display (SelectedRegions)

disp_continue_message (WindowID, 'black', 'true')

stop ()

dev_display (Image)

dev_set_color ('green')

dev_display (SelectedRegions)

上面语句也是界面显示的,可以按F1查看帮助,这里不赘述了



orientation_region (SelectedRegions, Phi)

这句是计算图形方向的算子,Phi是角度,计算方法是计算图形长宽比例,长方向,窄边为方向向量;


area_center (Regions, Area, Row, Column)

这句是计算图形中心的算子


dev_set_line_width (3)

线宽


dev_set_draw ('margin')

画斜线


Length := 80

线长


for i := 0 to |Phi| - 1 by 1

    dev_set_color ('blue')

    disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)

    disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')

endfor

这句是循环以图形中心划线,画箭头,并在中心位置标记角度的文字。

        怎么样,是不是比opencv简单明了,当然opencv也可以做到,找到对应的相关函数和算子,然后按照这个思路编程就好,就是到了直方块图时候就比较麻烦。

评论