我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里,初学的朋友可以一起交流哦!地址(Gitee)


第四章 HALCON数据结构

HALCON数据结构主要有图形参数控制参数两类

HALCON Image图像#

根据像素点的信息可以分为二值图像灰度图像RGB图像

图像通道#

图像通道可以看作一个二维数组,每个像素点(r,c)的灰度值可以被解释为矩阵g=fr,s的一个元素

HALCON中有关图像通道的算子:

append_channel(MultiChannelImage, Image : ImageExtended : : )
作用: 将MultiChannelImageImage两个图像的通道叠加得到新图像

decompose3(MultiChannelImage : Image1, Image2, Image3 : : )
作用:转换三通道图像为三个单通道灰度图像

image_to_channels(MultiChannelImage : Images : : )
作用:将多通道图像转换为多幅单通道图像

compose3(Image1, Image2, Image3 : MultiChannelImage : : )
作用:将三个单通道灰度图像合并为一个三通道彩色图像

channels_to_image(Images : MultiChannelImage : : )
作用:将多幅单通道图像合并成一幅多通道彩色图像

count_channels(MultiChannelImage : : : Channels)
作用:计算图像的通道数

trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )
作用:将彩色图像从RGB空间转换到其他颜色空间

get_image_pointer1(Image : : : Pointer, Type, Width, Height)
作用:获得单通道图像的指针

get_image_pointer3(ImageRGB : : : PointerRed, PointerGreen, PointerBlue, Type, Width, Height)
作用:获取多通道图像的指针

  • 图像通道程序
* 读取图像
read_image (Image, 'claudia.png')
* 计算图像的通道数
count_channels (Image, Channel_Nums)
* 循环读取每个通道的图像
for index := 1 to Channel_Nums by 1
    * 获取多通道图像中指定通道的图像
    access_channel (Image, channel_image, index)
endfor
* 分解通道
decompose3 (Image, imageR, ImageG, ImageB)
* GRB通道转HSV通道
trans_from_rgb (imageR, ImageG, ImageB, ImageResult1, ImageResult2, ImageResult3, 'hsv')
* 合并通道
compose2 (imageR, ImageG, MultiChannelImage)
* 向图像添加通道
append_channel (MultiChannelImage, ImageB, ImageExtended)
* 显示图像
dev_display (ImageExtended)

运行结果如下图

Image其他算子

gen_image_const( : Image : Type, Width, Height : )
作用:创建灰度值为0的图像(黑色)

gen_image_proto(Image : ImageCleared : Grayval : )
作用:指定图像像素为同一灰度值

get_image_size(Image : : : Width, Height)
作用:计算图像尺寸

get_domain(Image : Domain : : )
作用:得到图像定义域

crop_domain(Image : ImagePart : : )
作用:裁剪图像得到新图像

get_grayval(Image : : Row, Column : Grayval)
作用:获得图像像素点的灰度值

set_grayval(Image : : Row, Column, Grayval : )
作用:设置图像像素点的灰度值

依靠上面这些常用算子,我们可以做个渐变的效果

* 创建灰度值为0的图像
gen_image_const (Image, 'byte', 100, 100)
* 计算图像尺寸
get_image_size (Image, Width, Height)
* 指定图像像素为同一灰度值
gen_image_proto (Image, ImageCleared, 127)
* 得到图像的定义域
get_domain (Image, Domain)
* 裁剪图像得到新图像
crop_domain (Image, ImagePart)
* 获取某像素点的灰度值
get_grayval (ImagePart, 50, 50, Grayval)
gray_num:=0
* 开始循环
for i := 0 to 51 by 1
    for j := 0 to 51 by 1
        * 设置某像素点的灰度值
        set_grayval (ImagePart, 23+i, 23+j, gray_num)
        gray_num:=gray_num+5
    endfor
    gray_num:=0
endfor

运行结果如下图
HALCON Region区域#

很多情况下,我们将图像处理限制在图像上某一特定的感兴趣区域(ROI)


Region的初步介绍#

将Image转换为区域通常用threshold算子、

threshold(Image : Region : MinGray, MaxGray : )
作用:阈值分割图像获得图像

选择出来的区域的灰度值g要满足


MinGraygMaxGray

如果图像是彩色图像,那么threshold只会返回针对第一通道的阈值分割区域

选择阈值我们通常会用到灰度直方图进行选择,并且可以在灰度直方图调整阈值时直观的看到区域变化,调整完之后可以直接插入代码

threshold(Image : Region : MinGray, MaxGray : )
作用:使用全局阈值分割图像

threshold算子只会返回一个区域,想要通过区域特征筛选区域,就需要将不同区域分离,在HALCON环境下通常用connection算子

connection(Region : ConnectedRegions : : )
作用:计算一个区域中连通的区域

分离后可以通过区域的特征筛选出想要的区域

除了用阈值分割得到区域,还可以用区域生长法得到区域
区域生长法通常用regiongrowing算子

regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : )
作用:使用区域生长法分割图像获得区域

区域生长分割图像的思路:在图像内移动大小为Row×Column 的矩形模版,对比图像与模版中心的灰度值,当两个灰度值差值小于一定值是认为是同一区域

HALCON可以通过算子获得指定区域的灰度直方图,并将获得的直方图转换为区域,通常用到gray_histogen_region_histo算子

gray_histo(Regions, Image : : : AbsoluteHisto, RelativeHisto)
作用:获得图像指定区域的灰度直方图

gen_region_histo( : Region : Histogram, Row, Column, Scale : )
作用:将获得的灰度直方图转换为区域

程序实例如下

read_image (Image, 'fabrik')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
dev_set_color ('red')
* 创建平行坐标轴的矩形
gen_rectangle1 (Rectangle, 20, 130, 90, 230)
dev_set_color ('green')
gen_rectangle1 (Rectangle1, 110, 400, 210, 500)
* 获取指定区域的灰度直方图
gray_histo (Rectangle, Image, AbsoluteHisto, RelativeHisto)
gray_histo (Rectangle1, Image, AbsoluteHisto1, RelativeHisto1)
dev_set_color ('blue')
* 将创建的灰度直方图转换为区域
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
dev_set_color ('orange red')
gen_region_histo (Region1, AbsoluteHisto1, 255, 255, 1)

运行结果如下图

Region特征分为三个部分

  1. 基础特征:面积、中心、宽高、左上和右下坐标、长短半轴等
  2. 形状特征:外接圆半径、内接圆半径、圆度、紧密度、矩形度、凸性等
  3. 几何矩特征:二阶距、三阶矩、主惯性轴等

区域特征

特征名 描述
area 面积
row 中心点行坐标
column 中心点列坐标
width 区域宽度
height 区域高度
row1 左上角行坐标
column1 左上角列坐标
row2 右下角行坐标
column2 右下角列坐标
circularity 圆度
compactness 紧密度
contlength 轮廓线总长度
convexity 凸性
rectangularity 矩形度
ra 等效椭圆长半轴
rb 等效椭圆短半轴
phi 等效椭圆方向
outer_radius 最小外接圆半径
inner_radius 最大内接圆半径
connect_num 连通数
holes_num 区域内洞数

根据特征筛选区域需要用到的算子是select_shape

select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
作用:选取指定形状特征的区域

区域转换用到的算子是shape_trans

shape_trans(Region : RegionTrans : Type : )
作用:将区域转换为其他规则形状
Type为转换的类型,选项如下:

  1. convex:凸区域
  2. ellipse:与输入区域有相同矩的椭圆区域
  3. outer_circle:最小外接圆
  4. inner_circle:最大内接圆
  5. rectangle1:平行于坐标轴的最小外接矩形
  6. rectangle2:任意方向最小外接矩形
  7. inner_rectangle1:平行于坐标轴的最大内接矩形
  8. inner_rectangle2:任意方向最大内接矩形

区域运算常用算子如下:

union1(Region : RegionUnion : : )
作用:返回所有输入区域的并集

union2(Region1, Region2 : RegionUnion : : )
作用:把两个区域合并成一个区域

difference(Region, Sub : RegionDifference : : )
作用:计算两个区域的差集

complement(Region : RegionComplement : : )
作用:计算区域的补集

区域运算例程如下

read_image (Image, 'largebw1.tif')
* 阈值分割
threshold (Image, Region, 200, 255)
* 计算区域连通的部分
connection (Region, ConnectedRegions)
* 按特征选取区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500000, 6000000)
* 联通有联通性质的区域
union1 (SelectedRegions, RegionUnion)
* 合并两个区域
union2 (RegionUnion, Region, RegionUnion1)
* 计算两个区域的差
dev_set_color ('yellow')
difference (Region, RegionUnion, RegionDifference)
* 计算区域间的补集
dev_set_color ('black')
complement (RegionDifference, RegionComplement)

运行结果如下:


Region的点与线#

在窗口上画线使用的是disp_line算子

disp_line( : : WindowHandle, Row1, Column1, Row2, Column2 : )
作用:在窗口画线

disp_有关的算子不能适应窗口的放大和缩小操作,放大或缩小时会消失

可以用gen_region_line创建线形状的区域

gen_region_line( : RegionLines : BeginRow, BeginCol, EndRow, EndCol : )
作用:根据两个像素坐标生成线

获取点和线的坐标可以用get_region_points算子

get_region_points(Region : : : Rows, Columns)
作用:获得区域的像素点坐标

判断区域是否相交可以用intersection

intersection(Region1, Region2 : RegionIntersection : : )
作用:获得两区域的交集

区域方向有关的算子:

line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi)
作用:计算直线方向

orientation_region(Regions : : : Phi)
作用:计算区域方向(弧度值)

angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle)
作用:计算两直线夹角

line_position( : : RowBegin, ColBegin, RowEnd, ColEnd : RowCenter, ColCenter, Length, Phi)
作用:计算线段的中心、长度、方向

区域方向的例程运行结果如下图所示

区域距离常用算子:

distance_pp( : : Row1, Column1, Row2, Column2 : Distance)
作用:计算点到点距离

distance_pl( : : Row, Column, Row1, Column1, Row2, Column2 : Distance)
作用:计算点到线距离

distance_ps( : : Row, Column, Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)
作用:计算点到线段距离

distance_rr_min(Regions1, Regions2 : : : MinDistance, Row1, Column1, Row2, Column2)
作用:计算区域间最近距离和对应的最近点

distance_lr(Region : : Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)
作用:计算线到区域最近距离和最远距离

distance_sr(Region : : Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)
作用:计算线段到区域的最近距离和最远距离

区域距离示例程序如下

dev_close_window ()
dev_open_window (0, 0, 300, 300, 'white', WindowHandle)
dev_set_color ('black')
* 生成点区域
gen_region_points (Region, 100, 100)
* 获得点区域的坐标
get_region_points (Region, Rows, Columns)
* 画线
disp_line (WindowHandle, Rows, Columns, 64, 64)
* 生成直线区域
gen_region_line (RegionLines, 100, 50, 150, 250)
gen_region_line (RegionLines3, 45, 150, 125, 225)
* 获得直线区域的坐标
get_region_points (RegionLines, Rows2, Columns2)
gen_region_line (RegionLines1, Rows, Columns, 150, 130)
* 求两直线区域的交点
intersection (RegionLines, RegionLines1, RegionIntersection)
* 获得交点坐标
get_region_points (RegionIntersection, Rows1, Columns1)
* 获得直线区域的方向
line_orientation (Rows, Columns, Rows1, Columns1, Phi)
gen_region_line (RegionLines2, Rows, Columns, Rows1, Columns1)
* 获得直线区域的方向
orientation_region (RegionLines2, Phi1)
* 计算线段的中心、长度、方向
line_position (Rows, Columns, Rows1, Columns1, RowCenter, ColCenter, Length, Phi2)
* 计算点到点的距离
distance_pp (Rows, Columns, Rows1, Columns1, Distance)
* 计算点到线的距离
distance_pl (200, 200, Rows, Columns, Rows1, Columns1, Distance1)
* 计算点到线段的距离
distance_ps (200, 200, Rows, Columns, Rows1, Columns1, DistanceMin, DistanceMax)
* 计算Region到Region的最短距离和对应的最近点
distance_rr_min (RegionLines2, RegionLines3, MinDistance, Row1, Column1, Row2, Column2)
distance_lr (RegionLines2, 45, 150, 125, 225, DistanceMin1, DistanceMax1)
distance_sr (RegionLines2, 45, 150, 125, 225, DistanceMin2, DistanceMax2)

运行结果如下图

生成形状规则区域常用算子如下

gen_circle( : Circle : Row, Column, Radius : )
作用:生成圆形区域

gen_ellipse( : Ellipse : Row, Column, Phi, Radius1, Radius2 : )
作用:生成椭圆区域

gen_rectangle1( : Rectangle : Row1, Column1, Row2, Column2 : )
作用:生成平行于坐标轴的矩形区域

gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
作用:生成任意方向的矩形区域

gen_region_polygon( : Region : Rows, Columns : )
作用:将多边形转换为区域

规则形状区域程序运行效果如下图


Region的行程#

区域行程有关算子如下

gen_region_runs( : Region : Row, ColumnBegin, ColumnEnd : )
作用:根据同行坐标值生成同行行程

get_region_runs(Region : : : Row, ColumnBegin, ColumnEnd)
作用:获得区域的行程坐标

runlength_features(Regions : : : NumRuns, KFactor, LFactor, MeanLength, Bytes)
作用:统计区域行程的特征

eliminate_runs(Region : RegionClipped : ElimShorter, ElimLonger : )
作用:消除长度小于ElimShorter和大于ElimLonger的行程

区域行程程序如下

* 根据同行坐标生成行程区域
gen_region_runs (Region, 100, 50, 200)
* 获得行程区域坐标
get_region_runs (Region, Row, ColumnBegin, ColumnEnd)
* 统计区域行程特征
runlength_features (Region, NumRuns, KFactor, LFactor, MeanLength, Bytes)
dev_clear_window ()
* 画圆
gen_circle (Circle, 200, 200, 100.5)
set_system ('neighborhood', 8)
dev_set_color ('green')
* 消除制定长度的行程
eliminate_runs (Circle, RegionClipped, 100, 205)
dev_display (RegionClipped)

程序运行结果如下图


Region的区域特征#

  • 1.1 区域的面积
    区域面积等于区域包含像素点个数

  • 1.2 区域的中心
    区域的中心坐标是计算区域内所有像素点坐标的平均值

可以用area_center求取区域的面积和中心坐标

area_center(Regions : : : Area, Row, Column)
作用:得到区域的面积和中心坐标

  • 2 区域矩特征

矩特征主要表征图像区域的几何特征,由于其具有旋转、平移、尺度等不变特征,又称不变矩

阶特征矩的公式为


mp,q=(r,c)Rrpcq

  • 3 区域等效椭圆特征

HALCON求等效椭圆参数

elliptic_axis(Regions : : : Ra, Rb, Phi)
作用:计算等效椭圆参数

区域等效椭圆示例

dev_close_window ()
read_image (Image, 'fabrik')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_color ('orange')
dev_set_draw ('fill')
regiongrowing (Image, Regions, 1, 1, 3, 400)
select_shape (Regions, SelectedRegions, ['area','area'], 'or', [20195.3,30039.1], [21104.2,33242.2])
union1 (SelectedRegions, RegionUnion)
dev_set_color ('red')
dev_display (RegionUnion)
* 获取区域等效椭圆参数
elliptic_axis (RegionUnion, Ra, Rb, Phi)
area_center (RegionUnion, Area, Row, Column)
dev_set_draw ('margin')
dev_set_color ('white')
dev_set_line_width (5)
* 画椭圆
disp_ellipse (WindowHandle, Row, Column, Phi, Ra, Rb)

程序运行结果如下图

  • 4 区域凸性特征

区域内任意两点进行连线,连线上的所有点都在区域内就称这个区域为凸集,凸包为区域内所有点构成的最小凸集

关于凸性,HALCON中常用的算子如下

convexity(Regions : : : Convexity)
作用:计算区域的凸性

smallest_circle(Regions : : : Row, Column, Radius)
作用:计算最小外接圆参数

smallest_rectangle1(Regions : : : Row1, Column1, Row2, Column2)
作用:计算平行坐标轴的最小外接矩形参数

smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)
作用:计算区域任意方向的最小外接矩形参数

区域凸性程序运行结果如下图

  • 5 区域轮廓长度特征

轮廓长度是跟踪区域边界获得轮廓,将边界上的所有点连接在一起,相邻两个轮廓点距离为1,对角线距离为2

使用contlength算子可以计算区域轮廓长度

contlength(Regions : : : ContLength)
作用:计算区域长度

  • 6 区域圆度特征
  1. circularity算子计算区域圆度

circularity是计算区域的面积和外接圆的面积之比,其比值越接近1,则形状越接近圆

circularity(Regions : : : Circularity)
作用:计算区域的圆度

  1. roundness算子计算区域圆度

roundness是计算区域边界点到区域中心点距离的偏差,区域所有边界点到中心的距离越接近,圆度值越大

roundness(Regions : : : Distance, Sigma, Roundness, Sides)
作用:计算区域的圆度

  • 7 区域矩形度特征

矩形度为区域面积除以与本区域有相同一阶矩和二阶距的矩形的面积,得到的值越接近1,区域就越接近矩形,可以用rectangularity

rectangularity(Regions : : : Rectangularity)
作用:计算区域的矩形度

  • 8 区域紧密度特征

区域的紧密度公式为


C=L24Fπ

有时紧密度也称为粗糙度,圆的边界是绝对光滑的,故圆的紧密度为1,其他图形紧密度大于1,HALCON可以用compactness算子计算区域紧密度

compactness(Regions : : : Compactness)
作用:计算区域的紧密度

  • 9 区域离心率特征

离心率是通过等效椭圆得到的,可以反映区域的细长度,值越大区域越细长,可以用eccentricity计算区域离心率

eccentricity(Regions : : : Anisometry, Bulkiness, StructureFactor)
作用:计算区域的离心率

区域特征程序如下

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
* 生成矩形区域
gen_rectangle1 (Rectangle, 30, 20, 200, 300)
* 生成圆形区域
gen_circle (Circle, 300, 300, 50)
* 矩形区域凸性
convexity (Rectangle, Convexity)
* 圆形区域凸性
convexity (Circle, Convexity1)
* 矩形区域圆度
circularity (Rectangle, Circularity)
* 圆形区域圆度
circularity (Circle, Circularity1)
* 矩形区域矩形度
rectangularity (Rectangle, Rectangularity)
* 圆形区域矩形度
rectangularity (Circle, Rectangularity1)
* 矩形区域紧密度
compactness (Rectangle, Compactness)
* 圆形区域紧密度
compactness (Circle, Compactness1)
* 矩形区域离心率
eccentricity (Rectangle, Anisometry, Bulkiness, StructureFactor)
* 圆形区域离心率
eccentricity (Circle, Anisometry1, Bulkiness1, StructureFactor1)

程序运行结果如下图

HALCON XLD轮廓#


XLD的初步介绍#

  1. XLD定义

XLD在HALCON中代表亚像素边缘和多边形,利用XLD可以获得亚像素精度的数据
XLD轮廓用浮点数表示XLD各点的行、列坐标

  1. Image转换为XLD

提取XLD轮廓用threshold_sub_pixedges_sub_pix

threshold_sub_pix(Image : Border : Threshold : )
作用:从具有像素精度的图像提取得到XLD轮廓

edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
作用:使用'deriche1'、'lanser1'、'deriche2'、'lanser2'、'shen'、'mshen'、'canny', 'sobel'、'sobel_fast'等滤波器提取图像得到亚像素边缘

  1. XLD的特征

包括基础特征形状特征云点特征几何矩特征
基础特征:XLD面积、中心、宽高、左上角与右下角坐标
形状特征:圆度、紧密度、长度、矩形度、凸性、偏心率等
云点特征:云点面积、面积、等效椭圆半轴等
几何矩特征:二阶距等

  1. 选取特定特征的XLD轮廓

常用算子有select_shape_xldselect_contours_xld

select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : )
作用:选择特定形状特征要求的XLD轮廓或多边形

select_contours_xld(Contours : SelectedContours : Feature, Min1, Max1, Min2, Max2 : )
作用:选择多种特征要求的XLD轮廓

选择特定XLD轮廓示例程序如下

read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-12.0/examples/images/rings/mixed_03.png')
* 从具有像素精度的图像提取得到XLD轮廓
threshold_sub_pix (Image, Border, 128)
* 提取像素得到亚像素边缘
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
* 选定特定形状特征要求的XLD轮廓或多边形
select_shape_xld (Edges, SelectedXLD, 'area', 'and', 3000, 99999)
* 选择多种特征要求的XLD轮廓
select_contours_xld (Edges, SelectedContours, 'contour_length', 1, 200, -0.5, 0.5)

程序运行结果如下图


XLD的数据结构分析#

区域或多边形转换为亚像素轮廓的算子如下

gen_contour_region_xld(Regions : Contours : Mode : )
作用:区域Region转换为XLD轮廓

Mode有边界方式和中心方式

边界和孔洞是以区域的边界点以及区域内的孔洞边界为边缘点构成XLD,在由区域生成XLD时,多数是以像素边界或中心作为边界生成XLD,这是XLD的精度是像素级的,这种XLD区域不用于精确计算,根据图像获得的XLD才是亚像素级的

得到已知XLD轮廓的坐标点可以用get_contour_xld

get_contour_xld(Contour : : : Row, Col)
作用:获得XLD的坐标点

gen_contour_polygon_xld( : Contour : Row, Col : )
作用:由多边形坐标点生成XLD

gen_polygons_xld(Contours : Polygons : Type, Alpha : )
作用:多边形逼近轮廓生成XLD

gen_ellipse_contour_xld( : ContEllipse : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder, Resolution : )
作用:生成椭圆XLD

gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )
作用:生成圆(圆弧)XLD

区域或多边形转换为XLD程序运行结果如下图

XLD轮廓附加属性有关算子如下

query_contour_attribs_xld(Contour : : : Attribs)
作用:查询XLD包含哪些属性名称

get_contour_attrib_xld(Contour : : Name : Attrib)
作用:计算XLD包含属性的值

XLD轮廓附加属性示例程序如下

dev_close_window ()
read_image (Image, 'screw_thread.png')
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
dev_display (Image)
* 阈值分割得到XLD轮廓
threshold_sub_pix (Image, Border, 128)
* 亚像素边缘提取
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
threshold (Image, Region, 0, 100)
select_shape_xld (Edges, SelectedXLD, 'area', 'and', 20000, 99999)
* 填充区域
fill_up (Region, RegionFillUp)
* 根据区域生成XLD轮廓,选择边界方式
gen_contour_region_xld (RegionFillUp, Contours, 'border')
area_center_xld (Contours, Area, Row, Column, PointOrder)
* 选择指定特征要求的XLD轮廓
select_shape_xld (Contours, SelectedXLD1, 'area', 'and', 150, 999999)
* 获取XLD轮廓坐标
get_contour_xld (SelectedXLD1, Row1, Col)
* 生成由一个点构成的XLD
gen_contour_polygon_xld (Contour, 150, 450)
* 生成XLD构成的直线
gen_contour_polygon_xld (Contour1, [150,300], [400,500])
query_contour_attribs_xld (SelectedXLD, Attribs)
get_contour_attrib_xld (SelectedXLD, 'angle', Attrib)

程序运行结果如下图


XLD的特征分析#

XLD可以看作点云的情况有:

  1. XLD自相交

  2. XLD的结束点和开始点之间的区域不能构成封闭的XLD

可以用两个算子观察XLD点和XLD点云的区别

area_center_xld(XLD : : : Area, Row, Column, PointOrder)
作用:求XLD面积中心及点的排列次序

area_center_points_xld(XLD : : : Area, Row, Column)
作用:求XLD点云的面积和中心

生成封闭XLD和不封闭XLD的轮廓程序如下

* 封闭多边形
gen_contour_polygon_xld (Contour, [10,100,100,50,10], [10,10,100,100,10])
area_center_xld (Contour, Area, Row, Column, PointOrder)
area_center_points_xld (Contour, Area1, Row1, Column1)

* 不封闭多边形
gen_contour_polygon_xld (Contour1, [10,100,100,50], [110,110,210,210])
area_center_xld (Contour1, Area2, Row2, Column2, PointOrder1)
area_center_points_xld (Contour1, Area3, Row3, Column3)

程序运行结果如下图

XLD点云面积为4,因为生成XLD的关键点有4个
封闭XLD面积就是所围区域的面积

XLD其他特征有关算子如下

test_self_intersection_xld(XLD : : CloseXLD : DoesIntersect)
作用:判断XLD是否自相交

这个还是比较重要的,建议还是多检查

XLD自相交的情况:

  1. 开始点是交叉点
  2. 结束点是交叉点
  3. 开始点和结束点都是交叉点
  4. 除开始点和结束点外其他都是交叉点

close_contours_xld(Contours : ClosedContours : : )
作用:闭合XLD轮廓

elliptic_axis_xld(XLD : : : Ra, Rb, Phi)
作用:获得XLD的等效椭圆参数

diameter_xld(XLD : : : Row1, Column1, Row2, Column2, Diameter)
作用:计算XLD上距离最远的两个点和最远距离

smallest_rectangle1_xld(XLD : : : Row1, Column1, Row2, Column2)
作用:获得平行于坐标轴的最小外接矩形的左上角和右下角坐标

smallest_rectangle2_xld(XLD : : : Row, Column, Phi, Length1, Length2)
作用:获得任意角度的最小外接矩形中心坐标

moments_xld(XLD : : : M11, M20, M02)
作用:获得XLD的封闭区域的二阶距

XLD特征示例程序如下

* 生成区域圆
gen_circle (Circle, 50, 50, 50)
* 生成椭圆XLD
gen_ellipse_contour_xld (ContEllipse, 50, 150, 0, 50, 30, 0, rad(360), 'positive', 1.5)
* 生成圆XLD
gen_circle_contour_xld (ContCircle, 50, 250, 50, 0, 6.28318, 'positive', 1)
* 根据圆弧生成多边形,多边形的边到圆的最大距离为10
gen_polygons_xld (ContCircle, Polygons, 'ramer', 10)
* 检测圆XLD是否自相交
test_self_intersection_xld (ContCircle, 'true', DoesIntersect)
* 获得XLD中心、面积与点排序
area_center_xld (ContCircle, Area, Row, Column, PointOrder)
* 获得圆区域的中心及面积
area_center (Circle, Area1, Row1, Column1)
* 根据点生成三角形XLD
gen_contour_polygon_xld (Contour, [200,400,400,200], [250,120,430,250])
* 获取三角形XLD中心、面积与点排序
area_center_xld (Contour, Area2, Row2, Column2, PointOrder1)
test_self_intersection_xld (Contour, 'true', DoesIntersect1)
* XLD作为点云求中心面积
area_center_points_xld (Contour, Area3, Row3, Column3)
* 获得已生成的多边形XLD各点长度与角度
get_polygon_xld (Polygons, Row4, Col, Length, Phi)
* 获得椭圆XLD的等效椭圆参数
elliptic_axis_xld (Contour, Ra, Rb, Phi1)
* 获得椭圆XLD的圆度
circularity_xld (Contour, Circularity)
* 获得椭圆XLD的凸性
convexity_xld (Contour, Convexity)
* 获得椭圆XLD的紧密度
compactness_xld (Contour, Compactness)
* 计算XLD上距离最远的两个点和最远距离
diameter_xld (Contour, Row11, Column11, Row21, Column21, Diameter)
* 获得平行于坐标轴的最小外接矩形的左上和右下角坐标
smallest_rectangle1_xld (Contour, Row12, Column12, Row22, Column22)
* 获得任意角度的最小外接矩形的中心坐标
smallest_rectangle2_xld (Contour, Row5, Column4, Phi2, Length1, Length2)
* 获得XLD封闭区域二阶距
moments_xld (Contour, M11, M20, M02)

程序运行结果如下图


XLD的回归参数#

这里我没看懂,有书的朋友们可以自己研究哈,我就只把算子和例程放出来就好了

regress_contours_xld(Contours : RegressContours : Mode, Iterations : )
作用:计算XLD轮廓的回归直线

get_regress_params_xld(Contours : : : Length, Nx, Ny, Dist, Fpx, Fpy, Lpx, Lpy, Mean, Deviation)
作用:获得轮廓XLD的参数

例程如下

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
gen_circle_contour_xld (ContCircle, 290, 260, 100, 0, 1, 'positive', 1)
* 获得XLD的全局属性的名字
query_contour_global_attribs_xld (ContCircle, Attribs)
* 计算XLD轮廓的回归直线
regress_contours_xld (ContCircle, RegressContours, 'no', 1)
query_contour_global_attribs_xld (RegressContours, Attribs1)
get_contour_global_attrib_xld (RegressContours, 'regr_norm_row', Attrib)
* 获得轮廓XLD的参数
get_regress_params_xld (RegressContours, Length, Nx, Ny, Dist, Fpx, Fpy, Lpx, Lpy, Mean, Deviation)

运行结果如下图


HALCON Tuple数组#

数组还是很重要的,三个程序如下

* 定义空数组
Tuple:=[]
* 指定数据定义数组
Tuple:=[1,2,3,4,5,6,7,8,9,10]
Tuple1:=[1,5,8,'giao']
Tuple2:=[0x04,010,9,'hello']
Tuple3:=gen_tuple_const(20,1) //创建一个有20个元素,每个元素值为1的数组
* 数组更改数值
Tuple[3]:=123
Tuple[5]:='芜湖'
* 数组取模
Num:=|Tuple|
* 合并数组
Union_Tuple:=[Tuple,Tuple1]
* 生成1~100内的数
Num1:=[1:100] //间距为1
Num2:=[1:3:100] //间距为3
* 提取数组内的数
Str:=Union_Tuple[5]
* 根据已知数组生成子数组
Sun_Tuple:=Union_Tuple[2:6]
Tuple:=[1,4,3]
Tuple1:=[1,2,5]
Tuple2:=[8,6,6]
* 加减乘除(前提是运行的数组元素个数要相同)
tuple_add (Tuple, Tuple1, Tuple2)
tuple_sub (Tuple, Tuple2, Tuple2)
tuple_mult (Tuple, Tuple1, Tuple2)
tuple_div (Tuple, Tuple1, Tuple2)
* 取余
tuple_mod (Tuple, Tuple1, Tuple2)
* 取反
tuple_neg (Tuple1, Neg)
* 数组取整
Neg:=[1,2,9.5]
tuple_int (Neg, Int)
tuple_round (Neg, Round)
* 数组转实数
tuple_real (Round, Real)

* 按位左移
tuple_lsh (Tuple, Tuple1, Tuple2)
* 按位右移
tuple_rsh (Tuple, Tuple1, Tuple2)
* 按位运算
tuple_band (Tuple, Tuple1, Tuple2) //按位与
tuple_bor (Tuple, Tuple1, Tuple2) //按位或
tuple_bxor (Tuple, Tuple1, Tuple2) //按位异或
tuple_bnot (11, Neg) //按位取反
tuple_bnot ([2,55],Neg)
T
Tuple:='hello'+'giao'
Tuple:=3.1+(2+'giao')

Tuple1:='giao'
Tuple2:='220'+Tuple1{1:3}+'芜湖'

* 取字符串长度
Length:=strlen(Tuple2)
* 选择字符串位置
Str:=strstr(Tuple2,Tuple1) //返回-1 代表没找到
Tuple2:='220giao芜湖'
Str:=strstr(Tuple2,Tuple1) //找到了,返回字符串的首字符位置
* 保存成长度为10的字符,字符左对齐,三位小数
Index:=29.99999$'.3f'
* 保存成小数点后七位的字符
Index:=123.456487687321$'.7f'
* 整数转换为小写十六进制
Index:=200$'x'
* 十六进制数转换为整数字符串
Index:=0x7f$'0.5d'

* 弧度转角度
phi:=deg(3.1415926)
* 角度转弧度
phi:=rad(120)
* 正弦、余弦、正切
val:=sin(120)
val:=cos(30)
val:=tan(45)

Tuple:=[1,2.5,10]
Tuple1:=[4,20,12]
* 数组内最小值、最大值
val:=min(Tuple)
val:=max(Tuple)
* 两数组对应位置最小值
Tuple2:=min2(Tuple,Tuple1)
* 两数组对应位置最大值
Tuple2:=max2(Tuple,Tuple1)

* 数组元素求和
val_sum:=sum(Tuple)
val_mean:=mean(Tuple)
val_abs:=abs(Tuple)

第四章的笔记就到这里啦,如果你一路看到了这里,帮我点个赞吧O(∩_∩)O~,祝大家学习能有所收获!