read_image (Mreut, 'mreut') //读入图像
threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在190-255的Regions Areas := [] //定义数组Areas for Radius := 1 to 50 by 1 //循环
dilation_circle (Region, RegionDilation, Radius) //利用半径为Radius的圆对Region进行膨胀运算,输出 RegionDilation,输出形式仍然为Region。 area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标
Areas[Radius-1] := Area //对数组Areas的第Radius-1个元素进行赋值 endfor
3.基本数组操作极其对应的算子
t := [t1,t2] t1,t2连接成新的数组 对应算子:tuple_concat i := |t| 得到数组长度 tuple_length v := t[i] 选取第i个元素0<= i < |t| tuple_select
t := t[i1:i2] 选取i1到i1的元素 tuple_select_range t := subset(t,i) 选取数组t中的第i个元素 tuple_select t := remove(t,i) 去除数组t中的第i个元素 tuple_remove i := find(t1,t2) 找到t2数组在t1数组中出现位置索引
(or -1 if no match) tuple_find
t := uniq(t) 在t数组中把连续相同的值只保留一个 tuple_uniq 4.创建数组
(1)gen_tuple_const函数
tuple := gen_tuple_const(100,4711) //创建一个具有100个元素的,每个元素都为4711的数据 tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据 上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711 (2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值 例如:tuple := [] //创建空数组
for i := 1 to 100 by 1 //建立步长为1的循环
tuple := [tuple,i*i] //将i方的值赋给数组的第i个元素 endfor //循环结束 dev_set_window (WindowHandleProcess) dev_display (ConnectedRegions)
* -> check for a click into the window (error handling switched off, otherwise the cursor must always be in the window)
dev_set_check ('~give_error')
get_mposition (WindowHandleButton, Row, Column, Button) dev_set_check ('give_error') endwhile
dev_set_window (WindowHandleButton) dev_close_window ()
dev_set_window (WindowHandleProcess) dev_close_window () stop () * clean up
dev_update_window ('on')
close_all_framegrabbers ()
Halcon学习(三)赋值与数组操作
(2012-12-17 17:10:40)
assign : 对数据赋值,对数组的初始化。但不能对数组中的某一个值进行赋值。 举例:Tuple1 := [1,0,3,4,5,6,7,8,9] // 对数组进行初始化 Val := sin(1.2) + cos(1.2) // 对某一个值进行赋值 Tuple2 := [] // 数组定义 assign_at : 对数组中的某一个值进行赋值。
举例:Tuple1[1] := 2 // 将Input 和Result 赋值为Tuple1
2.Insert : 对数组中的某一个值进行赋值。 Tuple1 := [1,0,3,4,5,6,7,8,9] Tuple1[3]:=2
显示结果为:[1, 0, 3, 2, 5, 6, 7, 8, 9],即对索引3后面元素,数组Tuple1中第4个元素赋值2. example:
read_image (Mreut, 'mreut') //读入图像
threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在190-255的Regions Areas := [] //定义数组Areas for Radius := 1 to 50 by 1 //循环
dilation_circle (Region, RegionDilation, Radius) //利用半径为Radius的圆对Region进行膨胀运算,输出RegionDilation,输出形式仍然为Region。
area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标 Areas[Radius-1] := Area //对数组Areas的第Radius-1个元素进行赋值 endfor
3.基本数组操作极其对应的算子
t := [t1,t2] t1,t2连接成新的数组 对应算子:tuple_concat i := |t| 得到数组长度 tuple_length v := t[i] 选取第i个元素0<= i < |t| tuple_select
t := t[i1:i2] 选取i1到i1的元素 tuple_select_range t := subset(t,i) 选取数组t中的第i个元素 tuple_select t := remove(t,i) 去除数组t中的第i个元素 tuple_remove i := find(t1,t2) 找到t2数组在t1数组中出现位置索引
(or -1 if no match) tuple_find
t := uniq(t) 在t数组中把连续相同的值只保留一个 tuple_uniq 4.创建数组
(1)gen_tuple_const函数
tuple := gen_tuple_const(100,4711) //创建一个具有100个元素的,每个元素都为4711的数据
tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据 上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711 (2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值
例如:tuple := [] //创建空数组
for i := 1 to 100 by 1 //建立步长为1的循环
tuple := [tuple,i*i] //将i方的值赋给数组的第i个元素 endfor //循环结束
Halcon学习(四)区域连通
(2012-12-17 17:22:31)
Halcon中的区域连通算子( 区域连通算法,将图象被分割为区域 ): regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : ) Row:被测试的区域的垂直距离 Column:被测试的区域的水平距离
Tolerance:两个点之间的最大的灰度差距:|g_1 - g_2| < Tolerance MinSize:最小的输出区域(记输出的连通区域的尺寸) 例 :regiongrowing (Image, Regions, 3, 3, 6, 100) 均值滤波算子
mean_image(Image : ImageMean : MaskWidth, MaskHeight : ) 程序如下:(mean_image
read_image(Image,'E:/halcon图像/die_03.png') mean_image(Image,Mean,7,7)
regiongrowing(Mean,Result,7,7,6.0,200)
Halcon学习(五)获取特征点
(2012-12-17 19:05:13)
这个例程是要检查图中焊接点,并获取焊接点的直径。 处理过程:
首先,分离比较明亮的区域,然后将找出来的结果,转换成最小的平行矩形,即获得了图像处理的ROI。
这里采用了阈值分割:将图像中的灰度值处于某一指定灰度值范围内全部点选到输出区域中。threshold (Bond, Bright, 100, 255)
然后,在ROI区域内选择比较暗的区域,移除不适合的区域(利用形状,面积等参数),把物体抽出变成一个独立的物,找出圆形物体,并且排列物体即可。
程序如下:
dev_close_window ()
dev_open_window(0, 0, -1, -1, 'black', WindowID) read_image(Die, 'E:/halcon图像/die_03.png') dev_display(Die)
threshold(Die, Brightregion,100,255)
shape_trans(Brightregion, ROI, 'rectangle2') reduce_domain(Die, ROI, DieROI)
threshold(DieROI, RawSegmentation,0,50)
fill_up_shape(RawSegmentation, Wires, 'area', 1, 100) opening_circle(Wires, BallRegion, 15.5) connection(BallRegion, Balls)
select_shape(Balls, FinalBalls, 'circularity', 'and', 0.85, 1.0) count_obj(FinalBalls,NumBalls)
smallest_circle(FinalBalls, Row, Column, Radius) meanRadius := sum(Radius)/|Radius|
area_center(FinalBalls, Area, RowCenter, Colcenter) minArea := min(Area)
disp_circle(WindowID, Row, Column, Radius)
所用到的算子如下:
threshold(Image : Region : MinGray, MaxGray : )阈值处理算子,MinGray <= g <= MaxGray,halcon软件将g所在的范围变成红色。 shape_trans(Region : RegionTrans : Type : )
threshold 的参数 100 及 255,即可产生一个合理的 raw segmentation,然后把这个区域转成一个 ROI,做为 bonding balls 侦测之用。选用 shapr_trans,以\为输入区域,参数用\,来找出一个包含\最小的平行四边型。输出的 region 取名为\,差不多就是电路板的大小了。再来用reduce_domain,把原始影像约化成包含 ROI 的范围。
reduce_domain(Image, Region : ImageReduced : : ) 裁剪区域算子
fill_up_shape(Region : RegionFillUp : Feature, Min, Max : ) 填充满足给定的图形特征的区域。
opening_circle(Region : RegionOpening : Radius : ) 打开具有圆形结构的区域
connection(Region : ConnectedRegions : : )区域连通
select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )选择满足要求的区域 count_obj(Objects : : : Number) 计数
smallest_circle(Regions : : : Row, Column, Radius) 包含一 region 的最小圆,圆心位置以及半径
*注意,'||'中求的不是绝对值,而是 tuple 数据的数目,这个例子中就是7。 area_center(Regions : : : Area, Row, Column) 计算圆心
disp_circle( : : WindowHandle, Row, Column, Radius : )将几个圆显示在原始图像中
Halcon学习(六)计数与排序
(2012-12-17 19:55:11)
在 Halcon 里面计算个数的算子有两个:
1、count_obj ( Objects : : : Number ) 主要用法是计算objects 的个数。 2、assign ( : : Input : Result ) 给控制变量分配新值 例: NumBalls := |Radius|
区别 是 Count_obj 主要是用来计算被识别出来的区域的个数 Assign 主要是用来识别数组中的值 在众多区域中选择输出的算子是
select_obj ( Objects : ObjectSelected : Index : ) Index是指编号,且从 1 开始计数
在halcon学习(三)种加入select_obj算子,并显示第三个焊接点所在的圆的位置。这里我们发现一个问题。圆不是按坐标位置排列的。可以考虑算子 程序如下:
reduce_domain(Die, ROI, DieROI)
threshold(DieROI, RawSegmentation,0,50)
fill_up_shape(RawSegmentation, Wires, 'area', 1, 100) opening_circle(Wires, BallRegion, 15.5) connection(BallRegion, Balls)
select_shape(Balls, FinalBalls, 'circularity', 'and', 0.85, 1.0) count_obj(FinalBalls,NumBalls)
select_obj (FinalBalls, ObjectSelected,3)
smallest_circle(ObjectSelected, Row, Column, Radius) meanRadius := sum(Radius)/|Radius|
area_center(FinalBalls, Area, RowCenter, Colcenter)