Halcon 3D 表面匹配基于形狀

文章目錄

  • prepare_object_model_3d 準備 3D 物體模型
  • read_shape_model_3d — 讀取3D匹配模型
  • create_shape_model_3d 準備要匹配的3D模型
  • find_shape_model_3d ——發現匹配模型
  • project_shape_model_3d 將三維形狀模型的邊緣投影到圖像坐標中。
  • 示例
    • 'ignore_part_polarity':忽略更大區域的極性變化,能顯著加快紋理背景下的搜索速度
    • 'lowest_model_level'參數可減少內存需求
    • find_shape_model_3d 的 recompute_score 匹配精度
  • [Halcon 3D 表面匹配](https://blog.csdn.net/weixin_45672157/article/details/145792032)

prepare_object_model_3d 準備 3D 物體模型

prepare_object_model_3d( : : ObjectModel3D, Purpose, OverwriteData, GenParamName, GenParamValue : )ObjectModel3D類型: object_model_3d(-array)(integer)描述: 3D對象模型的句柄。這是對正在處理的3D對象的引用。Purpose(用途)類型: string → (string)描述: 3D對象模型的用途。默認值: 'shape_based_matching_3d'建議值: 'shape_based_matching_3d', 'segmentation', 'distance_computation'OverwriteData(覆蓋數據)類型: string → (string)描述: 指定是否覆蓋已存在的數據。默認值: 'true'可選值: 'false', 'true'GenParamName(通用參數名稱)類型: attribute.name-array → (string / real / integer)描述: 通用參數的名稱列表。默認值: []可選值: 'distance_to', 'max_area_holes', 'max_distance', 'method', 'sampling_dist_abs', 'sampling_dist_rel'GenParamValue(通用參數值)類型: attribute.value-array → (string / real / integer)描述: 通用參數的值列表。默認值: []建議值: 0, 1, 100, 'auto', 'triangles', 'points', 'primitive', 'kd-tree', 'voxel', 'linear', 0.01, 0.03ObjectModel3D: 表示3D對象模型的句柄。通常用于標識和操作特定的3D模型。
Purpose: 定義該3D模型的用途,例如基于形狀的匹配 (shape_based_matching_3d)、分割 (segmentation) 或距離計算 (distance_computation)。
OverwriteData: 決定是否覆蓋已有數據。如果設置為 'true',則會替換現有數據;如果為 'false',則保留原有數據。GenParamName 和 GenParamValue: 這兩個參數成對出現,用于指定通用參數的名稱和對應的值。例如:'distance_to': 計算距離的目標。'max_area_holes': 最大孔洞面積。'method': 使用的方法,如 'kd-tree''voxel'

read_shape_model_3d — 讀取3D匹配模型

read_shape_model_3d( : : FileName : ShapeModel3DID)FileName類型: filename.read → (string)描述: 包含 3D 形狀模型的文件名(包括路徑)。文件擴展名: .sm3示例: "model.sm3""C:/models/example.sm3"輸出參數 (Output Parameters)ShapeModel3DID類型: shape_model_3d → (integer)描述: 讀取的 3D 形狀模型的句柄。此句柄用于后續處理和操作。

create_shape_model_3d 準備要匹配的3D模型

create_shape_model_3d( : : ObjectModel3D, CamParam, RefRotX, RefRotY, RefRotZ, OrderOfRotation, LongitudeMin, LongitudeMax, LatitudeMin, LatitudeMax, CamRollMin, CamRollMax, DistMin, DistMax, MinContrast, GenParamName, GenParamValue : ShapeModel3DID)ObjectModel3D類型: object_model_3d → (integer)描述: 輸入的 3D 對象模型句柄。用于標識和引用特定的 3D 模型。CamParam類型: campar → (real / integer / string)描述: 內部相機參數,用于定義相機的內參(如焦距、主點位置等)。RefRotX類型: angle.rad → (real)描述: 參考方向:繞 X 軸的旋轉角度或 Rodriguez 向量的 X 分量(單位為弧度或無單位)。默認值: 0建議值: -1.57, -0.78, -0.17, 0., 0.17, 0.78, 1.57RefRotY類型: angle.rad → (real)描述: 參考方向:繞 Y 軸的旋轉角度或 Rodriguez 向量的 Y 分量(單位為弧度或無單位)。默認值: 0建議值: -1.57, -0.78, -0.17, 0., 0.17, 0.78, 1.57RefRotZ類型: angle.rad → (real)描述: 參考方向:繞 Z 軸的旋轉角度或 Rodriguez 向量的 Z 分量(單位為弧度或無單位)。默認值: 0建議值: -1.57, -0.78, -0.17, 0., 0.17, 0.78, 1.57OrderOfRotation類型: string → (string)描述: 參考方向中旋轉值的意義。默認值: 'gba'可選值: 'abg', 'gba', 'rodriguez'LongitudeMin 和 LongitudeMax類型: angle.rad → (real)描述: 模型視圖的最小和最大經度范圍(單位為弧度)。默認值: LongitudeMin = -0.35, LongitudeMax = 0.35限制條件: LongitudeMax >= LongitudeMinLatitudeMin 和 LatitudeMax類型: angle.rad → (real)描述: 模型視圖的最小和最大緯度范圍(單位為弧度)。默認值: LatitudeMin = -0.35, LatitudeMax = 0.35限制條件: -π/2 <= LatitudeMin <= π/2, -π/2 <= LatitudeMax <= π/2, LatitudeMax >= LatitudeMinCamRollMin 和 CamRollMax類型: angle.rad → (real)描述: 模型視圖的最小和最大相機滾轉角(單位為弧度)。默認值: CamRollMin = -3.1416, CamRollMax = 3.1416限制條件: CamRollMax >= CamRollMinDistMin 和 DistMax類型: number → (real)描述: 模型視圖的最小和最大相機到物體的距離。默認值: DistMin = 0.3, DistMax = 0.4限制條件: DistMin > 0, DistMax >= DistMinMinContrast類型: number → (integer)描述: 搜索圖像中物體的最低對比度。默認值: 10建議值: 1, 2, 3, 5, 7, 10, 20, 30, 1000, 2000, 5000GenParamName 和 GenParamValue類型: attribute.name(-array)(string) 和 attribute.value(-array)(integer / real / string)描述: 控制操作行為的通用參數名稱及其對應值。默認值: []示例名稱: 'metric', 'min_face_angle', 'num_levels'示例值: 0, 1, 2, 'auto', 'ignore_local_polarity''ignore_local_polarity':忽略局部極性變化,適合一般場景'ignore_part_polarity':忽略更大區域的極性變化,能顯著加快紋理背景下的搜索速度

find_shape_model_3d ——發現匹配模型

find_shape_model_3d(Image : : ShapeModel3DID, MinScore, Greediness, NumLevels, GenParamName, GenParamValue : Pose, CovPose, Score)
輸入參數 (Input Parameters)Image類型: (multichannel-)image → object (byte / uint2)描述: 輸入圖像,用于在其中查找 3D 形狀模型。可以是單通道或多通道圖像。ShapeModel3DID類型: shape_model_3d → (integer)描述: 3D 形狀模型的句柄。通常是通過 create_shape_model_3d 或 read_shape_model_3d 創建或加載的模型。MinScore類型: real → (real)描述: 找到的模型實例的最低得分閾值。只有得分高于此值的實例才會被返回。默認值: 0.7建議值: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0典型范圍: 0 ≤ MinScore ≤ 1最小增量: 0.01推薦增量: 0.05Greediness類型: real → (real)描述: 搜索啟發式的“貪婪度”。值越小,搜索越安全但速度較慢;值越大,搜索越快但可能錯過匹配。默認值: 0.9建議值: 0.0, 0.1, 0.2, ..., 1.0典型范圍: 0 ≤ Greediness ≤ 1最小增量: 0.01推薦增量: 0.05NumLevels類型: integer-array → (integer)描述: 匹配過程中使用的金字塔層數。如果數組長度為 2,則表示最低和最高金字塔層。默認值: 0可選值: 0, 1, 2, ..., 10GenParamName 和 GenParamValue類型: attribute.name-array → (string) 和 attribute.value-array → (integer / real / string)描述: 控制操作行為的通用參數名稱及其對應值。默認值: []示例名稱: 'border_model', 'cam_roll_max', 'cam_roll_min', 'cov_pose_mode', ...示例值: -0.78, -0.35, 0.0, 'none', 'true', 'false', ...輸出參數 (Output Parameters)Pose類型: pose(-array)(real / integer)描述: 找到的 3D 形狀模型的姿態(位置和方向)。每個姿態由 6 個參數表示:3 個平移參數和 3 個旋轉參數。CovPose類型: real-array → (real)描述: 姿態參數的 6 個標準差或 36 個協方差值,用于評估姿態估計的不確定性。Score類型: real-array → (real)描述: 找到的 3D 形狀模型實例的匹配得分。分數越高,匹配質量越好。

project_shape_model_3d 將三維形狀模型的邊緣投影到圖像坐標中。

project_shape_model_3d( : ModelContours : ShapeModel3DID, CamParam, Pose, HiddenSurfaceRemoval, MinFaceAngle : )
輸出參數 (Output Parameters)ModelContours類型: xld_cont-array → object描述: 模型視圖的輪廓表示。以 XLD(擴展線描述符)格式存儲,可用于繪制或分析。輸入參數 (Input Parameters)ShapeModel3DID類型: shape_model_3d → (integer)描述: 3D 形狀模型的句柄。通常是通過 create_shape_model_3d 或 read_shape_model_3d 創建或加載的模型。CamParam類型: campar → (real / integer / string)描述: 內部相機參數,用于定義相機的內參(如焦距、主點位置等)。Pose類型: pose → (real / integer)描述: 3D 形狀模型在世界坐標系中的姿態(位置和方向)。姿態由 6 個參數表示:3 個平移參數和 3 個旋轉參數。HiddenSurfaceRemoval類型: string → (string)描述: 是否移除隱藏表面(即是否啟用隱藏面剔除)。默認值: 'true'可選值: 'false', 'true'MinFaceAngle類型: angle.rad → (real / integer)描述: 顯示邊緣所需的最小面角度(單位為弧度)。小于該角度的邊緣將被忽略。默認值: 0.523599(約 30 度)建議值: 0.17, 0.26, 0.35, 0.52

示例

‘ignore_part_polarity’:忽略更大區域的極性變化,能顯著加快紋理背景下的搜索速度

在這里插入圖片描述

* 這個示例程序展示了如何使用HALCON的3D基于形狀的匹配
* 來找到瓷磚間隔片的3D姿態* 由于背景紋理較強,在create_shape_model_3d()中使用'ignore_part_polarity'度量
* 以加快搜索速度。為了展示速度提升,創建了兩個3D形狀模型:
* 一個使用'ignore_local_polarity'度量,另一個使用'ignore_part_polarity'度量* 然后,為每個找到的對象顯示輪廓并比較搜索時間* 本示例還使用了'lowest_model_level'選項,這在示例程序
* 3d_matching_lowest_model_level.hdev中有更詳細的解釋* 關閉顯示更新
dev_update_off ()* 獲取并設置異常處理偏好(抑制已處理異常的對話框)
dev_get_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')* 設置相機參數(可以通過相機標定獲得)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)* 從相機參數中獲取圖像寬度和高度
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)* 關閉并重新打開顯示窗口
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'black', WindowHandle)* 設置顯示字體
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')* 設置線寬為2
dev_set_line_width (2)* 定義顏色數組
Colors := ['blue','forest green','black']* 獲取用于搜索的兩個形狀模型
acquire_shape_models (WindowHandle, CamParam, ShapeModel3DID1, ShapeModel3DID2)* 顯示繼續消息并暫停
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 設置匹配參數
MatchingParameters := ['num_matches','pose_refinement']
MatchingParameterValues := [2,'least_squares_high']
MinScore := 0.65
Greediness := 0.9
NumLevels := 0* 匹配循環
NumImages := 9
for I := 1 to NumImages by 1* 讀取圖像read_image (Image, 'tile_spacers/tile_spacers_' + I$'02')* 顯示圖像(使用藍色)dev_set_color (Colors[0])dev_display (Image)* 使用'ignore_local_polarity'度量的模型1查找最多兩個實例Message := 'Search model with \'ignore_local_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 記錄開始時間count_seconds (Seconds1)* 執行3D形狀匹配find_shape_model_3d (Image, ShapeModel3DID1, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score1)* 記錄結束時間count_seconds (Seconds2)Time1 := Seconds2 - Seconds1* 通過投影3D形狀模型來可視化找到的匹配for J := 0 to |Score1| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endfor* 顯示匹配結果信息Message := 'Search model with \'ignore_local_polarity\': ' + |Score1| + ' Match(es) found in ' + Time1$'.1f' + ' s'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 使用'ignore_part_polarity'度量的模型2查找最多兩個實例dev_set_color (Colors[1])Message[1] := 'Search model with \'ignore_part_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 記錄開始時間count_seconds (Seconds1)* 執行3D形狀匹配find_shape_model_3d (Image, ShapeModel3DID2, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score2)* 記錄結束時間count_seconds (Seconds2)Time2 := Seconds2 - Seconds1* 通過投影3D形狀模型來可視化找到的匹配(使用虛線樣式)set_line_style (WindowHandle, [10,10])for J := 0 to |Score2| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endforset_line_style (WindowHandle, [])* 顯示匹配結果信息和速度提升因子Message[1] := 'Search model with \'ignore_part_polarity\':  ' + |Score2| + ' Match(es) found in ' + Time2$'.1f' + ' s'Message[2] := 'Speed-up factor with \'ignore_part_polarity\': ' + (Time1 / Time2)$'.1f'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 如果不是最后一張圖像,顯示繼續消息并暫停if (I < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor* 暫停程序
stop ()* 清除3D形狀模型
clear_shape_model_3d (ShapeModel3DID1)
clear_shape_model_3d (ShapeModel3DID2)* 恢復異常處理偏好設置
dev_set_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)* 這個示例程序展示了如何使用HALCON的3D基于形狀的匹配
* 來找到瓷磚間隔片的3D姿態* 由于背景紋理較強,在create_shape_model_3d()中使用'ignore_part_polarity'度量
* 以加快搜索速度。為了展示速度提升,創建了兩個3D形狀模型:
* 一個使用'ignore_local_polarity'度量,另一個使用'ignore_part_polarity'度量* 然后,為每個找到的對象顯示輪廓并比較搜索時間* 本示例還使用了'lowest_model_level'選項,這在示例程序
* 3d_matching_lowest_model_level.hdev中有更詳細的解釋* 關閉顯示更新
dev_update_off ()* 獲取并設置異常處理偏好(抑制已處理異常的對話框)
dev_get_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')* 設置相機參數(可以通過相機標定獲得)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)* 從相機參數中獲取圖像寬度和高度
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)* 關閉并重新打開顯示窗口
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'black', WindowHandle)* 設置顯示字體
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')* 設置線寬為2
dev_set_line_width (2)* 定義顏色數組
Colors := ['blue','forest green','black']* 獲取用于搜索的兩個形狀模型
acquire_shape_models (WindowHandle, CamParam, ShapeModel3DID1, ShapeModel3DID2)* 顯示繼續消息并暫停
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 設置匹配參數
MatchingParameters := ['num_matches','pose_refinement']
MatchingParameterValues := [2,'least_squares_high']
MinScore := 0.65
Greediness := 0.9
NumLevels := 0* 匹配循環
NumImages := 9
for I := 1 to NumImages by 1* 讀取圖像read_image (Image, 'tile_spacers/tile_spacers_' + I$'02')* 顯示圖像(使用藍色)dev_set_color (Colors[0])dev_display (Image)* 使用'ignore_local_polarity'度量的模型1查找最多兩個實例Message := 'Search model with \'ignore_local_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 記錄開始時間count_seconds (Seconds1)* 執行3D形狀匹配find_shape_model_3d (Image, ShapeModel3DID1, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score1)* 記錄結束時間count_seconds (Seconds2)Time1 := Seconds2 - Seconds1* 通過投影3D形狀模型來可視化找到的匹配for J := 0 to |Score1| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endfor* 顯示匹配結果信息Message := 'Search model with \'ignore_local_polarity\': ' + |Score1| + ' Match(es) found in ' + Time1$'.1f' + ' s'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 使用'ignore_part_polarity'度量的模型2查找最多兩個實例dev_set_color (Colors[1])Message[1] := 'Search model with \'ignore_part_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 記錄開始時間count_seconds (Seconds1)* 執行3D形狀匹配find_shape_model_3d (Image, ShapeModel3DID2, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score2)* 記錄結束時間count_seconds (Seconds2)Time2 := Seconds2 - Seconds1* 通過投影3D形狀模型來可視化找到的匹配(使用虛線樣式)set_line_style (WindowHandle, [10,10])for J := 0 to |Score2| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endforset_line_style (WindowHandle, [])* 顯示匹配結果信息和速度提升因子Message[1] := 'Search model with \'ignore_part_polarity\':  ' + |Score2| + ' Match(es) found in ' + Time2$'.1f' + ' s'Message[2] := 'Speed-up factor with \'ignore_part_polarity\': ' + (Time1 / Time2)$'.1f'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 如果不是最后一張圖像,顯示繼續消息并暫停if (I < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor* 暫停程序
stop ()* 清除3D形狀模型
clear_shape_model_3d (ShapeModel3DID1)
clear_shape_model_3d (ShapeModel3DID2)* 恢復異常處理偏好設置
dev_set_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)

在這里插入圖片描述

'lowest_model_level’參數可減少內存需求

在這里插入圖片描述

* 本示例展示如何使用HALCON基于形狀的3D匹配技術
* 來定位瓷磚間隔片的3D姿態。由于物體在圖像中較大,
* 3D模型需要許多不同視角的內部表示,導致模型內存消耗很高。
* 使用'lowest_model_level'參數可減少內存需求:
* - 默認級別為1,提高級別可減少內存(每級約減少3)
* - 同時模型創建時間減少2/* - 代價是匹配魯棒性可能降低,搜索時間略增(5-10%)
*
* 本例設置'lowest_model_level'3,結果是:
* - 模型內存需求減少6* - 模型創建時間減少4* 關閉顯示更新
dev_update_off ()* 獲取并設置異常處理偏好(抑制已處理異常的對話框)
dev_get_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')* 設置相機參數(可通過相機標定獲得)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)* 獲取圖像尺寸
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)* 讀取示例圖像并初始化窗口
read_image (Image, 'tile_spacers/tile_spacers_color_01')
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (3)* 嘗試從磁盤讀取3D形狀模型
dev_clear_window ()
disp_message (WindowHandle, 'Reading the 3D shape model file from disk ...', 'window', 12, 12, 'black', 'false')
tryread_shape_model_3d ('tile_spacer.sm3', ShapeModel3DID)
catch (Exception)* 如果讀取失敗,則創建新模型* 從DXF文件讀取3D對象模型read_object_model_3d ('tile_spacer.dxf', 0.0001, [], [], ObjectModel3DID, DXFStatus)prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])disp_message (WindowHandle, 'Reading the 3D shape model file from disk ... not found!', 'window', 12, 12, 'red', 'false')disp_message (WindowHandle, 'Creating the 3D shape model (may take a few seconds) ...', 'window', 42, 12, 'black', 'false')* 記錄模型創建時間count_seconds (S1)* 關鍵參數設置:使用'lowest_model_level'=3來優化內存和創建時間create_shape_model_3d (ObjectModel3DID, CamParam, 0, 0, 0, 'gba', -rad(60), rad(60), -rad(60), rad(60), 0, rad(360), 0.26, 0.27, 10, 'lowest_model_level', 3, ShapeModel3DID)count_seconds (S2)T := S2 - S1* 清理原始3D對象模型clear_object_model_3d (ObjectModel3DID)* 顯示創建時間disp_message (WindowHandle, 'Creation time: ' + T$'.3' + ' s', 'window', 72, 12, 'black', 'false')* 嘗試保存模型trydisp_message (WindowHandle, 'Writing model to disk ...', 'window', 102, 12, 'black', 'false')write_shape_model_3d (ShapeModel3DID, 'tile_spacer.sm3')catch (Exception)disp_message (WindowHandle, 'Writing model to disk ... failed!', 'window', 102, 12, 'red', 'false')disp_continue_message (WindowHandle, 'black', 'true')stop ()endtry
endtry* 顯示模型級別信息
disp_lowest_model_level_info (WindowHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 匹配階段
Times := []
NumImages := 12
for I := 1 to NumImages by 1read_image (Image, 'tile_spacers/tile_spacers_color_' + I$'02')dev_display (Image)* 查找最多3個實例(設置'border_model''true'因為物體可能接觸圖像邊界)count_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.85, 0, ['num_matches','max_overlap','border_model'], [3,0.75,'true'], Pose, CovPose, Score)count_seconds (Seconds2)Time := Seconds2 - Seconds1Times := [Times,Time]* 可視化匹配結果for J := 0 to |Score| - 1 by 1* 顯示輪廓PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, PoseTmp, 'true', rad(30))dev_set_color ('yellow')dev_display (ModelContours)* 顯示3D坐標系dev_set_colored (3)disp_3d_coord_system (WindowHandle, CamParam, PoseTmp, 0.015)endfor* 顯示姿態參數for K := 0 to |Score| - 1 by 1PoseTmp := Pose[K * 7:K * 7 + 6]display_match_pose (ShapeModel3DID, PoseTmp, WindowHandle)endfor* 顯示匹配結果信息disp_message (WindowHandle, |Score| + ' Match(es) found in ' + Time$'4.2f' + ' s', 'window', 12, 12, 'dark green', ['white','false'])if (I < NumImages)disp_continue_message (WindowHandle, 'black', ['white','false'])stop ()endif
endfor* 清理資源
clear_shape_model_3d (ShapeModel3DID)
dev_set_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
disp_end_of_program_message (WindowHandle, 'black', ['white','false'])

在這里插入圖片描述

find_shape_model_3d 的 recompute_score 匹配精度

在這里插入圖片描述

* 本程序演示find_shape_model_3d算子中通用參數'recompute_score'的效果
* 
* 當設置'recompute_score''true'時,姿態優化后會重新計算分數,
* 這可能導致分數值略有不同(但更一致),代價是執行時間稍長* 初始化相機參數
gen_cam_par_area_scan_division (0.01, 0, 7e-6, 7e-6, 320, 240, 640, 480, CamParam)
get_cam_par_data (CamParam, 'image_width', Width)
get_cam_par_data (CamParam, 'image_height', Height)* 創建顯示窗口
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_update_off ()* 創建立方體3D模型
X := [-1,-1,1,1,-1,-1,1,1]  * X坐標
Y := [1,-1,-1,1,1,-1,-1,1]  * Y坐標
Z := [-1,-1,-1,-1,1,1,1,1]  * Z坐標
Polygons := [4,0,1,2,3,4,4,5,6,7,4,0,1,5,4,4,3,2,6,7,4,0,3,7,4,4,1,2,6,5]  * 多邊形定義
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3DID)
set_object_model_3d_attrib_mod (ObjectModel3DID, 'polygons', [], Polygons)* 準備3D對象模型用于匹配
prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])* 顯示3D對象模型
disp_object_model_3d_safe (WindowHandle, ObjectModel3DID, CamParam, [0,0,11,30,40,0,0], [], [])
disp_message (WindowHandle, '3D Object Model of a Cube', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 生成3D形狀模型
create_cube_shape_model_3d (WindowHandle, ObjectModel3DID, CamParam, ShapeModel3DID)
clear_object_model_3d (ObjectModel3DID)* 初始化存儲變量
Scores1 := []  * 存儲recompute_score=false的分數
Scores2 := []  * 存儲recompute_score=true的分數
Times1 := []   * 存儲recompute_score=false的時間
Times2 := []   * 存儲recompute_score=true的時間
Longitudes := []  * 存儲經度值* 設置固定參數
Latitude := rad(45)  * 固定緯度
Distance := 11.5     * 固定距離* 設置顯示屬性
dev_set_color ('green')
dev_set_line_width (2)* 主循環:在30-60度經度范圍內測試
for Longitude := rad(30) to rad(60) by rad(0.25)* 將球坐標轉換為笛卡爾坐標convert_point_3d_spher_to_cart (Longitude, Latitude, Distance, '-y', '-z', CamX, CamY, CamZ)* 創建相機姿態create_cam_pose_look_at_point (CamX, CamY, CamZ, 0, 0, 0, '-y', 0, CamPose)* 防止閃爍set_system ('flush_graphic', 'false')* 生成立方體的合成圖像project_cube_image (Image, CamPose, CamParam, X, Y, Z, Polygons)* 第一次匹配:recompute_score=falsecount_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 0, [], [], Pose1, CovPose1, Score1)count_seconds (Seconds2)Time1 := (Seconds2 - Seconds1) * 1000.0  * 轉換為毫秒* 第二次匹配:recompute_score=truecount_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 0, 'recompute_score', 'true', Pose2, CovPose2, Score2)count_seconds (Seconds2)Time2 := (Seconds2 - Seconds1) * 1000.0  * 轉換為毫秒* 顯示匹配結果dev_display (Image)if (|Score1| == 1 and |Score2| == 1)* 顯示匹配輪廓project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, Pose1, 'true', rad(30))dev_display (ModelContours)* 顯示當前經度信息disp_message (WindowHandle, 'Matching at Longitude: ' + deg(Longitude)$'3.1f' + ' deg (from 30 to 60 deg)', 'window', 12, 12, 'white', 'false')* 生成并顯示匹配結果消息gen_matching_result_message (Time1, Time2, Score1, Score2, Message)disp_message (WindowHandle, Message, 'window', 420, 12, ['white','yellow','green'], 'false')* 存儲結果數據Longitudes := [Longitudes,deg(Longitude)]Scores1 := [Scores1,Score1]Scores2 := [Scores2,Score2]Times1 := [Times1,Time1]Times2 := [Times2,Time2]endif* 恢復圖形刷新set_system ('flush_graphic', 'true')* 通過繪制不可見線條強制刷新顯示disp_line (WindowHandle, -1, -1, -1, -1)
endfor* 顯示分數值對比圖
dev_clear_window ()
Title := ['\'recompute_score\'=\'false\'','\'recompute_score\'=\'true\'']
Colors := ['yellow','green']
plot_tuple (WindowHandle, Longitudes, [Scores1,Scores2], 'Longitude [deg]', 'Matching score', Colors, ['ticks_x','ticks_y','end_y'], [6,.01,1])
disp_message (WindowHandle, Title, 'window', 12, 350, Colors, 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 顯示時間消耗對比圖
dev_clear_window ()
plot_tuple (WindowHandle, Longitudes, [Times1,Times2], 'Longitude [deg]', 'Matching time [ms]', Colors, 'ticks_x', 6)
disp_message (WindowHandle, Title, 'window', 12, 350, Colors, 'false')* 清理3D形狀模型
clear_shape_model_3d (ShapeModel3DID)

在這里插入圖片描述

Halcon 3D 表面匹配

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/pingmian/78618.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78618.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78618.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】Java 開發者的 Linux 常用命令指南

Java 開發者的 Linux 常用命令指南 目錄標題 Java 開發者的 Linux 常用命令指南1. Linux 目錄結構2. 系統信息命令3. 服務管理系統服務防火墻管理 4. 文本編輯 (vi/vim)常用模式 5. 文件和目錄操作查看與導航創建與刪除查看文件內容查找文件 6. 用戶管理7. 壓縮和解壓8. 權限管…

每日c/c++題 備戰藍橋杯(P1252洛谷 馬拉松接力賽)

洛谷P1060 馬拉松接力賽題解&#xff1a;貪心算法在資源分配中的巧妙應用 題目描述 P1060 馬拉松接力賽是一道結合貪心策略與動態規劃思想的資源分配問題。題目要求將25公里的馬拉松接力賽合理分配給5名選手&#xff0c;使得總耗時最短。每位選手可跑1-10公里的整數距離&…

Nginx 中間件

Nginx&#xff08;發音為 "engine-x"&#xff09;是一款開源的高性能 HTTP 服務器和反向代理服務器&#xff0c;最初由 Igor Sysoev 開發。 它以其高性能、穩定性、豐富的功能集和低資源消耗而聞名&#xff0c;廣泛應用于全球的 Web 服務架構中。 作為中間件&#…

Neo4j在win下安裝教程(docker環境)

1. 安裝命令 1.1 基于正式neo4j安裝–不用 docker run --name neo4j-container -p 7474:7474 -p 7687:7687 -d neo4j1.2 基于community安裝 需要部署兩個Neo4j&#xff0c;一個正式庫prod&#xff0c;一個測試庫dev。 neo4j默認監聽7474&#xff08;HTTP-也就是瀏覽器端口&…

kylin v10 + argo + ascend 310p多機多卡 pytorch distributed 訓練

最近接了個模型訓練編排多機多卡的改造需求&#xff0c;要求使用argo dag task啟動多個節點&#xff0c;同時多個節點能實現 torch.distributed.launch 這樣多機多卡的訓練模式 簡述技術 torch.distributed.launch命令介紹 我們在訓練分布式時候&#xff0c;會使用到 torch.d…

[Mac] 使用homebrew安裝miniconda

使用虛擬環境可以對不同項目的依賴進行隔離。可以使用venv或者conda來創建和使用虛擬環境。 venv是Python內置的虛擬環境管理模塊&#xff0c;適合純Python項目以及快速輕量級的開發和部署。conda具備更強大的版本管理能力&#xff0c;但是占用較大的磁盤空間。 考慮到我基本不…

CMU-15445(1)——環境搭建

前言 最近在找完暑期實習之后&#xff0c;終于有了一些干項目外的空余時間學習新的知識&#xff0c;在這么多輪面試中&#xff0c;數據庫的考察非常多&#xff0c;但孱弱的數據庫基礎導致我有很多次面試被問住&#xff0c;因此我希望在學習CMU-15445&#xff08;Fall 2024&…

CSS元素動畫篇:基于當前位置的變換動畫(四)

基于當前位置的變換動畫&#xff08;四&#xff09; 前言透明效果類元素動畫閃爍動畫效果效果預覽代碼實現 淡入動畫效果效果預覽代碼實現 淡出動畫效果效果預覽代碼實現 結語 前言 CSS元素動畫一般分為兩種&#xff1a;一種是元素基于當前位置的變換動畫&#xff0c;通過不明…

STM32驅動AD5318配置8通道DA詳細講解

目錄 1. AD5318 芯片特性 2、AD5318寄存器概述 3、SPI數據幀格式 3.1 控制位(Bit15) 3.2 地址位(Bit14-Bit12,3 位) 3.3 數據 / 控制碼(Bit11-Bit0) 4、控制功能寄存器(控制位 = 1 時激活) 4.1 參考與增益配置(MM = 00) 4.2. LDAC模式(MM = 01) 4.3 掉…

如何搭建spark yarn 模式的集群集群

以下是搭建Spark YARN模式集群的一般步驟&#xff1a; 準備工作 - 確保集群中各節點安裝了Java環境&#xff0c;并配置好 JAVA_HOME 環境變量。 - 各節點間能通過SSH免密登錄。 - 安裝并配置好Hadoop集群&#xff0c;YARN作為Hadoop的資源管理器&#xff0c;Spark YARN模式需要…

SpringMVC處理請求映射路徑和接收參數

目錄 springmvc處理請求映射路徑 案例&#xff1a;訪問 OrderController類的pirntUser方法報錯&#xff1a;java.lang.IllegalStateException&#xff1a;映射不明確 核心錯誤信息 springmvc接收參數 一 &#xff0c;常見的字符串和數字類型的參數接收方式 1.1 請求路徑的…

在 Windows 系統上升級 Node.js

一、查詢電腦端已經安裝的 Node.js 版本 1、通過【winR】 鍵&#xff0c;輸入 cmd&#xff0c;點擊【確定】按鈕打開 cmd 窗口 2、命令行界面輸入 node -v 查看目前 Node.js 版本 3、命令行界面輸入 npm -v 查看目前 npm 版本 二、進入官網地址下載安裝包 1、官網地址&#x…

深入詳解人工智能數學基礎——概率論中的馬爾可夫鏈蒙特卡洛(MCMC)采樣

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

C++ 嵌套類 (詳解 一站式講解)

目錄 嵌套類 嵌套類的定義 嵌套類結構的訪問權限 pimpl模式&#xff08;了解&#xff09; 嵌套類 嵌套類的定義 首先介紹兩個概念&#xff1a; 類作用域&#xff08;Class Scope&#xff09; 類作用域是指在類定義內部的范圍。在這個作用域內定義的成員&#xff08;包括…

tcp 和http 網絡知識

1. 請簡述TCP和HTTP的定義與基本概念 TCP&#xff1a;即傳輸控制協議&#xff08;Transmission Control Protocol&#xff09;&#xff0c;是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它為互聯網中的數據通信提供穩定的傳輸機制&#xff0c;在不可靠的IP層之上&a…

MySQL安裝的多個組件中無用組件卸載

在決定卸載MySQL的哪些組件前&#xff0c;需根據你的實際使用場景判斷。以下是各組件的主要功能及卸載建議&#xff1a; 1. 核心組件卸載建議 組件名稱作用是否可卸載MySQL Server數據庫服務核心&#xff0c;存儲數據、處理SQL請求的核心程序。不可卸載 &#xff08;卸載會導致…

CosyVoice 技術全景解析:下一代語音生成模型的革命性突破

目錄 一、CosyVoice 模型概述 1. 背景與定位 二、技術架構與創新 1. 核心架構設計 2. 關鍵技術亮點 三、行業地位與競品對比 1. 市場定位分析 2. 競爭優勢 四、部署方案與硬件成本 1. 硬件需求 2. 優化技巧 五、優勢與挑戰 1. 核心優勢 2. 主要挑戰 六、開源生態…

rabbitmq-集群部署

場景&#xff1a;單個pod&#xff0c;部署在主節點&#xff0c;基礎版沒有插件&#xff0c;進階版多了一個插件 基礎版本&#xff1a; --- apiVersion: v1 kind: PersistentVolume metadata:name: rabbitmq-pv spec:capacity:storage: 5GiaccessModes:- ReadWriteOncestorage…

[密碼學實戰]商用密碼產品密鑰體系架構:從服務器密碼機到動態口令系統

[密碼學實戰]商用密碼產品密鑰體系架構:從服務器密碼機到動態口令系統 關鍵詞:商用密碼、密鑰體系、服務器密碼機、金融數據密碼機、動態口令、智能密碼鑰匙 摘要:本文深度解讀商用密碼產品的核心密鑰體系架構,涵蓋服務器密碼機、金融數據密碼機、VPN產品、動態口令系統及…

【unity游戲開發入門到精通——UGUI】UI事件監聽接口

注意&#xff1a;考慮到UGUI的內容比較多&#xff0c;我將UGUI的內容分開&#xff0c;并全部整合放在【unity游戲開發——UGUI】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言1、什么是UGUI事件接口&#xff1f;2、想要監聽事件步驟 一、事件接口1、U…