精华博客halcon进修经历.docx
- 文档编号:11901510
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:46
- 大小:61.88KB
精华博客halcon进修经历.docx
《精华博客halcon进修经历.docx》由会员分享,可在线阅读,更多相关《精华博客halcon进修经历.docx(46页珍藏版)》请在冰豆网上搜索。
精华博客halcon进修经历
[精华]博客halcon进修经历
HALCON
是当今machinevision技术的代表,它总是以最新科技为基础,提供了现今市场中最强大的visionlibrary。
除了提供了完整的标准machinevision功能,还有一系列优异的功能,例如,3D相机校正,形状以及原件导向的匹配,次像元精度的物体撷取,计算,利用双像立体量测,任意形状的ROI,以及更多的功能。
用HALCON来开发程序的流程:
1、利用HDevelop检视分析影像,建立计算雏形,最后完成视觉计算方法的发展。
程序可以分成不同的子程序,每个procedures可以只做一件事,像初始化,计算,或是清除。
主程序用于呼叫其它子程序,传递影像或是接收显示结果。
最后,程序输出成我们要用的程序代码,接续下一步工作。
2、完整的程序发展是在程序设计环境中进行,像是Microsoft
VisualStudio。
由HDevelop输出的程序代码,透过指令加入程序中(例如include)。
至于程序的接口等等则是利用程序语言的功能来建构,接下来,compiledandlinked,产生应用程序。
自行撰写的程序和HALCONlibrary一起装入机器中出货,或是将程序卖到客户处。
参数和数据结构:
(iconic,例如影HALCON有两种基本的数据型态:
图像数据
像)以及控制数据(control,例如变量,整数,字符串,handle等等)。
所有运算子的参数都是以相同的方式排列:
输入图像,输出图像,输入控制,输出控制。
当然,并非所有的运算子都具有上列四类参数,不过参数排列的次序依旧相同。
ROI:
影像中要处理的数据范围。
region即是一堆像元的集合。
region中的像元不一定要相连,如果要让相连接的像元成为一个region,只要呼叫运算子connection即可。
XLD包含了所有等值线以及多边型的数据。
XLD对象中除了点坐标数据,还包含了全域或区域属性,例如edge方向,或是分割时的regression参数等等。
Tuples就像一个数组,其中的数据型态可为整数,浮点数或是字符串。
当我们计算一个region的某些特征时,会传回一个结果,如果计算的是一群region,会传回一个tuple,其中含有每个region的特征计算结果。
Controltuple的指标由,开始。
ParallelHALCON
运算版本的HALCON在多处理器的计算机上能自动进行数据平
行化,分配到不同的处理器去作业,例如影像。
取像
HALCON提供了40余种取像设备连接接口,他们的名称一律以HFG开头,至于以parHFG开头者是用于ParallelHALCON。
comment(:
:
Comment:
)注释语句exit(:
:
:
)退出函数
open_file(:
:
FileName,FileType:
FileHandle)创建('output'or
'append')或者打开(output)文本文件fwrite_string(:
:
FileHandle,String:
)写入stringdev_close_window(:
:
:
)关闭活跃的图形窗口。
read_image(:
Image:
FileName:
);加载图片get_image_pointer1(Image:
:
:
Pointer,Type,Width,Height)
获得图像的数据。
如:
类型(='字节',''',uint2int2等等)和图像的尺寸(的宽度和高度)
dev_open_window(:
:
Row,Column,WidthHeight,Background:
Wind
owHandle)打开一个图形的窗口。
dev_set_part(:
:
Row1,Column1,Row2,Column2:
)修改图像显示的位置
dev_set_draw(’fill’)填满选择的区域dev_set_draw(’margin’)显示的对象只有边缘线,
dev_set_line_width(3)线宽用LineWidth指定threshold(Image:
Region:
MinGray,MaxGray:
)选取从输入图像灰度值的g满足下列条件:
MinGray<=g<=MaxGray的像素。
dev_set_colored(number)显示region是用到的颜色数目
dev_set_color(:
:
ColorName:
)指定颜色connection(Region:
ConnectedRegions:
:
)合并所有选定像素触摸相互连通区
fill_up(Region:
RegionFillUp:
:
)填补选择区域中空洞的部分
fill_up_shape(Region:
RegionFillUp:
Feature,Min,Max:
)
select_shape(Regions:
SelectedRegions:
Features,Operation,Min,
Max:
)选择带有某些特征的区域,Operation是运算,如“与”“或”
smallest_rectangle1(Regions:
:
:
Row1,Column1,Row2,
Column2)以矩形像素坐标的角,
Column1,Row2(Row1,Column2)计算矩形区域(平行输入坐标轴)。
dev_display(Object:
:
:
)显示图片disp_rectangle1(:
:
WindowHandle,Row1,Column1,Row2,
Column2:
)显示的矩形排列成的。
disp_rectangle1显示一个或多个矩
形窗口的产量。
描述一个矩形左上角(Row1,Column1)和右下角(Row2,Column2)。
显示效果如图1.
texture_laws(Image:
ImageTexture:
FilterTypes,Shift,FilterSize:
)
texture_laws实行纹理变换图像FilterTypes:
预置的过滤器Shift:
减少灰度变化FilterSize:
过滤的尺寸
mean_image(Image:
ImageMean:
MaskWidth,MaskHeight:
)平滑图像,原始灰度值的平均数MaskWidth:
过滤器的宽度面具
bin_threshold(Image:
Region:
:
)自动确定阈值Region:
黑暗的区域的图像
dyn_threshold(OrigImage,ThresholdImage:
RegionDynThresh:
Offset,LightDark:
)
比较两个像素的图像像素RegionDynThresh(Out)分割区域Offset:
减少噪音引起的问题LightDark提取光明、黑暗或类似的地方?
dilation_circle(Region:
RegionDilation:
Radius:
)扩张有一个圆形结构元素的地区Radius圆半径
complement(Region:
RegionComplement:
:
)返还补充的区域
reduce_domain(Image,Region:
ImageReduced:
:
)减少定义领域的图像ImageReduced=Image-Regionopening_circle(Region:
RegionOpening:
Radius:
)打开具有圆形结构元素的地区,平滑图像的边界。
Radius:
半径dev_clear_window(:
:
:
)清除视图窗体get_mbutton(:
:
WindowHandle:
Row,Column,Button)原地等待直到鼠标按下
select_region_point(Regions:
DestRegions:
Row,Column:
)选择所有包含给定像素的区域
dilation_rectangle1(Region:
RegionDilation:
Width,Height:
)扩张有矩形元素地区Width构建的矩形的宽度difference(Region,Sub:
RegionDifference:
:
)计算两个区域的差异
gen_region_line(:
RegionLines:
BeginRow,BeginCol,EndRow,
EndCol:
)计算区域(起始点和终点)中的线段intersection(Region1,Region2:
RegionIntersection:
:
)计算两个区域的交叉点
shape_trans(Region:
RegionTrans:
Type:
)变换形状,形状取决于Type
Halcon学习之赋值
Assign:
对数据赋值,对数组的初始化。
但不能对数组中的某一个值进行赋值。
举例:
Tuple1:
=[1,0,3,4,5,6,7,8,9]//对数组进行初始化
Val:
=sin(1.2)+cos(1.2)//对某一个值进行赋值
Tuple2:
=[]//数组定义
Insert:
对数组中的某一个值进行赋值。
举例:
Tuple1[1]:
=2//将Input和Result赋值为Tuple1
区域生长算法
区域生长算法:
既是根据事先定义的准则将像素或者子区域聚合成更大的区域。
基本方法是以“一组”种子开始,将与种子性质相似(灰度级或颜色的特定范围)的相邻像素附加到生长区域的种子上。
Halcon中的区域生长算子(区域生长算法,将图象被分割为区域):
regiongrowing(Image:
Regions:
Row,Column,Tolerance,
MinSize:
)
Row:
被测试的区域的垂直距离
Column:
被测试的区域的水平距离
Tolerance:
能忍受的最大的灰度差距
MinSize:
最小的输出区域
例:
regiongrowing(Image,Regions,3,3,6,100)
Halcon学习之找出焊接点这个例程是要检查图中焊接点,并获取焊接点的直径
处理过程:
首先,分离比较明亮的区域,然后将找出来的结果,转换成最小的平行矩形,即获得了图像处理的ROI(处理后的图像如图2所示)。
这里采用了阈值分割:
将图像中的灰度值处于某一指定灰度值范围内全部点选到输出区域中。
threshold(Bond,Bright,100,255)
然后,在ROI区域内选择比较暗的区域,移除不适合的区域(利用形状,面积等参数),把物体抽出变成一个独立的物,找出圆形物体,并且排列物体即可。
这里采用了
fill_up_shape(Region:
RegionFillUp:
Feature,Min,Max:
)填充满足给定的图形特征的区域。
opening_circle(Region:
RegionOpening:
Radius:
)打开具有圆形结构的区域
select_shape(Regions:
SelectedRegions:
Features,Operation,Min,
Max:
)选择满足要求的区域
sort_region(Regions:
SortedRegions:
SortMode,Order,RowOrCol:
)
根据他们的位置关系进行排序例:
sort_region(,,'first_point','true',
'column')
获取系统架构(Windows_NT等):
OpSystem:
=environment('OS')
smallest_circle(Regions:
:
:
Row,Column,Radius)获取圆形区域的参数
disp_circle(:
:
WindowHandle,Row,Column,Radius:
)在窗体中显示圆形区域
Halcon学习之计数
在Halcon里面计算个数的算子有两个:
1、count_obj(Objects:
:
:
Number)主要用法是计算objects的
个数。
2、assign(:
:
Input:
Result)给控制变量分配新值
例:
NumBalls:
=|Radius|
区别是Count_obj主要是用来计算被识别出来的区域的个数
Assign主要是用来识别数组中的值在众多区域中选择输出的算子是
select_obj(Objects:
ObjectSelected:
Index:
)Index是指编号,且从1开始计数
Halcon学习之文本操作
1、新建文本文件
open_file(:
:
FileName,FileType:
FileHandle)创建('output'or
'append')或者打开(input)文本文件2、写文本
fwrite_string(:
:
FileHandle,String:
)
例如:
fwrite_string(FileHandle,i+''+Area)3、换行操作
fnew_line(:
:
FileHandle:
)换行
4、关闭文本文件
close_file(:
:
FileHandle:
)
5、读取文本文件
(1)字符
fread_char(:
:
FileHandle:
Char)
(2)行读取
fread_line(:
:
FileHandle:
OutLine,IsEOF)
IsEOF判断是否到了文本文件的末尾
(3)字符串读取
fread_string(:
:
FileHandle:
OutString,IsEOF)
Halcon学习之两幅图像处理
sub_image(ImageMinuend,ImageSubtrahend:
ImageSub:
Mult,Add:
)
对两幅图像做减法g':
=(g1-g2)*Mult+Addabs_image(Image:
ImageAbs:
:
)
计算图像的绝对值模型
crop_part(Image:
ImagePart:
Row,Column,Width,Height:
)
剪切出一个长方形的图像
add_image(Image1,Image2:
ImageResult:
Mult,Add:
)
两图像相叠加g':
=(g1+g2)*Mult+Addmax_image(Image1,Image2:
ImageMax:
:
)计算两幅图像每个像素点的最大值
min_image(Image1,Image2:
ImageMin:
:
)计算两幅图像每个像素点的最小值
div_image(Image1,Image2:
ImageResult:
Mult,Add:
)
两幅图像相除g':
=g1/g2*Mult+Addmult_image(Image1,Image2:
ImageResult:
Mult,Add:
)
两幅图像相乘g':
=g1*g2*Mult+Add
边缘检测
边缘检测的定义:
使用数学方法提取图像像元中具有亮度值(灰度)空间方向梯度大的边、线特征的过程。
边缘是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。
图像的边缘对应着图像灰度的不连续性。
显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。
真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。
边缘的锐利程度由图像灰度的梯度决定。
梯度是指灰度变化的最快的方向和数量。
常见的边缘点有三种:
第一种是阶梯形边缘(Step-edge),即从一个灰度到比它高好多的另一个灰度。
第二种是屋顶型边缘(Roof-edge),它的灰度是慢慢增加到一定程度然后慢慢减小。
还有一种是线性边缘(Line-edge),它的灰度从一级别跳到另一个灰度级别之后然后回来。
边缘检测的方法主要有以下几种:
第一种检测梯度的最大值。
由于边缘发生在图像灰度值变化比较大的地方,对应连续情形就是说是函数梯度较大的地方,所以研究比较好的求导算子就成为一种思路。
Roberts算子、Prewitt算子和Sobel算子等就是比较简单而常用的例子。
还有一种比较直观的方法就是利用
当前像素邻域中的一些像素值拟合一个曲面,然后求这个连续曲面在当前像素处梯度。
从统计角度来说,我们可以通过回归分析得到一个曲面,然后也可以做类似的处理。
第二种是检测二阶导数的零交叉点。
这是因为缘处的梯度取得最大值(正的或者负的),也就是灰度图像的拐点是边缘。
从分析学上我们知道,拐点处函数的二阶导数是0。
第三种,统计型方法。
比如说利用假设检验来检测边缘中利用对二阶零交叉点的统计分析得到了图像中各个像素是边缘的概率,并进而得到边缘检测的方案。
Halcon学习之边缘检测函数sobel_amp(Image:
EdgeAmplitude:
FilterType,Size:
)根据图像的一次导数计算图像的边缘
close_edges(Edges,EdgeImage:
RegionResult:
MinAmplitude:
)
close_edges_length(Edges,Gradient:
ClosedEdges:
MinAmplitude,
MaxGapLength:
)使用边缘高度图像关闭边缘间隙。
输出的区域包含杯关闭的区域。
(感觉是对边缘的扩充)derivate_gauss(Image:
DerivGauss:
Sigma,Component:
)
watersheds(Image:
Basins,Watersheds:
:
)从图像中提取风水岭。
zero_crossing(Image:
RegionCrossing:
:
)零交点(二次导数)
diff_of_gauss(Image:
DiffOfGauss:
Sigma,SigFactor:
)近似日志算子(拉普拉斯高斯)。
laplace_of_gauss(Image:
ImageLaplace:
Sigma:
)拉普拉斯高斯
edges_color_sub_pix(Image:
Edges:
Filter,Alpha,Low,High:
)
精确的亚像素边缘提取(彩色图像)edges_sub_pix(Image:
Edges:
Filter,Alpha,Low,High:
)精确边缘提取的亚像素(灰度图像)
edges_color(Image:
ImaAmp,ImaDir:
Filter,Alpha,NMS,Low,
High:
)根据颜色进行边缘提取
edges_image(Image:
ImaAmp,ImaDir:
Filter,Alpha,NMS,Low,
High:
)边缘提取
skeleton(Region:
Skeleton:
:
)计算区域的框架Skeleton==Region
frei_amp(Image:
ImageEdgeAmp:
:
)Frei-chen模板进行边缘检测(振幅)
frei_dir(Image:
ImageEdgeAmp,ImageEdgeDir:
:
)Frei-chen模板进行边缘检测(振幅和方向)
nonmax_suppression_dir(ImgAmp,ImgDir:
ImageResult:
Mode:
)使用方向图像抑制所有的超过给定最大值的图像灰度值的点
gen_contours_skeleton_xld(Skeleton:
Contours:
Length,Mode:
)将系统框架转换成XLD轮廓
laplace(Image:
ImageLaplace:
ResultType,MaskSize,
FilterMask:
)使用有限差分计算拉普拉斯变换info_edges(:
:
Filter,Mode,Alpha:
Size,Coeffs)估计滤波器的宽度
kirsch_dir(Image:
ImageEdgeAmp,ImageEdgeDir:
:
)使用Kirsch算子计算出边缘(振幅和方向)
prewitt_amp(Image:
ImageEdgeAmp:
:
)使用Prewitt算子计算出边缘(振幅)
kirsch_amp(Image:
ImageEdgeAmp:
:
)使用Kirsch算子计算出边缘(振幅)
highpass_image(Image:
Highpass:
Width,Height:
)从高频成分提取的图像。
sobel_amp(Image:
EdgeAmplitude:
FilterType,Size:
)使用Sobel算子计算出边缘(振幅)
robinson_amp(Image:
ImageEdgeAmp:
:
)使用Robinson算子计算出边缘(振幅)
roberts(Image:
ImageRoberts:
FilterType:
)使用Robert算子计算边缘
Halcon学习之一:
查询图像参数1、get_grayval(Image:
:
Row,Column:
Grayval)
计算Image图像中坐标为,Row~Column,的点的灰度值Grayval。
2、get_image_pointer1(Image:
:
:
Pointer,Type,Width,Height)
计算Image图像的数据指针Pointer~图像类型Type~图像宽度Width和高度Height。
Pointer指向了Imagedata的起点位置。
3、get_image_pointer3(I
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精华 博客 halcon 进修 经历