计算机视觉
图像处理

博客halcon学习经验总结(1)

Halcon

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

用HALCON 来开发程序的流程:

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

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

参数和数据结构:

HALCON  有两种基本的数据型态 : 图像数据 (iconic ,例如影像 ) 以及控制数据 ( control ,例如 变量,整数,字符串,handle 等等 ) 。所有运算子的参数都是以相同的方式排列:输入图像,输 出图像,输入控制,输出控制。 当然,并非所有的运算子都具有上列四类参数,不过参数排 列的次序依旧相同。

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

region   即是一堆像元的集合。 region 中的像元不一定要相连,如果要让相连接的像元成为一个 region ,只要呼叫运算子  connection  即可。

XLD 包含了所有等值线以及多边型的数据。 XLD 对象中除了点坐标数据,还包含了全域或区域属性,例如 edge 方向,或是分割时的 regression 参数等等。

Tuples 就像一个数组,其中的数据型态可为整数,浮点数或是字符串。当我们计算一个 region 的某些特征时,会传回一个 结果,如果计算的是一群 region ,会传回一个 tuple ,其中含有每个 region 的特征计算结果。 Control tuple 的指标由0开始。

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 :WindowHandle )   打开一个图形的窗口。

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, YDay, Month, Year )

获取图像生成的时间。

程序::

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

  1. dev_open_window (0, 0, 512, 512, ‘black’, Handle1)
  2. read_image (Image, ‘G:/Halcon/机器视觉/images/autobahn.png’)
  3. get_grayval (Image, 12, 66, Grayval)
  4. get_image_pointer1 (Image, Pointer, Type, Width, Height)
  5. draw_region (Region1, Handle1)
  6. reduce_domain (Image, Region1, ImageReduced)
  7. get_image_pointer1_rect (ImageReduced, PixelPointer, Width1, Height1, VerticalPitch, HorizontalBitPitch, BitsPerPixel)
  8. read_image (Image1, ‘G:/Halcon/机器视觉/images/claudia.png’)
  9. get_image_pointer3 (Image1, PointerRed, PointerGreen, PointerBlue, Type1, Width2, Height2)
  10. get_image_time (Image, MSecond, Second, Minute, Hour, Day, YDay, 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、field、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、field、generic、parameters_readonly、parameters_writeonly、vertical_resolution、port、bits_per_channel、camera_type、color_space、device、external_trigger、field、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

  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: Data )

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

12、set_framegrabber_lut ( : : AcqHandle, ImageRed, ImageGreen,ImageBlue : )

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

13、set_framegrabber_param ( : : AcqHandle, Param, Value : )

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

相关代码:

[0]] view plaincopy

  1. close_all_framegrabbers ()
  2. open_framegrabber (‘DahengCAM’, 1, 1, -1, -1, 0, 0, ‘default’, -1, ‘rgb’, -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, ValueList)

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

注意:在本段代码中,使用的是大恒的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. forindex := 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)
  5. * 区域生长算法
  6. regiongrowing (Image, Regions, 3, 3, 1, 100)
  7. * 生成ImageMean
  8. region_to_mean (Regions, Image, ImageMean)
  9. * 将Region转换为二进制图像
  10. region_to_bin (Regions, BinImage, 255, 0, 512, 512)
  11. * 将Region转换为Label图像
  12. region_to_label (Regions, ImageLabel, ‘int4’, 512, 512)

 

Halcon学习之五:有关图像的定义域的函数

1、add_channels ( Regions, Image : GrayRegions : : )

将Image图像的灰度值赋给区域Regions,得到GrayRegions。

2、change_domain ( Image, NewDomain : ImageNew : : )

改变Image图像的定义域

3、full_domain ( Image : ImageFull : : )

扩张Image图像的定义域到最大。

4、get_domain ( Image : Domain : : )

得到Image图像的定义域

5、rectangle1_domain ( Image : ImageReduced : Row1, Column1, Row2,

Column2 : )

根据矩形坐标(Row1, Column1)、(Row2,Column2)得到区域视为Image图像的定义域。

6、reduce_domain ( Image, Region : ImageReduced : : )

得到图像Image相对于Region区域的图像

例程:

  1. read_image (Image, ‘G:/Halcon/机器视觉/images/brycecanyon1.png’)
  2. * 打开一个新的窗体
  3. dev_open_window (0, 0, -1, -1, ‘black’, WindowHandle)
  4. * 显示图像
  5. dev_display (Image)
  6. * 选出两个新的Region
  7. draw_region (region1, WindowHandle)
  8. draw_region (region2, WindowHandle)
  9. add_channels (region1, Image, image_region1)
  10. change_domain (Image, region2, ImageNew)
  11. full_domain (image_region1, ImageFull)
  12. rectangle1_domain (ImageFull, ImageReduced, 100, 100, 300, 500)
  13. get_domain (image_region1, Domain)
  14. reduce_domain (Image, region2, ReducedImage)

 

Halcon学习之六:获取Image图像中Region区域的特征参数

area_center_gray ( Regions, Image : : : Area, Row, Column )

计算Image图像中Region区域的面积Area和重心(Row,Column)。

cooc_feature_image ( Regions, Image : : LdGray, Direction : Energy,

Correlation, Homogeneity, Contrast )

计算共生矩阵和推导出灰度特征值

Direction:灰度共生矩阵计算的方向

Energy:灰度值能量

Correlation:灰度值的相互关系

Homogeneity:灰度值的均匀性

Contrast:灰度值的对比度

cooc_feature_matrix ( CoocMatrix : : : Energy, Correlation,

Homogeneity, Contrast )

根据共生矩阵计算灰度特征值

elliptic_axis_gray ( Regions, Image : : : Ra, Rb, Phi )

计算Image图像的Region区域的Ra,Rb和Phi。

entropy_gray ( Regions, Image : : : Entropy, Anisotropy )

Image图像中Region区域的计算熵Entropy和各向异性Anisotropy。

estimate_noise ( Image : : Method, Percent : Sigma )

从单一图像 Image中估计图像的噪声。

Sigma:加性噪声的标准偏差

Method :估计噪声的方法

Method∈{foerstner、immerkaer、least_squares、mean}、

fit_surface_first_order ( Regions, Image : : Algorithm, Iterations,

ClippingFactor : Alpha, Beta, Gamma )

计算一阶灰度平面的灰度矩阵和灰度值的逼近参数。

Algorithm:采用的算法

Algorithm:迭代次数

ClippingFactor:消除临界值的削波系数

fit_surface_second_order ( Regions, Image : : Algorithm, Iterations,

ClippingFactor : Alpha, Beta, Gamma, Delta, Epsilon, Zeta )

计算二阶灰度平面的灰度矩阵和灰度值的逼近参数。

fuzzy_entropy ( Regions, Image : : Apar, Cpar : Entropy )

确定区域Regions的模糊熵 将图像视为模糊集合

Apar为模糊区域的起始点

Cpar为模糊区域的结束点

Entropy为Regions的模糊熵

fuzzy_perimeter ( Regions, Image : : Apar, Cpar : Perimeter )

计算Region区域的模糊周长

gen_cooc_matrix ( Regions, Image : Matrix : LdGray, Direction : )

生成Image图像Region区域的共生矩阵

gray_histo ( Regions, Image : : : AbsoluteHisto, RelativeHisto )

获取Image图像Region区域的灰度相对直方图RelativeHisto和绝对直方图AbsoluteHisto。

注意:Region区域必须先计算过它的直方图。

gray_histo_abs ( Regions, Image : : Quantization : AbsoluteHisto )

获取Image图像Region区域的灰度绝对直方图AbsoluteHisto。

Quantization:灰度值的量化、

gray_projections ( Region, Image : : Mode : HorProjection,

VertProjection )

计算Region区域在水平方向和垂直方向的灰度值投影。

histo_2dim ( Regions, ImageCol, ImageRow : Histo2Dim : : )

计算二通道灰度图像的直方图

intensity ( Regions, Image : : : Mean, Deviation )

计算region区域的灰度平均值和偏差

min_max_gray ( Regions, Image : : Percent : Min, Max, Range )

计算Region区域的最大最小灰度值。

Range:最大灰度值和最小灰度值之间的差距

moments_gray_plane ( Regions, Image : : : MRow, MCol, Alpha, Beta,

Mean )

计算平面的灰度矩阵和灰度值的逼近参数。

plane_deviation ( Regions, Image : : : Deviation )

逼近的图象平面计算灰度值偏差

select_gray ( Regions, Image : SelectedRegions : Features, Operation,

Min, Max : )

根据灰度值选择区域

Features∈{area、row、column、ra、rb、phi、min、max、mean、deviation、plane_deviation、anisotropy、entropy、fuzzy_entropy、fuzzy_perimeter、moments_row、moments_column、alpha、beta}

Operation∈{and、or}

shape_histo_all ( Region, Image : : Feature : AbsoluteHisto,

RelativeHisto )

shape_histo_point ( Region, Image : : Feature, Row,

Column : AbsoluteHisto, RelativeHisto )

获取阈值特征直方图

Feature∈{connected_components、convexity、compactness、anisometry、holes}

程序:

[c-sharp] view plaincopy

  1. read_image (Image, ‘G:/Halcon/机器视觉/images/bin_switch/bin_switch_3.png’)
  2. regiongrowing (Image, Regions, 3, 3, 1, 500)
  3. area_center_gray (Regions, Image, Area, Row, Column)
  4. cooc_feature_image (Regions, Image, 6, 0, Energy, Correlation, Homogeneity, Contrast)
  5. elliptic_axis_gray (Regions, Image, Ra, Rb, Phi)
  6. entropy_gray (Regions, Image, Entropy, Anisotropy)
  7. estimate_noise (Image, ‘mean’, 20, Sigma)
  8. fit_surface_first_order (Regions, Image, ‘regression’, 5, 2, Alpha, Beta, Gamma)
  9. fit_surface_second_order (Regions, Image, ‘regression’, 5, 2, Alpha1, Beta1, Gamma1, Delta, Epsilon, Zeta)
  10. fuzzy_entropy (Regions, Image, 0, 255, Entropy1)
  11. fuzzy_perimeter (Regions, Image, 0, 255, Perimeter)
  12. gen_cooc_matrix (Regions, Image, Matrix, 6, 0)
  13. dev_set_paint (‘histogram’)
  14. gray_projections (Regions, Image, ‘simple’, HorProjection, VertProjection)
  15. histo_2dim (Regions, Image, Image, Histo2Dim)

 

Halcon学习之七:改变图像的现实方式和大小

change_format ( Image : ImagePart : Width, Height : )

改变Image图像大小,而且ImagePart图像为灰度值图像。

crop_domain ( Image : ImagePart : : )

从Image图像中裁剪一个矩形区域。这个矩形的周长最小。

crop_domain_rel ( Image : ImagePart : Top, Left, Bottom, Right : )

删除相关区域,Top为顶端裁剪的行数,Left,Bottom,Right类似。

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

删除一个矩形图像区域。Row为右上角的列标索引。Width, Height为新图像ImagePart的宽度和高度。

crop_rectangle1 ( Image : ImagePart : Row1, Column1, Row2,

Column2 : )

删除一个矩形图像区域。

tile_channels ( Image : TiledImage : NumColumns, TileOrder : )

将多通道图像平铺为一幅大的单通道图像。NumColumns为平铺的列数。TileOrder为平铺的方式。

tile_images ( Images : TiledImage : NumColumns, TileOrder : )

将多通道平铺。

程序:

[c-sharp] view plaincopy

  1. read_image (Image, ‘G:/Halcon/机器视觉/images/brycecanyon1.png’)
  2. get_image_pointer1 (Image, Pointer, Type, Width, Height)
  3. change_format (Image, ImagePart, Width/2, Height/2)
  4. crop_domain (Image, ImagePart1)
  5. crop_domain_rel (IqmagePart1, ImagePart2, -20, -20, -1, -1)
  6. crop_part (ImagePart2, ImagePart3, 100, 100, Width, Height)
  7. crop_rectangle1 (ImagePart3, ImagePart4, 100, 100, 200, 200)
  8. tile_channels (Image, TiledImage, 2, ‘horizontal’)
  9. tile_images (Image, TiledImage1, 1, ‘vertical’)
  10. tile_images_offset (Image, TiledImage2, 0, 0, 50, 50, -1, -1, Width, Height)

 

Halcon学习之八:图像区域叠加与绘制

overpaint_gray ( ImageDestination, ImageSource : : : )

将灰度值不相同区域用不同颜色绘制到ImageDestination中, ImageSource包含希望的灰度值图像

overpaint_region ( Image, Region : : Grayval, Type : )

将Region以一个恒定的灰度值绘制到Image图像中

paint_gray ( ImageSource, ImageDestination : MixedImage : : )

将ImageSource的图像绘制到ImageDestination中,形成MixedImage。

paint_region ( Region, Image : ImageResult : Grayval, Type : )

将Region以一个恒定的灰度值绘制到Image图像中

paint_xld ( XLD, Image : ImageResult : Grayval : )

将XLD以一个恒定的灰度值绘制到Image图像中

set_grayval ( Image : : Row, Column, Grayval : )

设置Image图像中坐标为(Row,Column)的灰度值

程序:

[c-sharp] view plaincopy

  1. read_image (Image, ‘G:/Halcon/images/images/claudia.png’)
  2. gen_circle (Circle, 200, 200, 100.5)
  3. reduce_domain (Image, Circle, ImageReduced)
  4. gen_image_proto (Image, ImageCleared, 32)
  5. overpaint_gray (ImageCleared, ImageReduced)
  6. gen_image_const (Image1, ‘byte’, 512, 512)
  7. overpaint_region (Image1, Circle, 255, ‘fill’)
  8. * /* Copy a circular part of the image  into the image : */
  9. read_image (Image2, ‘G:/Halcon/images/images/brycecanyon1.png’)
  10. paint_gray (ImageReduced, Image2, MixedImage)
  11. * /* Paint a rectangle into the image  */
  12. read_image (Image3, ‘G:/Halcon/images/images/pads.png’)
  13. gen_rectangle1 (Rectangle1, 30, 20, 100, 200)
  14. paint_region (Rectangle1, Image3, ImageResult, 255, ‘fill’)
  15. * /* Paint colored xld objects into a gray image */
  16. * /* read and copy image to generate a three channel image */
  17. copy_image (Image2, image0)
  18. copy_image (Image2, image1)
  19. compose3 (image0, Image2, image1, MultiChannelImage)
  20. * /* extract subpixel border */
  21. threshold_sub_pix (MultiChannelImage, Border, 128)
  22. * /* select the circle and the arrows */
  23. circle := Border[14]
  24. arrow := Border[16]
  25. ObjectsConcat := [circle,arrow]
  26. * /* paint a green circle and white arrows (to paint all
  27. * * objects e.g. blue, pass [0,0,255] tuple for GrayVal) */
  28. paint_xld (ObjectsConcat, MultiChannelImage, ImageResult1, [0,1,0,1,1,255])

转载注明来源:CV视觉网 » 博客halcon学习经验总结(1)

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

2不错 2超赞 0无聊 0扯淡 0不解 0路过

评论 抢沙发

评论前必须登录!