跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距
跟我学机器视觉-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学习例程中文详解-测量圆环脚宽间距的更多相关文章
- 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量
跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...
- 跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量
跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...
- 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...
- 跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量
跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量 Lead Measurement: Example for the application of the measure object in ...
- 《TensorFlow学习指南深度学习系统构建详解》英文PDF+源代码+部分中文PDF
主要介绍如何使用 TensorFlow 框架进行深度学习系统的构建.涉及卷积神经网络.循环神经网络等核心的技术,并介绍了用于图像数据和文本序列数据的模型.给出了分布式深度学习系统在TensorFlow ...
- Nginx配置文件nginx.conf中文详解(转)
######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...
- Nginx中文详解、配置部署及高并发优化
一.Nginx常用命令: 1. 启动 Nginx /usr/local/nginx/sbin/nginxpoechant@ubuntu:sudo ./sbin/nginx2. 停 ...
- iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...
- [转]iOS学习之UINavigationController详解与使用(三)ToolBar
转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...
随机推荐
- Silverlight应用程序中调用WCF Ria Services访问数据库图片
WCF Ria Services(通常称为RIA服务),专门设计让Silverlight应用程序访问数据库,网上有关其示例应用都是基于简单的数据显示,其中MSDN网站上有详细的解决方案介绍,地址htt ...
- SQL日期(转)
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割 (年.月.日等),然后仅仅用分割出来的年.月.日等放在几个 ...
- 制作UI纹理(UI Texture)
什么情况下使用UI Texture UI Texture的功能是在屏幕上显示一张图片,在这一点上它和Sprite有着相似的功能,但是UI Texture会消耗单独的DrawCall去渲染,并会单独加载 ...
- JQ实现3D拖拽效果
<!DOCTYPE HTML> <html onselectstart='return false'> <head> <meta http-equiv=&qu ...
- HTML5下通过response header解决跨域AJAX cookie的问题
ajax: 通过给Response Header添加Access-Control-Allow-Origin:* 来解决跨域请求,*代表允许所有的跨域请求,或者把*换成指定的域名 cookie: 服务 ...
- python 操作mongodb数据库模糊查询
# -*- coding: utf-8 -*-import pymongoimport refrom pymongo import MongoClient #创建连接#10.20.66.106clie ...
- 线上问题:如何定位解决CPU高占有率
(原文转自:http://www.blogjava.net/hankchen) 以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用 ...
- 看看baidu是如何AJAX跨域的[转]
看看baidu是如何AJAX跨域的 最近做个人网站遇到AJAX跨子域名的问题. 偶尔看到baidu的通行证处理都是在二级域名passport.baidu.com中处理的, 但是baidu很多地方登录都 ...
- List<>过滤重复的简单方法
List<int> ss = new List<int>(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add ...
- unity Android 打包后读取 xml 文件
原地址:http://www.cnblogs.com/wuzhang/p/wuzhang20140731.html 问题: 前天在做东西的过程中发现了一个让人很纠结的问题,为什么Unity 程序 ...