【Halcon學(xué)習(xí)筆記】08.圖像測量(2D)
1.概述
????????Halcon中的2D Metrology模塊提供了亞像素級別的卡尺測量功能,可以測量的幾何形狀包括直線、圓、橢圓、矩形。
????????2D測量模型使用起來相對方便,如要測圓的半徑,只要設(shè)置圓心坐標(biāo)和模板半徑,之后就能在模板半徑內(nèi)設(shè)置個測量范圍,在測量范圍內(nèi)的邊緣會被提取出來,從而自動測出圓的實際半徑。

2. 相關(guān)概念
2.1 計量模型(metrology model)
? ? ? ? ? 包含所有計量對象、測量所需的所有信息以及測量結(jié)果的數(shù)據(jù)結(jié)構(gòu)。
2.2 計量對象(metrology object)
????????用2D計量測量對象的數(shù)據(jù)結(jié)構(gòu)。計量對象由特定的幾何形狀表示,形狀參數(shù)大致為已知。此外,它包含控制測量的參數(shù),例如指定測量區(qū)域的尺寸和分布的參數(shù)。
2.3 測量區(qū)域(measure regions)
????????排列垂直于近似對象邊界的矩形區(qū)域。在這些區(qū)域中,提取用于獲取計量對象精確形狀參數(shù)的邊緣。
3. 相關(guān)算子
3.1 創(chuàng)建
????????create_metrology_model(MetrologyHandle)
????????MetrologyHandle:測量模型句柄
3.2 添加
3.2.1添加直線測量對象到模型? ????????????
????????add_metrology_object_line_measure()
????????MetrologyHandle:測量模型句柄
????????RowBegin:測量區(qū)域行坐標(biāo)起點
????????ColumnBegin:測量區(qū)域列坐標(biāo)起點
????????RowEnd:測量區(qū)域行坐標(biāo)終點
????????ColumnEnd:測量區(qū)域列坐標(biāo)終點
????????MeasureLength1:垂直于邊界的測量區(qū)域的一半長度
????????MeasureLength2:相切于邊界的測量區(qū)域的一半長度
????????MeasureSigma:用于平滑的高斯函數(shù)的 Sigma
????????MeasureThreshold:最小邊緣幅度閾值
????????GenParamName:通用參數(shù)的名稱
????????GenParamValue:通用參數(shù)值
????????Index:所創(chuàng)建的計量對象的索引

3.2.2 添加圓型測量對象到模型
????????add_metrology_object_circle_measure()
?????????MetrologyHandle:測量模型句柄
????????Row:測量區(qū)域的圓心行坐標(biāo)
????????Column:測量區(qū)域的圓行列坐標(biāo)
????????Radius:測量區(qū)域的半徑
? ? ? ? MeasureLength1:垂直于邊界的測量區(qū)域的一半長度
????????MeasureLength2:相切于邊界的測量區(qū)域的一半長度
? ? ? ? MeasureSigma:用于平滑的高斯函數(shù)的 Sigma
????????MeasureThreshold:最小邊緣幅度閾值
????????GenParamName:通用參數(shù)的名稱
????????GenParamValue:通用參數(shù)值
????????Index:所創(chuàng)建的計量對象的索引

3.2.3 添加橢圓測量對象到模型
????????add_metrology_object_ellipse_measure()
3.2.3 添加矩形測量對象到模型
????????add_metrology_object_rectangle2_measure()
3.3?設(shè)置
3.3.1 設(shè)置測量對象參數(shù)
????????set_metrology_object_param()
????????MetrologyHandle:測量模型句柄
????????Index:指定計量對象,為all時所有計量對象的參數(shù)都被設(shè)置('all')
? ? ? ? GenParamName:通用參數(shù)的名稱
????????????????'measure_length1':區(qū)域,垂直于邊界的測量區(qū)域的一半長度
? ? ????????????'measure_length2':區(qū)域,相切于邊界的測量區(qū)域的一半長度
????????????????'measure_distance':區(qū)域,兩個測量區(qū)域中心之間的距離
????????????????'num_measures':區(qū)域,測量區(qū)域數(shù)
????????????????'measure_sigma':測量,用于平滑的高斯函數(shù)的 Sigma
????????????????'measure_threshold':測量,最小邊緣幅度閾值
????????????????'measure_select':測量,邊緣端點的選擇('last'、'first')
????????????????'measure_transition':測量,方向('all'、'negative'、?'positive')
????????????????'measure_interpolation':測量,插值類型
????????????????'min_score':擬合,最小分數(shù)
????????????????'num_instances':擬合,成功擬合實例的最大數(shù)量
????????????????'distance_threshold':擬合,距離閾值
????????GenParamValue:通用參數(shù)值
3.3.2 設(shè)置對整個計量模型有效的參數(shù)
????????set_metrology_model_param()
????????MetrologyHandle:測量模型句柄
????????GenParamName:通用參數(shù)的名稱
????????????????'camera_param':是否使用相機內(nèi)部參數(shù)
????????????????'plane_pose':是否相機三維姿態(tài)
????????????????'reference_system':根據(jù)圖像坐標(biāo)系的平移(行、列)和旋轉(zhuǎn)角度(角度),定義一種新的參考系統(tǒng)
????????????????'scale':期望單位與原始單位的比率
? ? ? ? GenParamValue:通用參數(shù)值
3.3.3 對齊測量模型位置(校準(zhǔn))
????????align_metrology_model()
????????MetrologyHandle:測量模型句柄
? ? ????Row:對齊測量模型的行坐標(biāo)
? ? ????Column:對齊測量模型的列坐標(biāo)
????????Angle:對齊測量模型的旋轉(zhuǎn)角度
3.4 執(zhí)行
????????apply_metrology_model()
????????Image:輸入的測量圖像
????????MetrologyHandle:測量模型句柄
3.5?獲取
3.5.1?獲取計量模型的計量對象的測量區(qū)域和邊緣位置結(jié)果
????????get_metrology_object_measures()
????????Contours:測量區(qū)域的矩形 XLD 輪廓
????????MetrologyHandle:測量模型句柄
????????Index:指定計量對象,為all時所有計量對象的參數(shù)都被設(shè)置('all')
????????Transition:選擇亮/暗或暗/亮邊緣('all'、'negative'、?'positive')
????????Row:測量邊緣的行坐標(biāo)集
????????Column:測量邊緣的列坐標(biāo)集
3.5.2?獲取計量模型的計量對象的結(jié)果輪廓
????????get_metrology_object_result_contour()
????????Contour:給定計量對象的結(jié)果輪廓。
????????MetrologyHandle:測量模型句柄
????????Index:指定計量對象,為all時所有計量對象的參數(shù)都被設(shè)置('all')
????????Instance:計量對象的實例('all')
????????Resolution:相鄰輪廓點之間的距離
3.5.3 獲取計量模型的計量對象的結(jié)果
????????get_metrology_object_result()
? ? ? ? Contour:給定計量對象的結(jié)果輪廓。
????????MetrologyHandle:測量模型句柄
????????Index:指定計量對象,為all時所有計量對象的參數(shù)都被設(shè)置('all')
????????GenParamName:通常設(shè)置為’result_type’,表示用GenParamValue返回方式和結(jié)果
????????GenParamValue:通常設(shè)置為’all_param’,表示將所有測量參數(shù)到Parameter
? ? ????Parameter:返回的參數(shù)值
????????????????對于直線:返回?[‘row_begin’,‘column_begin’,‘row_end’,‘column_end’]
????????????????對于圓型:返回[‘row’,‘column’,‘radius’]或 [‘x’,‘y’,‘radius’]
????????????????對于橢圓:返回[‘row’,‘column’,‘phi’,‘radius1’,‘radius2’]
????????????????對于矩形:返回[‘row’,‘column’,‘phi’,‘length1’,‘length2’]
3.6 釋放
????????clear_metrology_model()
????????MetrologyHandle:測量模型句柄
4.模型測量在Halcon中的應(yīng)用步驟
4.1 應(yīng)用步驟

4.2 例程要求????
????????測量矩形標(biāo)簽的像素長度。

4.3 實現(xiàn)步驟
1)找到模板圖片的區(qū)域中心(跟隨對齊用)
? ? ? ? var_threshold (Image, Region, 100, 100, 0.5, 5, 'dark')
? ? ? ? fill_up (Region, RegionFillUp)
? ? ? ? connection (RegionFillUp, ConnectedRegions)
? ? ? ? select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)?
? ? ? ? smallest_rectangle2 (SelectedRegions, RowM, ColumnM, PhiM, Length1, Length2)
? ? ? ? disp_cross (WindowHandle, RowM, ColumnM, 100, PhiM)

2)畫出模板圖片的測量區(qū)域
? ? ? ? recR:=1830
? ? ? ? recC:=2220
? ? ? ? recA:=0
? ? ? ? recL1:=960
? ? ? ? recL2:=70
? ? ? ? gen_rectangle2 (rec, recR, recC, rad(recA), recL1, recL2)

3)創(chuàng)建測量模型句柄
? ? ? ? create_metrology_model (MetrologyHandle)
4)添加直線測量模型
? ? ? ? add_metrology_object_line_measure (MetrologyHandle, recR, recC-recL1,recR, recC+recL1, recL1/4, recL2/2, 1, 20, [], [], Index)

5)設(shè)置測量對象參數(shù)
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_length1', 50)?
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_length2', 10)
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_threshold', 20)
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_distance', 20)
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'min_score',0.6)
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_sigma', 1)
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', 'all')
? ? ? ? set_metrology_object_param (MetrologyHandle, 'all', 'measure_select', 'all')
? ? ? ? set_metrology_model_param (MetrologyHandle, 'reference_system', [RowM, ColumnM,PhiM])?
6)找到運行圖片的區(qū)域中心(跟隨對齊用)
? ? ? ? var_threshold (Image, Region, 100, 100, 0.5, 5, 'dark')
? ? ? ? fill_up (Region, RegionFillUp)
? ? ? ? connection (RegionFillUp, ConnectedRegions)
? ? ? ? select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)?
? ? ? ? smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Length1, Length2)

7)跟隨對齊測量模型
(理解:上面的測量卡尺已經(jīng)創(chuàng)建好了,目前的問題在于將卡尺放在哪個位置。設(shè)置一個模板的跟隨點,就是說模板圖片卡尺在RowM, ColumnM的位置,現(xiàn)在同樣找到測試圖片的Row, Column的位置,就有對應(yīng)關(guān)系可以對齊卡尺,原理同仿射變換)
? ? ? ? align_metrology_model (MetrologyHandle, Row, Column,Phi)

8)執(zhí)行測量
? ? ? ? apply_metrology_model (Image, MetrologyHandle)
9)獲取測量數(shù)據(jù)
? ? ? ? get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
????????get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
????????get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)
10)計算測量數(shù)據(jù)
? ? ? ? ? ? distance_pp (Parameter[0], Parameter[1], Parameter[2], Parameter[3], Distance)
? ? ? ? ? ? disp_message (WindowHandle, 'Lenght:'+Distance, 'window', 0, 10, 'green', 'false')

11)釋放模型
????????? ? clear_metrology_model (MetrologyHandle)

by Ryou2-