[精华]博客halcon进修经历

[精华]博客halcon进修经历
[精华]博客halcon进修经历

[精华]博客halcon进修经历

HALCON

是当今machine vision技术的代表,它总是以最新科技为基础,提供了现今市场中最强大的vision library。除了提供了完整的标准 machine vision功能,还有一系列优异的功能,例如,3D相机校正,形状以及原件导向的匹配,次像元精度的物体撷取,计算,利用双像立体量测,任意形状的 ROI,以及更多的功能。

用HALCON 来开发程序的流程:

1 、利用 HDevelop 检视分析影像,建立计算雏形,最后完成视觉计算方法的发展。程序可以分成不同的子程序,每个procedures 可以只做一件事,像初始化,计算,或是清除。主程序用于呼叫其它子程序,传递影像或是接收显示结果。最后,程序输出成我们要用的程序代码,接续下一步工作。

2 、完整的程序发展是在程序设计环境中进行,像是 Microsoft

Visual Studio 。由 HDevelop 输出的程序代码,透过指令加入程序中 ( 例如 include) 。至于程序的接口等等则是利用程序语言的功能来建构,接下来,compiled and linked ,产生应用程序。自行撰写的程序和 HALCON library 一起装入机器中出货,或是将程序卖到客户处。

参数和数据结构:

(iconic ,例如影HALCON 有两种基本的数据型态 : 图像数据

像 ) 以及控制数据 ( control ,例如变量,整数,字符串,handle 等

等 ) 。所有运算子的参数都是以相同的方式排列:输入图像,输出图像,输入控制,输出控制。当然,并非所有的运算子都具有上列四类参数,不过参数排列的次序依旧相同。

ROI :影像中要处理的数据范围。

region 即是一堆像元的集合。 region 中的像元不一定要相连,如果要让相

连接的像元成为一个 region ,只要呼叫运算子 connection 即可。

XLD 包含了所有等值线以及多边型的数据。 XLD 对象中除了点坐标数据,还

包含了全域或区域属性,例如 edge 方向,或是分割时的 regression 参数等等。

Tuples 就像一个数组,其中的数据型态可为整数,浮点数或是字符串。当我

们计算一个 region 的某些特征时,会传回一个结果,如果计算的是一群

region ,会传回一个 tuple ,其中含有每个 region 的特征计算结果。 Control tuple 的指标由,开始。

Parallel HALCON

运算版本的 HALCON 在多处理器的计算机上能自动进行数据平

行化,分配到不同的处理器去作业,例如影像。取像

HALCON 提供了 40 余种取像设备连接接口,他们的名称一律以 HFG 开头,至于以 parHFG 开头者是用于 Parallel HALCON。

comment ( : : Comment : ) 注释语句 exit ( : : : ) 退出函数

open_file ( : : FileName, FileType : FileHandle ) 创建( 'output' or 'append' )或者打开 ( output ) 文本文件 fwrite_string ( : : FileHandle, String : ) 写入string dev_close_window ( : : : ) 关闭活跃的图形窗口。 read_image ( : Image : FileName : ) ;加载图片

get_image_pointer1 ( Image : : : Pointer, Type, Width, Height ) 获得图像的数据。如:类型(= ' 字节',' ' ',uint2 int2 等等) 和图像的尺

寸(的宽度和高度)

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) 线宽用Line Width 指定 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- Region opening_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 + Add abs_image ( Image : ImageAbs : : )

计算图像的绝对值模型

crop_part ( Image : ImagePart : Row, Column, Width, Height : )

剪切出一个长方形的图像

add_image ( Image1, Image2 : ImageResult : Mult, Add : )

两图像相叠加 g' := (g1 + g2) * Mult + Add max_image ( Image1,

Image2 : ImageMax : : ) 计算两幅图像每个像素点的最大值

min_image ( Image1, Image2 : ImageMin : : ) 计算两幅图像每个像素点的

最小值

div_image ( Image1, Image2 : ImageResult : Mult, Add : )

两幅图像相除 g' := g1 / g2 * Mult + Add mult_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指向了Image data的起点位置。

3、get_image_pointer3 ( ImageRGB : : : PointerRed, PointerGreen,

PointerBlue, Type, Width, Height )

计算彩色图像ImageRGB的参数。 4、get_image_pointer1_rect

( Image : : : PixelPointer, Width, Height,

VerticalPitch, HorizontalBitPitch, BitsPerPixel )

计算Image图像中定义区域的最小的长方形的区域的指针Pointer~宽度Width~高度Height~VerticalPitch代表Image的

Width*(HorizontalBitPitch/8)。两个相邻象素的水平距离,以比特计

算,HorizontalBitPitch~每像素的比特数BitsPerPixel。 5、

get_image_time ( Image : : : MSecond, Second, Minute, Hour, Day, YDa y, Month, Year )

获取图像生成的时间。

程序::

可以通过上述查看参数深入了解各个函数的具体意义。

1. dev_open_window (0, 0, 512, 512, 'black', Handle1)

2.

3. read_image (Image, 'G:/Halcon/机器视觉/images/autobahn.png')

4.

5. get_grayval (Image, 12, 66, Grayval)

6.

7. get_image_pointer1 (Image, Pointer, Type, Width, Height)

8.

9. draw_region (Region1, Handle1)

10.

11. reduce_domain (Image, Region1, ImageReduced)

12.

13. get_image_pointer1_rect (ImageReduced, PixelPointer, Width1, H

eight1, VerticalPitch, HorizontalBitPitch, BitsPerPixel)

14.

15. read_image (Image1, 'G:/Halcon/机器视觉/images/claudia.png')

16.

17. get_image_pointer3 (Image1, PointerRed, PointerGreen, PointerBl

ue, Type1, Width2, Height2)

18.

19. get_image_time (Image, MSecond, Second, Minute, Hour, Day, Y

Day, Month, Year)

Halcon 学习之二:摄像头获取图像和相关参数1、close_all_framegrabbers ( : : : )

关闭所有图像采集设备。

2、close_framegrabber ( : : AcqHandle : )

关闭Handle为AcqHandle的图像采集设备。 3、open_framegrabber ( : : Name, HorizontalResolution,

VerticalResolution, ImageWidth, ImageHeight, StartRow, StartColumn, Field, BitsPerChannel, ColorSpace, Generic, ExternalTrigger,

CameraType, Device, Port, LineIn : AcqHandle )

打开图像采集设备

参数信息:

Name:图像采集设备的名称

HorizontalResolution和VerticalResolution:分别指预期的图像采集接口的

水平分辨率和垂直分辨率

ImageWidth和ImageHeight:指预期图像的宽度部分和高度部分。

StartRow和StartColumn:指显示预期图像的开始坐标

Field:预期图像是一半的图像或者是完整图像

BitsPerChannel:每像素比特数和图像通道

ColorSpace:输出的色彩格式的抓住图像{gray、raw、rgb、yuv、default} Generic:通用参数与设备细节部分的具体意义。

ExternalTrigger:是否有外部触发

CameraType:使用相机的类型

Device:图像获取设别连接到的设备

Port:图像获取设别连接到的端口

LineIn :相机输入的多路转接器

AcqHandle:图像获取设备的Handle 4、grab_image ( : Image :

AcqHandle : )

获取AcqHandle的图像采集设备的Image。 5、get_framegrabber_param ( : : AcqHandle, Param : Value )

查询AcqHandle的图像采集设备的特殊参数

Param?{name、port、revision、bits_per_channel, camera_type、

color_space、device、,eld、generic、external_trigger、grab_timeout、horizontal_resolution、image_available、image_height、image_width、

line_in、start_column、start_row、volatile、vertical_resolution、continuous_grabbing、}

6、info_framegrabber ( : : Name, Query : Information, ValueList )

查询指定的图像采集接口的信息。

Name为图像采集设备的名称

Query为需要查询的参数名称

Information是指输出的文本信息

ValueList为该图像采集接口的参数值。

Name?{1394IIDC、ABS、BaumerFCAM、BitFlow、Crevis、uEye、DahengCAM、DahengFG、DFG-LC、DirectFile、DirectShow、dPict、DT315x、DT3162、eneo、eXcite、FALCON、FlashBusMV、FlashBusMX、GigEVision、Ginga++、GingaDG、INSPECTA、TAG、INSPECTA5、iPORT、Leutron、LinX、LuCam、MatrixVisionAcquire、MILLite、File、mEnableIII、mEnableIV、mEnableVisualApplets、MultiCam、Opteon、p3i2、p3i4、PixeLINK、PX、PXC、PXD、PXR、pylon、RangerC、RangerE、SaperaLT、Sentech、SonyXCI、SonyXCI-2、SVCam-GigE、TWAIN、VRmUsbCam}

Query?{defaults、general、info_boards、parameters、,eld、generic、parameters_readonly、parameters_writeonly、vertical_resolution、port、bits_per_channel、camera_type、color_space、device、

external_trigger、,eld、generic、horizontal_resolution、image_height、image_width、start_row、start_column、revision}

7、grab_image_async ( : Image : AcqHandle, MaxDelay : )

获取AcqHandle的图像采集设备的Image

当调用grab_image_async 或者grab_data_async时~抓拍下一个图像就结束了。

[c-sharp] view plaincopy

1. // Select a suitable image acquisition interface name AcqName

2. open_framegrabber(AcqName,1,1,0,0,0,0,’default’,-

1,’default’,-1.

0,’default’,’default’,’default’,-1,-1,AcqHandle)

3. // Grab image + start next grab

4. grab_image_async(Image1,AcqHandle,-1.0)

5. // Process Image1 ...

6. // Finish asynchronous grab + start next grab

7. grab_image_async(Image2,AcqHandle,-1.0)

8. // Process Image2 ...

9. close_framegrabber(AcqHandle) 8、grab_image_start ( : : AcqHandle, MaxDelay : )

开始抓拍

只有当和grab_image_async or grab_data_async一起使用时~

grab_image_start 才会起作用。

[c-sharp:showcolumns] view

plaincopy ?????????10????????20????????30????????40????????50????????60? ???????70????????80????????90????????

100???????110???????120???????130???????140???????150

1. // Select a suitable image acquisition interface name AcqName

2. open_framegrabber(AcqName,1,1,0,0,0,0,’default’,-

1,’default’,-1.

0,

3. ’default’,’default’,’default’,-1,-1,AcqHandle)

4. grab_image(Image1,AcqHandle)

5. // Start next grab

6. grab_image_start(AcqHandle,-1.0)

7. // Process Image1 ...

8. // Finish asynchronous grab + start next grab

9. grab_image_async(Image2,AcqHandle,-1.0)

10. // Process Image2 ...

11. close_framegrabber(AcqHandle, 9、get_framegrabber_lut ( : : AcqHandle : ImageRed, ImageGreen,

ImageBlue )

查询AcqHandle的图像采集设备的look-up table

注意:该运算子不能支持所有的图像采集设备 10、grab_data ( : Image, Region, Contours : AcqHandle : Data )

获取AcqHandle的图像采集设备获得的Image、预处理Region和预处理XLD轮廓Contours和预处理控制数据Data。注意:该运算子不能支持所有的图像采集设备 11、

grab_data_async ( : Image, Region, Contours : AcqHandle,MaxDelay: Da ta )

获取AcqHandle的图像采集设备的Image、预处理Region和预处理XLD轮廓Contours和预处理控制数据Data。,需要特殊图像采集数据,

12、

set_framegrabber_lut ( : : AcqHandle, ImageRed, ImageGreen,ImageBlu

e : )

设置AcqHandle的图像采集设备的look-up table 13、

set_framegrabber_param ( : : AcqHandle, Param, Value : )

设置AcqHandle的图像采集设备的特殊参数

相关代码:

[c-sharp:firstline[0]] view plaincopy

1. close_all_framegrabbers ()

2. open_framegrabber ('DahengCAM', 1, 1, -1, -1, 0, 0, 'default', -1, 'r

gb', -1, 'false', 'default', 'default', -1, -1, AcqHandle)

3. grab_image (Image, AcqHandle)

4. grab_image_async (Image2, AcqHandle, -1)

5. get_framegrabber_param (AcqHandle, 'image_width', Value)

6. info_framegrabber ('DirectFile', 'info_boards', Information, ValueL

ist)

可以通过调试以上代码,并且查看相关变量的变化,更深入的了解函数的意

义。

注意:在本段代码中,使用的是大恒的HV1303的工业摄像机,如果是使用一般

的摄像头来采集数据的话,Name值可以设置为Direct_show。

Halcon 学习之三:有关图像通道的函数

黑白摄像机会返回每个像素所对应的能量采用结果~这些结果组成了一幅单通

道灰度值图像~而对于RGB彩色摄像机~它将返回每个像素所对应的三个采样结果~也就是一幅三通道图像。下面这些是与图像通道有关的函数:

1、access_channel ( MultiChannelImage : Image : Channel : )

获取多通道图像MultiChannelImage的Channel通道的图像Image。

2、append_channel ( MultiChannelImage, Image : ImageExtended : : )

将Image图像的通道与MultiChannelImage的通道叠加得到新图像ImageExtended。

3、channels_to_image ( Images : MultiChannelImage : : )

将多幅单通道图像合并成一幅多通道图像 4、compose2 ( Image1, Image2 : MultiChannelImage : : )

将两幅单通道图像合并为二通道图像。Compose3、Compose4以此类推。

5、count_channels ( MultiChannelImage : : : Channels )

计算MultiChannelImage 的通道个数Channels 6、decompose2

( MultiChannelImage : Image1, Image2 : : )

将一幅二通道图像转换为两幅单通道图像。Decompose3、Decompose4以此类推。

7、image_to_channels ( MultiChannelImage : Images : : )

将多通道图像转换为多幅单通道图像。

相关例程为:

[c-sharp] view plaincopy

1. * 输入图像

2. read_image (Image, 'G:/Halcon/机器视觉/images/claudia.png')

3. * 计算图像的通道数

4. count_channels (Image, Num)

5. * 读取每个通道的图像

6. for index := 1 to Num by 1

7. access_channel (Image, channel1, index)

8. endfor

9. decompose3 (Image, image1, image2, image3)

10. compose2 (image3, image2, MultiChannelImage1)

11. append_channel (MultiChannelImage1, image3, ImageExtended)

相关处理结果为:

Halcon 学习之四:有关图像生成的函数

1、copy_image ( Image : DupImage : : ) 复制image图像

2、

region_to_bin ( Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )

将区域Region转换为一幅二进制图像BinImage。 ForegroundGray, BackgroundGray分别为前景色灰度值和背景色灰度值。

Width, Height为Region的宽度和高度。 3、region_to_label ( Region : ImageLabel : Type, Width, Height : )

将区域Region转换为一幅Lable图像ImageLabel。 Type为imagelabel的类型。

Width, Height为Region的宽度和高度。 4、region_to_mean ( Regions, Image : ImageMean : : ) 绘制ImageMean图像~将其灰度值设置为Regions和Image的平均灰度值。

相关例子:

[c-sharp] view plaincopy

1. * 读取图像

2. read_image (Image, 'G:/Halcon/机器视觉

/images/bin_switch/bin_switch_2.png')

3. * 复制图像

4. copy_image (Image, DupImage)

几种常用边缘检测算法的比较

几种常用边缘检测算法的比较摘要:边缘是图像最基本的特征,边缘检测是图像分析与识别的重要环节。基于微分算子的边缘检测是目前较为常用的边缘检测方法。通过对Roberts,Sobel,Prewitt,Canny 和Log 及一种改进Sobel等几个微分算子的算法分析以及MATLAB 仿真实验对比,结果表明,Roberts,Sobel 和Prewitt 算子的算法简单,但检测精度不高,Canny 和Log 算子的算法复杂,但检测精度较高,基于Sobel的改进方法具有较好的可调性,可针对不同的图像得到较好的效果,但是边缘较粗糙。在应用中应根据实际情况选择不同的算子。 0 引言 边缘检测是图像分析与识别的第一步,边缘检测在计算机视觉、图像分析等应用中起着重要作用,图像的其他特征都是由边缘和区域这些基本特征推导出来的,边缘检测的效果会直接影响图像的分割和识别性能。边缘检测法的种类很多,如微分算子法、样板匹配法、小波检测法、神经网络法等等,每一类检测法又有不同的具体方法。目前,微分算子法中有Roberts,Sobel,Prewitt,Canny,Laplacian,Log 以及二阶方向导数等算子检测法,本文仅将讨论微分算子法中的几个常用算子法及一个改进Sobel算法。 1 边缘检测

在图像中,边缘是图像局部强度变化最明显的地方,它主要存在于目标与目标、目标与背景、区域与区域( 包括不同色彩) 之间。边缘表明一个特征区域的终结和另一特征区域的开始。边缘所分开区域的内部特征或属性是一致的,而不同的区域内部特征或属性是不同的。边缘检测正是利用物体和背景在某种图像特征上的差异来实现检测,这些差异包括灰度、颜色或纹理特征,边缘检测实际上就是检测图像特征发生变化的位置。边缘的类型很多,常见的有以下三种: 第一种是阶梯形边缘,其灰度从低跳跃到高; 第二种是屋顶形边缘,其灰度从低逐渐到高然后慢慢减小; 第三种是线性边缘,其灰度呈脉冲跳跃变化。如图1 所示。 (a) 阶梯形边缘(b) 屋顶形边缘 (b) 线性边缘 图像中的边缘是由许多边缘元组成,边缘元可以看作是一个短的直线段,每一个边缘元都由一个位置和一个角度确定。边缘元对应着图像上灰度曲面N 阶导数的不连续性。如果灰度曲面在一个点的N 阶导数是一个Delta 函数,那么就

HALCON形状匹配总结

HALCON形状匹配总结 Halcon有三种模板匹配方法:即Component-Based、Gray-Value-Based、Shaped_based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配,此外还有变形匹配和三维模型匹配也是分属于前面的大类 本文只对形状匹配做简要说明和补充: Shape_Based匹配方法: 上图介绍的是形状匹配做法的一般流程及模板制作的两种 方法。 先要补充点知识:形状匹配常见的有四种情况一般形状匹配模板shape_model、线性变形匹配模板 planar_deformable_model、局部可变形模板 local_deformable_model、和比例缩放模板Scale_model 第一种是不支持投影变形的模板匹配,但是速度是最高的,第二种和第四种是支持投影变形的匹配,第三种则是支持局部变形的匹配。 一般形状匹配模板是最常用的,模板的形状和大小一经制作完毕便不再改变,在查找模板的过程中,只会改变模板的方向和位置等来匹配目标图像中的图像。这个方法查找速度很快,但是当目标图像中与模板对应的图像存在比例放大缩小

或是投影变形如倾斜等,均会影响查找结果。涉及到的算子通常为create_shape_model 和find_shape_model 线性变形匹配模板planar_deformable_model是指模板在行列方向上可以进行适当的缩放。行列方向上可以分别独立的进行一个适当的缩放变形来匹配。主要参数有行列方向查找缩放比例、图像金字塔、行列方向匹配分数(指可接受的匹配分数,大于这个值就接受,小于它就舍弃)、设置超找的角度、已经超找结果后得到的位置和匹配分数 线性变形匹配又分为两种:带标定的可变形模板匹配和不带标定的可变形模板匹配。涉及到的算子有: 不带标定的模板:创建和查找模板算子 create_planar_uncalib_deformable_model和 find_planar_uncalib_deformable_model 带标定模板的匹配:先读入摄像机内参和外参 read_cam_par 和read_pose 创建和查找模板算子create_planar_calib_deformable_model和 find_planar_calib_deformable_model 局部变形模板是指在一张图上查找模板的时候,可以改变模板的尺寸,来查找图像上具有局部变形的模板。例如包装纸袋上图案查找。参数和线性变形额差不多 算子如下:create_local_deformable_model和 find_local_deformable_model

halcon相机标定和测量示例

Halcon单相机标定和测量示例相机标定有很多方式:九点标定法、棋盘格标定法、圆形阵列标定法;本次采用圆形阵列标定法。 1Halcon相机标定 1.1标定板描述文件编制 此次相机标定采用的是网购的标定板(直接在万能的某宝搜halcon标定板),如图1。采购的时候卖家会提供标定板的相应参数,如图2。 图1标定板 图 2 标定板参数

用halcon标定助手标定的时候需要用到标定板的描述文件,此文件可以用gen_caltab算子自己编制。如下为函数说明:gen_caltab( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 函数说明:创建一个标定文件和相应的脚本文件。 函数参数: Xnum:输入X方向标记(圆点)的数量,Xnum>1; Ynum:输入Y方向标记(圆点)的数量,Ynum>1; MarkDist:标记圆圆心间距离,单位“m”;(我看过一个资料翻译为标记点大小,差点被坑死) DiameterRatio:两标记点距离和标记直径的比值,默认:0.5。0

注释的HALCON的标定校正程序

注释的HALCON的程序 时间:2015-11-12 13:25:58阅读:4评论:0收藏:0[点我收藏+]标签:des si代码it la sp文件数据ha *关闭窗口 dev_close_window () dev_close_window () *打开指定大小、颜色背景的窗口 dev_open_window (0, 0, 768/2, 576/2, ‘black‘, WindowHandle1) dev_update_pc (‘off‘) dev_update_window (‘off‘) dev_update_var (‘off‘) dev_update_time (‘off‘) dev_set_draw (‘margin‘) dev_set_line_width (3) * * Calibrate the camera.(标定相机)步骤一 * * 标定板描述文件 CaltabName := ‘caltab_big.descr‘ * make sure that the file ‘CaltabDescrName‘ is in the current directory, * the HALCONROOT/calib directory, or use an absolut path

*初始相机参数:焦距、畸变系数Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight StartCamPar := [0.008,0,0.0000086,0.0000086,384,288,768,576] *物体在空间坐标系中的位姿数组 NStartPose := [] *行角点数组 NRow := [] *列角点数组 NCol := [] *X、Y、Z从标定表文件获取计算值 caltab_points (CaltabName, X, Y, Z) *创建空的图像元组 gen_empty_obj (Images) *图像的数目 NumImages := 10 *接下来for循环,依次读取、处理NumImages张图像 for I := 1 to NumImages by 1 *读取图像:Image得到图像数据 read_image (Image, ‘calib/calib-3d-coord-‘+I$‘02d‘) *将单个Image加入元组Images中 concat_obj (Images, Image, Images) *显示Image dev_display (Image) *在图像中找到标定板的区域:图像,标定板描述文件,滤波核大小,二值化值

Sobel边缘检测算子

经典边缘检测算子比较 一 各种经典边缘检测算子原理简介 图像的边缘对人的视觉具有重要的意义,一般而言,当人们看一个有边缘的物体时,首先感觉到的便是边缘。灰度或结构等信息的突变处称为边缘。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。需要指出的是,检测出的边缘并不等同于实际目标的真实边缘。由于图像数据时二维的,而实际物体是三维的,从三维到二维的投影必然会造成信息的丢失,再加上成像过程中的光照不均和噪声等因素的影响,使得有边缘的地方不一定能被检测出来,而检测出的边缘也不一定代表实际边缘。图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈。边缘上的这种变化可以用微分算子检测出来,通常用一阶或两阶导数来检测边缘,如下图所以。不同的是一阶导数认为最大值对应边缘位置,而二阶导数则以过零点对应边缘位置。 (a )图像灰度变化 (b )一阶导数 (c )二阶导数 基于一阶导数的边缘检测算子包括Roberts 算子、Sobel 算子、Prewitt 算子等,在算法实现过程中,通过22?(Roberts 算子)或者33?模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。拉普拉斯边缘检测算子是基于二阶导数的边缘检测算子,该算子对噪声敏感。一种改进方式是先对图像进行平滑处理,然后再应用二阶导数的边缘检测算子,其代表是LOG 算子。前边介绍的边缘检测算子法是基于微分方法的,其依据是图像的边缘对应一阶导数的极大值点和二阶导数的过零点。Canny 算子是另外一类边缘检测算子,它不是通过微分算子检测边缘,而是在满足一定约束条件下推导出的边缘检测最优化算子。 1 Roberts (罗伯特)边缘检测算子 景物的边缘总是以图像中强度的突变形式出现的,所以景物边缘包含着大量的信息。由于景物的边缘具有十分复杂的形态,因此,最常用的边缘检测方法是所谓的“梯度检测法”。 设(,)f x y 是图像灰度分布函数; (,)s x y 是图像边缘的梯度值;(,)x y ?是梯度的方向。则有 [][]{} 1 2 22 (,)(,)(,)(,)(,)s x y f x n y f x y f x y n f x y = +-++- (1) (n=1,2,...) [][]{}1 (,)tan (,)(,)/(,)(,)x y f x y n f x y f x n y f x y ?-=+-+- (2)

Halcon标定文件资料地生成及标定板规格

Halcon标定文件的生成 Halcon标定文件的生成 图一 Halcon标定文件的生成,需要有以下几个步骤: 1.创建一个标定数据模板,由create_calib_data算来完成。 2.指定相机的类型,初始化相机内部参数,由set_calib_data_cam_param算子来完成。 3.指定标定板的描述文件,由set_calib_data_calib_object算子完成。 4.收集观察数据,有算子set_calib_data_observ_points完成。也就是收集标定板上圆点的中心坐标,跟各个校正板的位置姿态。 5.配置校正过程。由算子set_calib_data完成。 6.将数据整合进行标定计算。calibrate_cameras 7.获得标定参数。get_calib_data 8.记录标定参数,write_cam_par

StartCamPar := [0.016, 0, 0.0000074, 0.0000074, 326, 247, 652, 494] 解释一下这个数组的意思。 面阵相机有14或18个参数(根据想相机的畸变模式),对于线阵相机有17个参数。这些参数可以分开为内部相机参数、外部相机参数。 面阵相机(division模式): Focus(焦距):远焦镜头镜头焦距的长度 Kappa:扭曲系数 Sx,Sy:两像素间距 Cx,Cy:中心点坐标 Whith,Height:图像的宽高 面阵相机(polynomia模式): Focus(焦距):远焦镜头镜头焦距的长度 K1, K2, K3, P1,P2:扭曲系数 Sx,Sy:两像素间距 Cx,Cy:中心点坐标 Whith,Height:图像的宽高 线阵相机不做具体介绍 Halcon标定板规格 2011-12-23 12:56 68人阅读评论(1) 收藏举报

halcon单摄像机标定

In the reference manual,operator signatures are visualized in the following way: operator ( iconic input : iconic output : control input : control output ) 在HALCON所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出,其中四个参数任意一个可以为空。控制输入量可以是变量、常量、表达式,控制输出以及图像输入和输入必须是变量,以存入算子计算结果中。 1.caltab_points:从标定板中读取marks中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系统以标定板为参照,向右为X正,下为Y正,垂直标定板向下为Z正。该算子控制输出为标定板中心3D坐标。 2.create_calib_data:创建Halcon标定数据模型。输出 一个输出数据模型句柄。 3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。设置索引,类型,以及相机的原始内参数等。 4.set_calib_data_calib_object:在标定模型中设定标定对象。设定标定对象句柄索引,标定板坐标点储存地址。 5.find_caltab:分割出图像中的标准标定板区域。输出为标准的标定区域,控制 6.find_marks_and_pose:抽取标定点并计算相机的内参数。输出MARKS 坐标数组,以及估算的相机外参数。 即标定板在相机坐标系中的位姿,由3个平移量和3个旋转量构成。 7.set_calib_data_observ_points( : : CalibDataID, CameraId x, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : ) 收集算子6的标定数据,将标定数据储存在标定数据模型中。输入控制分别为标定数据模型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。

机器视觉之Halcon算子--区域特征

H a l c o n算子--区域特征 当我们想要提取Region时,图像处理后,往往存在几个类似的Region,此时,需要根据Region的一 些特殊特征,来选择指定的Region。 求Region指定特征值:region_features(Regions : : Features : Value) 根据特征值选择区域:select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : ) Region特征一览: 特征英译备注area Area of the object 对象的面积 row Row index of the center 中心点的行坐标 column Column index of the center 中心点的列坐标 width Width of the region 区域的宽度 height Height of the region 区域的高度 row1 Row index of upper left corner 左上角行坐标 column1 Column index of upper left corner 左上角列坐标 row2 Row index of lower right corner 右下角行坐标 column2 Column index of lower right corner 右下角列坐标 circularity Circularity 圆度0~1 compactness Compactness 紧密度0~1 contlength Total length of contour 轮廓线总长 convexity Convexity 凸性 rectangularity Rectangularity 矩形度0~1 ra Main radius of the equivalent ellipse 等效椭圆长轴半径长度 rb Secondary radius of the equivalent ellipse 等效椭圆短轴半径长度 phi Orientation of the equivalent ellipse 等效椭圆方向 anisometry Anisometry 椭圆参数,Ra/Rb长轴与短轴的比值 bulkiness Bulkiness 椭圆参数,蓬松度π*Ra*Rb/A struct_factor Structur Factor? 椭圆参数, Anisometry*Bulkiness-1

边缘检测算子比较

边缘检测算子比较 不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。 课题所用图像边缘与边界应该算是等同的。 在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。 各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位; Roberts算子:边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。Prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。 Sobel算子:Sobel算子和Prewitt算子都是加权平均,但是Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。 Isotropic Sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。 在边沿检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边沿的;另一个是检测垂直平边沿的。Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的,另一个是检测垂直平边沿的。各向同性Sobel 算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。 由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。

halcon单相机标定详细说明

相机标定 1 相机标定基本原理 1.1 相机成像模型 目前大多数相机模型都是基于针孔成像原理建立的,因为针孔成像原理简单,并且能满足建模的要求。除此之外还有基于应用歪斜光线追踪法和近轴光线追踪法的成像模型[1]。针孔成像虽然已经展示出了相机的成像原理,但是由于针孔成像是理想的物理模型,没有考虑相机本身的尺寸、镜头与相机轴心的偏斜等因素的影响,因此精度很低,不能满足工业机器视觉的要求。为了使相机模型能高精度的反应相机的实际成像过程,需要再针孔成像模型的基础上考虑镜头畸变等的因素。 图1 针孔成像 基于针孔成像原理建立的相机的成像模型,如下图所示。在相机的成像模型中,包含有几个坐标系分别是世界坐标系、相机坐标系、图像坐标系,相机的成像过程的数学模型就是目标点在这几个坐标系中的转化过程。 图2 针孔成像模型 (1)世界坐标系(X w,Y w,Z w),就是现实坐标系,是实际物体在现实世界中的数学描述,是一个三维的坐标空间。 (2)摄像机坐标系(X c, Y c),以针孔相机模型的聚焦中心为原点,以摄像机光学轴线为Z c轴 (3)图像坐标系:分为图像像素坐标系和图像物理坐标系 为了便于数学描述将图像平面移动到针孔与世界坐标系之间。如下图所示。

图3 将相机平面移至针孔与目标物体之间后的模型 1.2 坐标系间转换 从世界坐标系到相机坐标系: P(X c ,Y c ,Z c )=R(α,β,γ)?P(X w ,Y w ,Z w )+T 每一个世界坐标的对象都可以通过旋转和平移转移到相机坐标系上。将目标点旋转θ角度,等价于将坐标系方向旋转θ。如下图所示,是二维坐标的旋转变换,对于三维坐标而言,旋转中绕某一个轴旋转,原理实际与二维坐标旋转相同。如果,世界坐标分别绕X ,Y 和Z 轴旋转α,β,γ,那么旋转矩阵分别为R (α),R (β),R (γ) 图4 坐标旋转原理 R (α)=[10 00cosα ?sinα0sinαcosα] (1-1) R (β)=[cosβ 0sinβ0 10?sinβ 0cosβ ] (1-2)

经典边缘检测算子对比

经典边缘检测算子比较 张丽 南京信息工程大学信息与计算科学系,南京210044 摘要:图像边缘检测技术是图像分割、目标识别、区域形态提取等图像分析领域中十分重要的基础。本文简要介绍各种经典图像边缘检测算子的基本原理,用Matlab仿真实验结果表明各种算子的特点及对噪声的敏感度,为学习和寻找更好的边缘检测方法提供参考价值。 关键字:图像处理;边缘检测;算子;比较 引言 图像的边缘时图像最基本的特征之一。所谓边缘(或边沿)是指周围像素灰度有阶跃性变化或“屋顶”变化的那些像素的集合。边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间,因此它是图像分割依赖的重要特征。图像边缘对图像识别和计算机分析十分有用,边缘能勾划出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息(如方向、阶跃性质、形状等)。从本质上说,图像边缘是图像局部特性不连续性(灰度突变、颜色突变、纹理结构突变等)的反应,它标志着一个区域的终结和另一个区域的开始。 边缘检测技术是所有基于边界分割的图像分析方法的第一步,首先检测出图像局部特性的不连续性,再将它们连成边界,这些边界把图像分成不同的区域,检测出边缘的图像就可以进行特征提取和形状分析。为了得到较好的边缘效果,现在已经有了很多的边缘检测算法以及一些边缘检测算子的改进算法。但各算子有自己的优缺点和适用领域。本文着重对一些经典边缘检测算子进行理论分析、实际验证并对各自性能特点做出比较和评价,以便实际应用中更好地发挥其长处,为新方法的研究提供衡量尺度和改进依据。 一各种经典边缘检测算子原理简介 图像的边缘对人的视觉具有重要的意义,一般而言,当人们看一个有边缘的物体时,首先感觉到的便是边缘。灰度或结构等信息的突变处称为边缘。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。需要指出的是,检测出的边缘并不等同于实际目标的真实边缘。由于图像数据时二维的,而实际物体是三维的,从三维到二维的投影必然会造成信息的丢失,再加上成像过程中的光照不均和噪声等因素的影响,使得有边缘的地

Halcon学习(20)摄像机标定常用函数(一)

Halcon学习(二十)摄像机标定常用函数(一) 在HALCON所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出,其中四个参数任意一个可以为空。控制输入量可以是变量、常量、表达式,控制输出以及图像输入和输入必须是变量,以存入算子计算结果中。 1.caltab_points:从标定板中读取marks中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系统以标定板为参照,向右为X正,下为Y正,垂直标定板向下为Z正。该算子控制输出为标定板中心3D坐标。 2.create_calib_data:创建Halcon标定数据模型。输出一个输出数据模型句柄。 3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。设置索引,类型,以及相机的原始内参数等。 4.set_calib_data_calib_object:在标定模型中设定标定对象。设定标定对象句柄索引,标定板坐标点储存地址。 5.find_caltab:分割出图像中的标准标定板区域。输出为标准的标定区域,控制 6.find_marks_and_pose:抽取标定点并计算相机的内参数。输出MARKS坐标数组,以及估算的相机外参数。 即标定板在相机坐标系中的位姿,由3个平移量和3个旋转量构成。 7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : ) 收集算子6的标定数据,将标定数据储存在标定数据模型中。输入控制分别为标定数据模型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。 8.calibrate_cameras( : : CalibDataID : Error) 标定一台或多台相机,依据CalibDataID中的数据。控制输出平均误差。 9.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue) 获得标定数据。 依靠索引号和数据名称来返回输出的数据值。可查询与模型相关的数据,与相机相关的数据(包括相机的内外参数等),与标定对象相关的数据,与标定对象的姿态相关的数据。控制输出是要查询的标定数据。 如:get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查询相机的位姿 get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) //查询标定板位姿10.write_cam_par( : : CameraParam, CamParFile : ) 记录相机的内参数,输入控制为内参数,输出控制为 存取相机内参数的文件名。 11.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 设置新的坐标原点,控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量,控制输出为新的位姿。

数字图像处理几种边缘检测算子的比较

数字图像处理 几种边缘检测算子的比较 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图 像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括:深度上的不连续、表面方向不连续、物质属性变化和场景照明变化。边缘 检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。图像边缘检测 大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结 构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一 类和基于零穿越的一类。基于查找的方法通过寻找图像一阶导数中的最大和最小值 来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻找图 像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过 零点。 人类视觉系统认识目标的过程分为两步:首先,把图像边缘与背景分离出来;然后,才能知觉到图像的细节,辨认出图像的轮廓。计算机视觉正是模仿人类视觉的这个过程。因此在检测物体边缘时,先对其轮廓点进行粗略检测,然后通过链接规则把原来 检测到的轮廓点连接起来,同时也检测和连接遗漏的边界点及去除虚假的边界点。图 像的边缘是图像的重要特征,是计算机视觉、模式识别等的基础,因此边缘检测是图 象处理中一个重要的环节。然而,边缘检测又是图象处理中的一个难题,由于实际景 物图像的边缘往往是各种类型的边缘及它们模糊化后结果的组合,且实际图像信号存 在着噪声。噪声和边缘都属于高频信号,很难用频带做取舍。 这就需要边缘检测来进行解决的问题了。边缘检测的基本方法有很多,一阶的有Roberts Cross算子,Prewitt算子,Sobel算子,Canny算子, Krisch算子,罗盘算子;而二阶的还有Marr-Hildreth,在梯度方向的二阶导数过零点。现在就来 简单介绍一下各种算子的算法

HALCON中filter函数

HALCON算子函数——Chapter 5 : Filter 5.1 Arithmetic 1. abs_image 功能:计算一个图像的绝对值(模数)。 2. add_image 功能:使两个图像相加。 3. div_image 功能:使两个图像相除。 4. invert_image 功能:使一个图像反像。 5. max_image 功能:按像素计算两个图像的最大值。 6. min_image 功能:按像素计算两个图像的最大小值。 7. mult_image 功能:使两个图像相乘。 8. scale_image 功能:为一个图像的灰度值分级。 9. sqrt_image 功能:计算一个图像的平方根。 10. sub_image 功能:使两个图像相减。 5.2 Bit 1. bit_and 功能:输入图像的所有像素的逐位与。 2. bit_lshift 功能:图像的所有像素的左移。3 . bit_mask 功能:使用位掩码的每个像素的逻辑与。 4. bit_not 功能:对像素的所有位求补。 5. bit_or 功能:输入图像的所有像素的逐位或。 6. bit_rshift 功能:图像的所有像素的右移。 7. bit_slice 功能:从像素中提取一位。 8. bit_xor 功能:输入图像的所有像素的逐位异或。5.3 Color

1. cfa_to_rgb 功能:把一个单通道颜色滤波阵列图像变成RGB图像。 2. gen_principal_comp_trans 功能:计算多通道图像的主要部分分析的转换矩阵。 3. linear_trans_color 功能:计算多通道图像的颜色值的一个仿射转换。 4. principal_comp 功能:计算多通道图像的主要部分。 5. rgb1_to_gray 功能:把一个RGB图像转变成一个灰度图像。 6. rgb3_to_gray 功能:把一个RGB图像转变成一个灰度图像。 7. trans_from_rgb 功能:把一个图像从RGB颜色空间转变成任意颜色空间。 8. trans_to_rgb 功能:把一个图像从任意颜色空间转变成RGB颜色空间。 5.4 Edges 1.close_edges 功能:使用边缘幅值图像消除边缘缺陷。 2. close_edges_length 功能:使用边缘幅值图像消除边缘缺陷。 3. derivate_gauss 功能:用高斯派生物对一个图像卷积。 4. diff_of_gauss 功能:近似高斯的拉普拉斯算子。 5. edges_color 功能:使用Canny、Deriche或者_Shen_滤波器提取颜色边缘。 6. edges_color_sub_pix 功能:使用Canny、Deriche或者_Shen_滤波器提取子像素精确颜色边缘。 7. edges_image 功能:使用Deriche、_Lanser、Shen或者_Canny滤

Halcon学习(十八)如何制作标定板

MarkDist 的距离。 两个就近黑色圆点中心之间Halcon 学习(十八)如何制作标定板 下面我具体介绍一下,如何制作halcon 的标准标定板方法一:用halcon 软件自动生成的.ps 文件来制作标定板。 这个也是最简单有效的方法。 打开halcon 的HDevelop 软件,调用算子: gen_caltab( : : XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTa bPSFile : ) XNum 每行黑色标志圆点的数量。 YNum 每列黑色标志圆点的数量。

DiameterRatio 黑色圆点半径与圆点中心距离的比值。 CalTabDescrFile 标定板描述文件的文件路径(.descr)。 CalTabPSFile 标定板图像文件的文件路径 (.ps),如图1 然后复位(F2),点击运行(F5)通过软件Gsview打开,按1:1 比例打印,OK ! 备注一个30*30 的标准标定板的halcon 源代码。gen_caltab (7,7,0.00375,0.5,'F:/halcon 程序 /gencaltab/30_30.descr','F:/halcon 程序/gencaltab/40_40.ps')规格的标定板的规格 黑色圆点列数:7

黑色圆点行数:7 黑色圆点列数:7

外边框长度:30mm*30mm 内边框长度:28.125mm*28.125mm 即:黑色边框线宽为一个圆点半径(0.9375) 黑色圆点半径:0.9375mm 圆点中心间距: 3.75mm 裁剪宽度:30.75mm*30.75mm 即:由黑色 边框向外延伸0.375mm 边角:由黑色外边框向内缩进一个中心边 距的长度 方法二:用halcon 软件自动生成的.descr 文件来制作标定板。打开halcon 的HDevelop 软件,调用算子: gen_caltab 生成一个.descr 的文件,用写字板打开(注意要用写字板,记事本打开会有一些数据不可见,一般windowsXP

halcon常用算法

1、read_image (Image, 'F:/image/001.bmp') 读入图像 2、threshold (Image, region, 100, 200) 阈值分割,获取区域 3、dev_close_window() 关闭当前图形窗口 4、dev_open_window (0, 0, 640, 480, 'black', WindowHandle) 打开一个新的图像窗口 5、decompose3 (Image, Red, Green, Blue) 三通道图像转换成三幅单通道图像 5.5、compose3(Red, Green, Blue, Image) 三幅单通道图像组合为三通道图像 6、connection (Region, ConnectedRegions) 将像素有相连的区域合并成一个元素element 7、count_obj(ConnectedRegions, Number) 计算元素element的个数 8、select_shape(Regions, SelectedRegions, Features, Operation, Min, Max) select_shape (ConnectedRegions,SelectedRegions,['area','anisometry'], 'and', [500,1.0], [50000,1 .7]) 连通域形状的选择 circularity:表示环状;充实度 roundness:圆度 9、dev_set_color('red') 设定输出的颜色 10、dev_set_draw ('margin') 或者 dev_set_draw ('fill') 确定区域填充模式 11、get_image_size (Image, Width, Height) 得到图像的宽度和高度 12、get_image_pointer1 (Image_slanted, Pointer, Type, Width, Height) 设定Pointer指向Image_slanted的起点位置。 13、dev_set_part (0, 0, Height-1, Width-1) 设定图像需要显示的范围 14、dev_display (Image_slanted) 显示图像 15、disp_continue_message(WindowHandle, 'blue', 'false') 等待用户操作是否继续stop () 16、projective_trans_image (Image_slanted, Image_rectified, HomMat2D, 'bilinear', 'false', 'false') 将投影变换应用于一幅图像中。 17、dev_set_line_width (5) 为区域轮廓线设定线宽 18、disp_message (WindowHandle, 'Decoded string: ', 'window', -1, -1, 'black', 'true') 程序写一个文本信息 19、union_collinear_contours_xld 合并在同一直线的XLD union_cocircular_contours_xld 合并在同圆的XLD union_adjacent_contours_xld 合并邻近的XLD 20、fit_line_contour_xld 拟合直线 21、trans_from_rgb(Rimage,Gimage,Bimage,Image1,Image2,Image3,'hsv') rgb颜色空间图像转换到hsv颜色空间图像 22、trans_to_rgb(Image1,Image2,Image3,ImageRed,ImageGreen,ImageBlue,'hsv') hsv颜色空间图像转换到rgb颜色空间图像 23、set_display_font (WindowID, 20, 'mono', 'true', 'false') 设置字体(bottle.hdev) 24、fill_up_shape (RawSegmentation, RemovedNoise, 'area', 1, 5) 根据给定的形状特征填补区域中的不足 25、opening_circle (RemovedNoise, ThickStructures, 2.5) 以半径为2.5像素先腐蚀再膨胀,开运算去除小区域。 26、fill_up (ThickStructures, Solid) 填补区域中的空洞 27、intersection (ConnectedPatterns, ThickStructures, NumberCandidates) 求两个区域的交集然后输出,求ConnectedPatterns区域和ThickStructures 区域的交集,输出 NumberCandidates 28、dev_set_shape ('rectangle1') 设置外接矩形 29、distance_lr (SelectedRegions, Row1, Col1, Row2, Col2, DistanceMin, DistanceMax) 计算直线和区域之间的距离,出现最小距离和最大距离 30、disp_line (WindowID, Row1, Col+100, Row2, Col) 绘制直线段( Col+100, Row1)为起点,(Col, Row2)为终点

图像处理之四种边缘检测算子比较

数字图像处理 第三次作业 SpadesQ, Sun Yat-sen University 2017/4/27 1.边缘检测 边缘一般是指图像在某一局部强度剧烈变化的区域。强度变化一般有两种情况: ●阶跃变化 ●屋顶变化 边缘检测的任务: 找到具有阶跃变化或者屋顶变化的像素点的集合。 边缘检测基本原理: 既然边缘是灰度变化最剧烈的位置,最直观的想法就是求微分。 对于第一种情况:一阶微分的峰值为边缘点,二阶微分的零点为边缘点。 对于第二种情况:一阶微分的零点为边缘点,二阶微分的峰值为边缘点。

2.matlab内置函数

分析:通过对Roberts,Sobel,Prewitt,Log和Canny进行MATLAB 仿真实验对比,结果表明,Sobel,Prewitt和Roberts算子的算法简单,但检测精度不高,Log和Canny算子的算法复杂,但检测精度较高。在应用中应根据实 际情况选择不同的算子。

3.四种算子对比分析 3.1 Sobel算子 Sobel算子在边缘检测算子扩大了其模版,在边缘检测的同时尽量削弱了噪声。其模版大小为3×3,其将方向差分运算与局部加权平均相结合来提取边缘。在求取图像梯度之前,先进行加权平均,然后进行微分,加强了对噪声的一致。Sobel 算子所对应的卷积模版为: 图像中的每个像素点和以上水平和垂直两个卷积算子做卷积运算后,再计算得到梯度幅值G ( x,y),然后选取适当的阈值τ,若G ( x,y)>τ,则(i ,j)为边缘点,否则,判断(i,j)为非边缘点。由此得到一个二值图像{ g (i,j)},即边缘图像。Sobel 算子在空间上比较容易实现,不但产生较好的边缘检测效果,同时,由于其引入了局部平均,使其受噪声的影响也较小。若使用较大的邻域,抗噪性会更好,但也增加了计算量,并且得到的边缘比较粗。在对精度要求不是很高的场合下,

相关文档
最新文档