我在Gitee上建了個倉庫,會將學習書本的時候打的一些代碼上傳上去,筆記中所有代碼都在倉庫里,初學的朋友可以一起交流哦!地址(Gitee)
第四章 HALCON數據結構
HALCON數據結構主要有圖形參數和控制參數兩類
HALCON Image圖像
根據像素點的信息可以分為二值圖像、灰度圖像、RGB圖像
圖像通道
圖像通道可以看作一個二維數組,每個像素點(r,c)的灰度值可以被解釋為矩陣\(g=f_{r,s}\)的一個元素
HALCON中有關圖像通道的算子:
append_channel(MultiChannelImage, Image : ImageExtended : : )
作用: 將MultiChannelImage
和Image
兩個圖像的通道疊加得到新圖像
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要滿足
如果圖像是彩色圖像,那么threshold
只會返回針對第一通道的閾值分割區域
選擇閾值我們通常會用到灰度直方圖進行選擇,並且可以在灰度直方圖調整閾值時直觀的看到區域變化,調整完之后可以直接插入代碼
threshold(Image : Region : MinGray, MaxGray : )
作用:使用全局閾值分割圖像
threshold
算子只會返回一個區域,想要通過區域特征篩選區域,就需要將不同區域分離,在HALCON環境下通常用connection
算子
connection(Region : ConnectedRegions : : )
作用:計算一個區域中連通的區域
分離后可以通過區域的特征篩選出想要的區域
除了用閾值分割得到區域,還可以用區域生長法得到區域
區域生長法通常用regiongrowing
算子
regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : )
作用:使用區域生長法分割圖像獲得區域
區域生長分割圖像的思路:在圖像內移動大小為\(Row \times Column\) 的矩形模版,對比圖像與模版中心的灰度值,當兩個灰度值差值小於一定值是認為是同一區域
HALCON可以通過算子獲得指定區域的灰度直方圖,並將獲得的直方圖轉換為區域,通常用到gray_histo
和gen_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特征分為三個部分
- 基礎特征:面積、中心、寬高、左上和右下坐標、長短半軸等
- 形狀特征:外接圓半徑、內接圓半徑、圓度、緊密度、矩形度、凸性等
- 幾何矩特征:二階距、三階矩、主慣性軸等
特征名 | 描述 |
---|---|
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
為轉換的類型,選項如下:
- convex:凸區域
- ellipse:與輸入區域有相同矩的橢圓區域
- outer_circle:最小外接圓
- inner_circle:最大內接圓
- rectangle1:平行於坐標軸的最小外接矩形
- rectangle2:任意方向最小外接矩形
- inner_rectangle1:平行於坐標軸的最大內接矩形
- 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 區域矩特征
矩特征主要表征圖像區域的幾何特征,由於其具有旋轉、平移、尺度等不變特征,又稱不變矩
\(p+q\)階特征矩\(m_{p,q}\)的公式為
- 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,對角線距離為\(\sqrt {2}\)
使用contlength
算子可以計算區域輪廓長度
contlength(Regions : : : ContLength)
作用:計算區域長度
- 6 區域圓度特征
- 用
circularity
算子計算區域圓度
circularity
是計算區域的面積和外接圓的面積之比,其比值越接近1,則形狀越接近圓
circularity(Regions : : : Circularity)
作用:計算區域的圓度
- 用
roundness
算子計算區域圓度
roundness
是計算區域邊界點到區域中心點距離的偏差,區域所有邊界點到中心的距離越接近,圓度值越大
roundness(Regions : : : Distance, Sigma, Roundness, Sides)
作用:計算區域的圓度
- 7 區域矩形度特征
矩形度為區域面積除以與本區域有相同一階矩和二階距的矩形的面積,得到的值越接近1,區域就越接近矩形,可以用rectangularity
rectangularity(Regions : : : Rectangularity)
作用:計算區域的矩形度
- 8 區域緊密度特征
區域的緊密度公式為
有時緊密度也稱為粗糙度,圓的邊界是絕對光滑的,故圓的緊密度為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的初步介紹
- XLD定義
XLD在HALCON中代表亞像素邊緣和多邊形,利用XLD可以獲得亞像素精度的數據
XLD輪廓用浮點數表示XLD各點的行、列坐標
- Image轉換為XLD
提取XLD輪廓用threshold_sub_pix
和edges_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'等濾波器提取圖像得到亞像素邊緣
- XLD的特征
包括基礎特征、形狀特征、雲點特征、幾何矩特征
基礎特征:XLD面積、中心、寬高、左上角與右下角坐標
形狀特征:圓度、緊密度、長度、矩形度、凸性、偏心率等
雲點特征:雲點面積、面積、等效橢圓半軸等
幾何矩特征:二階距等
- 選取特定特征的XLD輪廓
常用算子有select_shape_xld
和select_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可以看作點雲的情況有:
-
XLD自相交
-
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自相交的情況:
- 開始點是交叉點
- 結束點是交叉點
- 開始點和結束點都是交叉點
- 除開始點和結束點外其他都是交叉點
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)
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~,祝大家學習能有所收獲!😀