跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距

  • This example program demonstrates the basic usage of a circular measure object.

  • Here, the task is to determine the width of the cogs.

*首先读取图像,获取图像的宽度和高度

  • First, read in the image and initialize the program.

read_image (Image, 'rings_and_nuts')

dev_close_window ()

dev_open_window_fit_image (Image, 0, 0, 640, 640, WindowHandle)

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

get_image_size (Image, Width, Height)

*读到的图像如下:

  • Extract the rings.

自动阈值分割,此时为一个区域,如图*********

bin_threshold (Image, Region)

**********进行连通区域划分,不同的区域用不同的颜色表示,如图:

connection (Region, ConnectedRegions)

*填充区域内的孔洞,效果如图

fill_up (ConnectedRegions, RegionFillUp)

**计算区域的紧性,机器视觉算法与应用第168页

compactness (RegionFillUp, Compactness)

****通过紧性特征进行区域筛选,在1.5到2.5之间的为需要测量的圆环

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

if (Compactness[i] > 1.5 and Compactness[i] < 2.5)

    select_obj (RegionFillUp, ObjectSelected, i+1)

    * Determine the size and position of the rings.

计算选择区域的最小外接圆和最大内接圆,存储圆心和半径

两个半径的均值作为测量圆弧半径,AnnulusRadius 为测量圆弧宽度******************

    smallest_circle (ObjectSelected, Row, Column, RadiusMax)

    inner_circle (ObjectSelected, CenterRow, CenterCol, RadiusMin)

    Radius := (RadiusMax+RadiusMin)/2.0

    AnnulusRadius := (RadiusMax-RadiusMin)/4.0

    * Determine the position between two cogs.

    * This position is then used as the start angle for the circular ROI.

********多边形近似逼近区域,存储多边形角点的坐标值,机器视觉算法与应用第252页

    get_region_polygon (ObjectSelected, AnnulusRadius, RowsBorder, ColumnsBorder)

计算每个角点到最大内接圆圆心的距离,然后进行排序*************

SqrDistanceBorder := (RowsBorder-CenterRow)(RowsBorder-CenterRow) + (ColumnsBorder-CenterCol)(ColumnsBorder-CenterCol)

*************从小到大排序

tuple_sort_index (SqrDistanceBorder, Indices)

********计算直线的角度,圆心和到圆心最近的多边形角点所确定的直线

***************将该角度作为测量圆弧的起始角度

    line_orientation (CenterRow, CenterCol, RowsBorder[Indices[0]], ColumnsBorder[Indices[0]], AngleStart)

我认为检测圆开始角度直接设为0度也可以**************

  •   AngleStart := rad(0)
    
      AngleExtent := rad(360)
    
      * Create the measure for a circular ROI.
    
      Interpolation := 'bilinear'

生成测量圆弧,为完整圆环(360度)***

    gen_measure_arc (CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation, MeasureHandle)

    * Determine all edge pairs that have a negative transition, i.e., edge pairs

    * that enclose dark regions.

    * Note that the output parameters IntraDistance and InterDistance are given as arc lengths.

    Sigma := 1.0

    Threshold := 30

    Transition := 'negative'

    Select := 'all'

***进行边缘对测量,RowEdgeFirst, ColumnEdgeFirst,RowEdgeSecond, ColumnEdgeSecond为检测圆弧检测到的边界的中心点的坐标,

IntraDistance, InterDistance分别为边缘对间的距离和边缘对的弧线距离

    measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

    * Determine the number of cogs.

    NumCogs := |RowEdgeFirst|

    * Determine the linear distance between the two edges of each edge pair ('Linear cog size')

    * as well as the angular distance of the edge pairs ('Angular cog size').

计算边缘对的直线距离和弧度*

    distance_pp (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, LinearDistance)

    AngularDistance := deg(IntraDistance/Radius)

 Visualize the determined edges.

将边缘对的起始终止点画出,并显示测量结果****

    gen_empty_obj (Crosses)

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

        gen_cross_contour_xld (Cross, RowEdgeFirst[i], ColumnEdgeFirst[i], AnnulusRadius*2.0, atan2(RowEdgeFirst[i]-CenterRow,ColumnEdgeFirst[i]-CenterCol))

        concat_obj (Crosses, Cross, Crosses)

        gen_cross_contour_xld (Cross, RowEdgeSecond[i], ColumnEdgeSecond[i], AnnulusRadius*2.0, atan2(RowEdgeSecond[i]-CenterRow,ColumnEdgeSecond[i]-CenterCol))

        concat_obj (Crosses, Cross, Crosses)

    endfor

    dev_display (Image)

    dev_set_line_width (4)

    dev_set_color ('black')

    dev_display (Crosses)

    dev_set_line_width (1)

    dev_set_color ('white')

    dev_display (Crosses)

    * Display the measured size of the cogs.

    disp_message (WindowHandle, 'Number of cogs: '+|RowEdgeFirst|+'                 ', 'window', 260, 10, 'black', 'true')

    disp_message (WindowHandle, 'Mean cog size:                    ', 'window', 286, 10, 'black', 'true')

    disp_message (WindowHandle, '- Arc length: '+mean(IntraDistance)$'.2f'+' +/- '+deviation(IntraDistance)$'.2f'+' pixel', 'window', 310, 10, 'black', 'true')

    disp_message (WindowHandle, '- Linear:     '+mean(LinearDistance)$'.2f'+' +/- '+deviation(LinearDistance)$'.2f'+' pixel', 'window', 334, 10, 'black', 'true')

    disp_message (WindowHandle, '- Angular:    '+mean(AngularDistance)$'.2f'+' +/- '+deviation(AngularDistance)$'.2f'+' deg  ', 'window', 358, 10, 'black', 'true')
*
* Close the measure close_measure (MeasureHandle) disp_continue_message (WindowHandle, 'black', 'true') stop () endif

for循环,测量其他圆环*****

endfor

跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距的更多相关文章

  1. 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...

  2. 跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...

  3. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...

  4. 跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量 Lead Measurement: Example for the application of the measure object in ...

  5. 《TensorFlow学习指南深度学习系统构建详解》英文PDF+源代码+部分中文PDF

    主要介绍如何使用 TensorFlow 框架进行深度学习系统的构建.涉及卷积神经网络.循环神经网络等核心的技术,并介绍了用于图像数据和文本序列数据的模型.给出了分布式深度学习系统在TensorFlow ...

  6. Nginx配置文件nginx.conf中文详解(转)

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  7. Nginx中文详解、配置部署及高并发优化

      一.Nginx常用命令: 1. 启动 Nginx          /usr/local/nginx/sbin/nginxpoechant@ubuntu:sudo ./sbin/nginx2. 停 ...

  8. iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...

  9. [转]iOS学习之UINavigationController详解与使用(三)ToolBar

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...

随机推荐

  1. linux shell命令的常用快捷键

    一些shell的常用快捷键.   Ctrl + a 切换到命令行开始  Ctrl + e 切换到命令行末尾  Ctrl + l 清除屏幕内容  Ctrl + u 清除剪切光标之前的内容  Ctrl + ...

  2. 远程连接Ucenter数据库

    网站和Ucenter不是同一服务器的连接方法~我折腾了好几天,终于找到了这方法!各位连接不上的不妨试试~什么事只有试过才知道行不行! define('UC_CONNECT', 'mysql'); de ...

  3. 运行phpize失败排查

    ==相关参考== rpm包 http://rpmfind.net/linux/rpm2html/ phpize学习 ==问题及排查过程== 1.phpize失败 2.yum install php-d ...

  4. Linux是一门真正的黑客高手艺术

    黑客这个词从诞生到现在,从来就没有解释为“高级入侵者”.“病毒制造者”或者“QQ盗号者”过.我至今不清楚在中国是谁先把黑客和这些无聊的词汇联系在了一起,导致如此多的人被误导.但有一点是肯定的,不负责任 ...

  5. PythonCrawl自学日志

    2016-09-10 PythonCrawl自学日志 1.python及Selenium的安装 (1)开发环境使用的是VS2015 Community.python3.5.Selenium3.0BET ...

  6. 使用Memcached、Spring AOP构建数据库前端缓存框架

    数据库访问可能是很多网站的瓶颈.动不动就连接池耗尽.内存溢出等.前面已经讲到如果我们的网站是一个分布式的大型站点,那么使用 memcached实现数据库的前端缓存是个很不错的选择:但如果网站本身足够小 ...

  7. <三> jQuery 选择器

    jQuery 选择器选择需要应用效果的元素,jQuery 元素选择器和属性选择器允许您通过标签名.属性名或内容对 HTML 元素进行选择.选择器允许您对 HTML 元素组或单个元素进行操作. 元素选择 ...

  8. 解决WP8应用里ListBox绑定数据变多导致越来越卡

    ListBox控件绑定数据,当滑动到底部的时候加载数据到列表上,这样就会产生一个问题,当ListBox上面绑定的数据有几千条的时候,界面将会卡顿,我们可以通过在ListBox上只绑定指定数量的数据,其 ...

  9. javascript技巧合集

    转http://www.blogjava.net/zhaochengming/archive/2010/04/09/317837.html http://www.cnblogs.com/fxgachi ...

  10. 第十章Composite设备

    10.1 Composite设备介绍 USB的Composite类是USB 复合设备类,一个USB设备具有多种设备功能,比如一个USB设备同时具有鼠标和键盘功能.单一的USB设备开发相对简单,但在很多 ...