管件接頭的無序抓取

文章目錄

      • 1,目的
      • 2,過程
      • 3,易混易錯點
      • 4,代碼詳解
        • 4.1,初始化窗口
        • 4.2,創建多視角立體視覺模型。
        • 4.3,創建表面匹配模型
        • 4.4,多視角立體視覺重建管件堆表面模型
        • 4.5,管道接頭查找匹配
      • 5,完整代碼

1,目的

獲取管件堆中管件接頭的位姿,從而實現無序抓取。

效果如下:

在這里插入圖片描述


2,過程

  • 多相機獲取多視角的圖像,這里是四個相機獲取四個角度的圖像。
  • 結合四個角度圖像進行表面點云重建,獲取圖像中管件堆的點云
  • 進而再使用3D表面匹配實現對管道接頭位姿的獲取。

3,易混易錯點

1, 通過標定獲取的CameraPose實質是標定板在相機坐標系的位姿,并不是相機的位姿。相機的位姿其實是CameraPose的逆變換。

calibrate_cameras (CalibHandle, TmpCtrl_Errors)
get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParameters)
get_calib_data (CalibHandle, 'calib_obj_pose', [0, >TmpCtrl_ReferenceIndex], 'pose', CameraPose)
* Calibration 01: Adjust origin for plate thickness
set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose)

2,disp_3d_coord_system算子中的仿射變換,并不是使標定板坐標系原點與相機坐標系原點重合,而是為了在相機坐標系中?可視化標定板坐標系的位置和方向,標定板坐標系原點與相機坐標系原點位置關系并不發生改變?。 該算子直接使用CameraPose參數將標定板坐標系渲染到圖像空間,保持其相對于相機坐標系的原始位姿關系。

3,pose_compose (Pose1,Pose2, PoseCompose)執行順序是先執行Pose2變換,再執行 Pose1 變化。參數是有執行順序,并不可以隨意互換。
例如以下:

正確的合并:

pose_compose (BaseInCamPose, ToolInBasePose, ToolInCamPose)
pose_compose (ToolInCamPose, CalObjInToolPose, CalObjInCamPose)

錯誤的合并

pose_compose (ToolInBasePose,BaseInCamPose,  ToolInCamPose)
pose_compose ( CalObjInToolPose,ToolInCamPose, CalObjInCamPose)

4,代碼詳解

4.1,初始化窗口
* 案例庫:locate_pipe_joints_stereo.hdev* 目的:
* 查找立體視覺獲取的3D對象中管道連接頭的立體位置* 過程:
* 采用四個相機采集的圖像立體重建一堆管道連接頭的三維表面* 基于表面的3D匹配,查找
* 
* 
*---------------------part01:初始化窗口
* *****
* Initializations:
* *****
* 
dev_close_window ()
dev_update_off ()
dev_get_preferences ('suppress_handled_exceptions_dlg', PreferenceValue)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')
ImagePath := '3d_machine_vision/multi_view/'
ImagePrefix := 'multi_view_pipe_joints'
read_image (Image, ImagePath + ImagePrefix + '_cam_0_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 
* *****

4.2,創建多視角立體視覺模型。
*-------------------- Part02: 多視角立體視覺模型創建
* *****
* 2.1,Read the camera setup model from file and get the parameters
* and the poses of the cameras
tryread_camera_setup_model ('../four_camera_setup_model.csm', CameraSetupModelID)
catch (Exception)if (Exception[0] == 5200)* 初始化生成相機內參+外參init_camera_setup (CameraSetupModelID)elsethrow (Exception)endif
endtry
* 
* 2.2 ,獲取多視角立體視覺模型參數
get_camera_setup_param (CameraSetupModelID, 'general', 'num_cameras', NumCameras)
* 需要特別注意:結合上下文可知Pose0應該是常見標定獲取的camerapose的逆變換
* (camerapose為標定板在相機坐標系的位姿)
get_camera_setup_param (CameraSetupModelID, 0, 'pose', Pose0)
get_camera_setup_param (CameraSetupModelID, 1, 'pose', Pose1)
get_camera_setup_param (CameraSetupModelID, 2, 'pose', Pose2)
get_camera_setup_param (CameraSetupModelID, 3, 'pose', Pose3)
get_camera_setup_param (CameraSetupModelID, 0, 'params', CamParam0)
get_camera_setup_param (CameraSetupModelID, 1, 'params', CamParam1)
get_camera_setup_param (CameraSetupModelID, 2, 'params', CamParam2)
get_camera_setup_param (CameraSetupModelID, 3, 'params', CamParam3)* 
* Create a multi-view stereo model, initialize it, and clear
* the camera setup, which is no longer required* 2.3,創建雙目立體視覺。
* 'surface_pairwise':基于成對圖像進行表面重建
create_stereo_model (CameraSetupModelID, 'surface_pairwise', [], [], StereoModelID)
clear_camera_setup_model (CameraSetupModelID)* 2.4,多視角立體視覺模型參數設置*-----圖像校正參數組* -> Subsampling X, Y, Z
* 設置下采樣步長為3,可降低計算量但可能導致鋸齒效應,需配合抗鋸齒參數使用
set_stereo_model_param (StereoModelID, 'sub_sampling_step', 3)
* -> Interpolation aliasing by binocular image rectification
* 雙線性插值('bilinear'),平衡校正圖像的質量與計算效率
set_stereo_model_param (StereoModelID, 'rectif_interpolation', 'bilinear')
* 子采樣系數1.2,輕微降低分辨率以加速處理
set_stereo_model_param (StereoModelID, 'rectif_sub_sampling', 1.2)* -----雙目視差計算參數組* 采用歸一化互相關('ncc')匹配算法,對光照變化魯棒性強
set_stereo_model_param (StereoModelID, 'binocular_method', 'ncc')
* 視差計算的金字塔層級數,設置為1時單層直接計算,應用于高紋理/實時性要求高的場景
set_stereo_model_param (StereoModelID, 'binocular_num_levels', 1)
* 匹配掩模尺寸19×19像素,適合中等紋理場景
set_stereo_model_param (StereoModelID, 'binocular_mask_width', 19)
set_stereo_model_param (StereoModelID, 'binocular_mask_height', 19)
* 紋理閾值設為0,禁用紋理過濾,適用于低紋理場景
set_stereo_model_param (StereoModelID, 'binocular_texture_thresh', 0)
* 匹配分數閾值0.4,過濾低置信度匹配點
set_stereo_model_param (StereoModelID, 'binocular_score_thresh', 0.4)
* 啟用左右一致性檢查('left_right_check'),消除遮擋區域誤匹配
set_stereo_model_param (StereoModelID, 'binocular_filter', 'left_right_check')
* 子像素優化模式為插值法('interpolation'),提升深度分辨率
set_stereo_model_param (StereoModelID, 'binocular_sub_disparity', 'interpolation')*------ 空間約束和相機約束* 定義3D工作空間為[-0.2,-0.07,-0.075]到[0.2,0.07,-0.004](單位:米),自動計算視差范圍
* 邊界框(bounding_box)可約束重建范圍,提升效率
set_stereo_model_param (StereoModelID, 'bounding_box', [-0.2,-0.07,-0.075,0.2,0.07,-0.004])
* 配置相機對為(0,2)和(1,3),支持多相機陣列的靈活組合
set_stereo_model_image_pairs (StereoModelID, [0,2], [1,3])

釋疑解惑:
1,算子create_stereo_model

  • 功能概述:
    是 HALCON 中用于創建立體視覺模型的操作符,主要用于從多視角校準的相機配置中重建 3D 點或表面。其核心功能包括:
    ?3D 點重建?:通過多幅校準圖像中的點對應關系,計算 3D 點坐(Method='points_3d')。
    表面重建?:基于立體圖像對生成視差圖,進而重建表面(Method='surface_pairwise''surface_fusion')。

  • 參數詳解

    • 輸入參數
      • ? CameraSetupModelID :校準后的多視角相機配置模型句柄,包含相機內外參等信息。
    • Method:指定重建類型
      • 'points_3d':用于 3D 點云重建。
      • 'surface_pairwise':基于成對圖像重建表面。
      • 'surface_fusion':融合多視角數據重建表面。
    • 輸出參數
      • ?StereoModelID?:生成的立體模型句柄,用于后續操作(如 reconstruct_surface_stereo)。
  • 典型工作流程

    • 創建模型? ```
    create_stereo_model(CameraSetupModelID, 'surface_pairwise', [], [], StereoModelID)
    

創建表面重建模型,初始化參數為空列表。

  • ?配置參數?
    通過 set_stereo_model_param 設置關鍵參數:

    • 'sub_sampling_step':控制重建分辨率(如 3 表示每 3 個像素采樣一次)。
    • 'rectif_interpolation':指定圖像矯正插值方法(如 'bilinear')。
  • ?執行重建?
    調用 reconstruct_surface_stereo 生成 3D 表面模型。

  • 應用場景

    1. ?工業檢測?:如管道接頭的多視角 3D 重建,通過 4 相機系統生成高精度表面模型。

    2. ?機器人導航?:結合手眼標定,將重建的 3D 點云轉換到機器人坐標系。

  • 注意事項

    • ?相機標定?:需提前完成多相機標定,確保 CameraSetupModelID 參數準確。

    • ?圖像對選擇?:使用 set_stereo_model_image_pairs 指定有效的圖像對索引(如 [0,2], [1,3])以優化視差計算。

  • 錯誤處理

    • Method 與模型類型不匹配(如對 'points_3d' 模型調用表面重建),會觸發錯誤。

    • 無效的相機索引或未校準參數會導致重建失敗。

2,set_stereo_model_image_pairs (StereoModelID, [0,2], [1,3])作用?

? 指定用于表面重建的立體圖像對?,其核心原理和必要性如下:

  • 函數功能與參數含義

    1. ?功能定位?
      該函數用于為 'surface_pairwise''surface_fusion' 類型的立體模型(StereoModelID)配置圖像對列表,通過視差計算實現表面重建。若模型類型不匹配(如 'points_3d'),則會報錯。

      • 參數解析:
        • [0,2] 表示第一組圖像對的左視圖索引為0,右視圖索引為2;
        • [1,3] 表示第二組圖像對的左視圖索引為1,右視圖索引為3。
          這些索引需在相機標定模型(CameraSetupModelID)的有效范圍內。
    2. 多視角重建流程?
      該函數是重建流程的關鍵步驟之一,需在 create_stereo_model 創建模型后調用,并在 reconstruct_surface_stereo 執行前完成圖像對配置。

  • 圖像對選擇的依據

    1. ?視差計算需求?
      多視角重建通過計算圖像對的視差圖生成3D表面。例如,[0,2] 表示從相機0到相機2的視差計算,覆蓋不同視角的幾何關系。
      • ?優化策略?:選擇交會角適中(如30°-60°)、特征匹配數量多的圖像對,可提升重建精度。
    2. 覆蓋性與效率平衡?
      1. ?覆蓋性?:[0,2][1,3] 的組合可能覆蓋場景的不同區域,避免單一視角的盲區。
      2. ?效率?:減少冗余圖像對(如相鄰視角)可降低計算量,但需保證重建完整性。
  • 參數設置示例分析

    1. ? 相機布局假設
      • 相機0和2、1和3可能分別位于場景的左右兩側,形成交叉基線,增強深度感知。
    2. 視差多樣性
      • 不同基線的圖像對(如短基線0-1和長基線0-2)可兼顧細節與深度范圍。
      • 注意事項
        1. 參數驗證
          • 相機索引需與標定模型一致,否則會報錯。
        2. 重建質量優化
          • 結合 set_stereo_model_param 設置邊界框(bounding_box)可約束重建范圍,提升效率。
  • 總結
    設置 set_stereo_model_image_pairs 的核心目的是 ?通過合理配置圖像對,優化視差計算與表面重建的精度和效率?。參數 [0,2], [1,3] 體現了多視角立體視覺中交叉基線、覆蓋性與計算資源的平衡設計。


4.3,創建表面匹配模型
* --------------------Part03: 創建表面匹配模型
* *****
* 3.1,讀取管道接頭3D對象
read_object_model_3d ('pipe_joint', 'm', [], [], PipeJointOM3DID, Status)
create_surface_model (PipeJointOM3DID, 0.03, [], [], PipeJointSMID)* 3.2,預處理匹配模型,提高匹配效率
* 'shape_base _matching_3d':激活基于表面集合特征的匹配模式,適用于管道接頭等工業零件的定位
* 為true時進行法向量計算,曲率特征提取,關鍵點自動選擇,提高匹配效率
prepare_object_model_3d (PipeJointOM3DID, 'shape_based_matching_3d', 'true', [], [])
* 
* *****

PipeJointOM3DID

在這里插入圖片描述

4.4,多視角立體視覺重建管件堆表面模型
*-------------------Part04:多視角立體視覺重建管件堆表面模型* 4.1,設置多視角立體模型重建表面3D模型所需必要參數
* 重建管件堆的表面,并利用基于表面的三維匹配技術確定多個管道接頭的位置。
* *****
NumMatches := 3
MinScore := .3* pose_ref_scoring_dist_rel:HALCON中用于曲面匹配(Surface-Based Matching)的關鍵參數,主要控制精細化姿態優化階段的評分距離容差
* 該參數以相對值形式(相對于物體尺寸)設置匹配評分時的最大允許距離偏差
Params := ['num_matches','pose_ref_scoring_dist_rel','scene_normal_computation']
Values := [NumMatches,0.02,'mls']
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
* 
* 注意:這里的Pose0是相機在世界坐標系的位姿,不是常見標定產生的標定板在相機坐標系的位姿camerapose
pose_invert (Pose0, WorldPose0)
* 
gen_empty_obj (EmptyObject)
NumImages := 15
for Index := 1 to NumImages by 1* * 4.2,讀取重建多視角立體表面模型所需的圖像read_multi_view_stereo_images (Images, ImagePath, ImagePrefix, Index, NumCameras)* * Reconstruct the 3D scene (the pile of pipe fittings)Message := 'Performing the reconstruction...'* 4.3,顯示表面重建所用的圖像display_multi_view_stereo_images (Images, WindowHandle)

Images

在這里插入圖片描述

本地函數:

1,read_multi_view_stereo_images

* Read the images of the multi-view stereo setup
* 
read_image (Images, ImagePath + ImagePrefix + '_cam_0_' + SceneIndex$'.02')
for Index := 1 to NumCamera - 1 by 1read_image (Img, ImagePath + ImagePrefix + '_cam_' + Index + '_' + SceneIndex$'.02')concat_obj (Images, Img, Images)
endfor
return ()

2,display_multi_view_stereo_images

* Display the images of a multi-view stereo setup
* consisting of four cameras
* 
dev_set_window (WindowHandle)
* 
count_obj (Images, NumImages)
if (NumImages != 4)disp_message (WindowHandle, 'Wrong number of images provided!', 'window', 12, 12, 'black', 'true')stop ()
endif
* 
NumCols := 2
select_obj (Images, Img, 1)
get_image_size (Img, Width, Height)
tile_images (Images, TiledImage, NumCols, 'horizontal')
dev_set_part (0, 0, (2 * Height) - 1, (2 * Width) - 1)
dev_display (TiledImage)
* 
for Index := 0 to NumImages - 1 by 1RowIdx := (Index / NumCols) + 1ColIdx := Index % NumColsdisp_message (WindowHandle, 'Camera ' + Index, 'image', (RowIdx * Height) - 72, (ColIdx * Width) + 12, 'white', 'false')
endfor
return ()
* 

 disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')count_seconds (T0)---* 4.4,多視角立體模型重建表面3D模型reconstruct_surface_stereo (Images, StereoModelID, PipeJointPileOM3DID)count_seconds (T1)* 重建所用時間ReconsTime := T1 - T0* PoseIn := [0.0,0.0,0.5,-30,0,180,0]* 4.5,顯示重建的3D模型   if (Index == 1)visualize_object_model_3d (WindowHandle, PipeJointPileOM3DID, CamParam0, PoseIn, ['color','point_size'], ['yellow',1], 'Reconstructed scene in ' + ReconsTime$'.3' + ' s', [], Instructions, PoseOut)endif

PipeJointPileOM3DID

在這里插入圖片描述


4.5,管道接頭查找匹配
 * Perform surface-based 3D matchingMessage := 'Search ' + NumMatches + ' best parts with surface based matching...'disp_message (WindowHandle, Message, 'window', 36, 12, 'black', 'true')count_seconds (T2)* 4.6,表面匹配查找find_surface_model (PipeJointSMID, PipeJointPileOM3DID, 0.03, 0.05, MinScore, 'false', Params, Values, Poses, Scores, SurfaceMatchingResultID)count_seconds (T3)* 表面匹配耗時:MatchingDiff := T3 - T2* * Display the results* 4.7, 禁用形輸出的實時刷新,將多個圖形操作緩存后統一顯示,可有效解決界面閃爍問題   set_system ('flush_graphic', 'false')select_obj (Images, Img, 1)dev_set_part (0, 0, Height - 1, Width - 1)dev_display (Img)
*     count_seconds (T4)for MatchIndex := 0 to |Scores| - 1 by 1* 管道接頭在世界坐標系中位姿PoseObjInWorld := Poses[MatchIndex * 7:(MatchIndex * 7) + 6]* 世界坐標系在對象坐標系的位姿
*         rigid_trans_object_model_3d (PipeJointOM3DID, PoseObjInWorld, ObjectModel3DRigidTrans1)
*         visualize_object_model_3d (WindowHandle, [PipeJointPileOM3DID,ObjectModel3DRigidTrans1], [], [],\['color_0','color_1','alpha_1'], ['gray','green',0.5], [], [], [], PoseOut1)pose_invert (PoseObjInWorld, PoseWorldInObj)* 相機在世界坐標系的位姿+世界坐標系在對象坐標系的位姿=相機坐標系在對象坐標系的位姿        pose_compose (PoseWorldInObj, Pose0, PoseCamInObj)   *對象在相機坐標系中的位姿 pose_invert (PoseCamInObj, ObjPoseInCam0)* Display the coordinate system of the partdev_set_colored (3)dev_set_line_width (3)*  4.8,顯示匹配到的管道接頭的坐標系        disp_3d_coord_system (WindowHandle, CamParam0, ObjPoseInCam0, 0.03)* Display the faces of the partrigid_trans_object_model_3d (PipeJointOM3DID, PoseObjInWorld, ObjectModel3DRigidTrans)* 4.9,投影到平面形成輪廓* 'data':'face',指定投影時處理模型的三角面片(faces)而非原始點云數據* 'hidden_surface_removal':'true',使用隱藏面移除技術,消除被遮擋的不可見面,提升投影結果的真實感  project_object_model_3d (ModelContours, ObjectModel3DRigidTrans, CamParam0, WorldPose0, ['data','hidden_surface_removal'], ['faces','true'])dev_set_line_width (2)dev_set_color ('green')dev_display (ModelContours)* clear_object_model_3d (ObjectModel3DRigidTrans)endforset_system ('flush_graphic', 'true')
*     count_seconds (T5)
*     DispTime := T5 - T4* Message := '立體視覺重建耗時: ' + ReconsTime$'.2f' + ' s'Message[1] := '找到: ' + |Scores| + ' 管道接頭表面匹配耗時: ' + MatchingDiff$'.2f' + ' s'
*     Message[2] := 'Visualization: ' + DispTime$'.1f' + ' s'disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')disp_message (WindowHandle, 'Camera 0', 'window', Height - 36, 12, 'white', 'false')if (Index < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif* * clear the 3D object modelclear_object_model_3d (PipeJointPileOM3DID)copy_obj (Images, OldImage, 1, 1)
endfor
* 

ModelContours
在這里插入圖片描述


5,完整代碼

* 案例庫:locate_pipe_joints_stereo.hdev* 目的:
* 查找立體視覺獲取的3D對象中管道連接頭的立體位置* 過程:
* 采用四個相機采集的圖像立體重建一堆管道連接頭的三維表面* 基于表面的3D匹配,查找
* 
* 
*---------------------part01:初始化窗口
* *****
* Initializations:
* *****
* 
dev_close_window ()
dev_update_off ()
dev_get_preferences ('suppress_handled_exceptions_dlg', PreferenceValue)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')
ImagePath := '3d_machine_vision/multi_view/'
ImagePrefix := 'multi_view_pipe_joints'
read_image (Image, ImagePath + ImagePrefix + '_cam_0_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 
* *****
*-------------------- Part02: 多視角立體視覺模型創建
* *****
* 2.1,Read the camera setup model from file and get the parameters
* and the poses of the cameras
tryread_camera_setup_model ('../four_camera_setup_model.csm', CameraSetupModelID)
catch (Exception)if (Exception[0] == 5200)* 初始化生成相機內參+外參* 需要特別注意這里的外參是常見標定獲取的camerapose的逆變換init_camera_setup (CameraSetupModelID)elsethrow (Exception)endif
endtry
* 
* 2.2 ,獲取多視角立體視覺模型參數
get_camera_setup_param (CameraSetupModelID, 'general', 'num_cameras', NumCameras)
* 需要特別注意:結合上下文可知Pose0應該是常見標定獲取的camerapose的逆變換
* (camerapose為標定板在相機坐標系的位姿)
get_camera_setup_param (CameraSetupModelID, 0, 'pose', Pose0)
get_camera_setup_param (CameraSetupModelID, 1, 'pose', Pose1)
get_camera_setup_param (CameraSetupModelID, 2, 'pose', Pose2)
get_camera_setup_param (CameraSetupModelID, 3, 'pose', Pose3)
get_camera_setup_param (CameraSetupModelID, 0, 'params', CamParam0)
get_camera_setup_param (CameraSetupModelID, 1, 'params', CamParam1)
get_camera_setup_param (CameraSetupModelID, 2, 'params', CamParam2)
get_camera_setup_param (CameraSetupModelID, 3, 'params', CamParam3)* 
* Create a multi-view stereo model, initialize it, and clear
* the camera setup, which is no longer required* 2.3,創建雙目立體視覺。
* 'surface_pairwise':基于成對圖像進行表面重建
create_stereo_model (CameraSetupModelID, 'surface_pairwise', [], [], StereoModelID)
clear_camera_setup_model (CameraSetupModelID)* 2.4,多視角立體視覺模型參數設置*-----圖像校正參數組* -> Subsampling X, Y, Z
* 設置下采樣步長為3,可降低計算量但可能導致鋸齒效應,需配合抗鋸齒參數使用
set_stereo_model_param (StereoModelID, 'sub_sampling_step', 3)
* -> Interpolation aliasing by binocular image rectification
* 雙線性插值('bilinear'),平衡校正圖像的質量與計算效率
set_stereo_model_param (StereoModelID, 'rectif_interpolation', 'bilinear')
* 子采樣系數1.2,輕微降低分辨率以加速處理
set_stereo_model_param (StereoModelID, 'rectif_sub_sampling', 1.2)* -----雙目視差計算參數組* 采用歸一化互相關('ncc')匹配算法,對光照變化魯棒性強
set_stereo_model_param (StereoModelID, 'binocular_method', 'ncc')
* 視差計算的金字塔層級數,設置為1時單層直接計算,應用于高紋理/實時性要求高的場景
set_stereo_model_param (StereoModelID, 'binocular_num_levels', 1)
* 匹配掩模尺寸19×19像素,適合中等紋理場景
set_stereo_model_param (StereoModelID, 'binocular_mask_width', 19)
set_stereo_model_param (StereoModelID, 'binocular_mask_height', 19)
* 紋理閾值設為0,禁用紋理過濾,適用于低紋理場景
set_stereo_model_param (StereoModelID, 'binocular_texture_thresh', 0)
* 匹配分數閾值0.4,過濾低置信度匹配點
set_stereo_model_param (StereoModelID, 'binocular_score_thresh', 0.4)
* 啟用左右一致性檢查('left_right_check'),消除遮擋區域誤匹配
set_stereo_model_param (StereoModelID, 'binocular_filter', 'left_right_check')
* 子像素優化模式為插值法('interpolation'),提升深度分辨率
set_stereo_model_param (StereoModelID, 'binocular_sub_disparity', 'interpolation')*------ 空間約束和相機約束* 定義3D工作空間為[-0.2,-0.07,-0.075]到[0.2,0.07,-0.004](單位:米),自動計算視差范圍
* 邊界框(bounding_box)可約束重建范圍,提升效率
set_stereo_model_param (StereoModelID, 'bounding_box', [-0.2,-0.07,-0.075,0.2,0.07,-0.004])
* 配置相機對為(0,2)和(1,3),支持多相機陣列的靈活組合
set_stereo_model_image_pairs (StereoModelID, [0,2], [1,3])
* 
* *****
* --------------------Part03: 創建表面匹配模型
* *****
* 3.1,讀取管道接頭3D對象
read_object_model_3d ('pipe_joint', 'm', [], [], PipeJointOM3DID, Status)
create_surface_model (PipeJointOM3DID, 0.03, [], [], PipeJointSMID)* 3.2,預處理匹配模型,提高匹配效率
* 'shape_base _matching_3d':激活基于表面集合特征的匹配模式,適用于管道接頭等工業零件的定位
* 為true時進行法向量計算,曲率特征提取,關鍵點自動選擇,提高匹配效率
prepare_object_model_3d (PipeJointOM3DID, 'shape_based_matching_3d', 'true', [], [])
* 
* *****
*-------------------Part04:多視角立體視覺重建管件堆表面模型* 4.1,設置多視角立體模型重建表面3D模型所需必要參數
* 重建管件堆的表面,并利用基于表面的三維匹配技術確定多個管道接頭的位置。
* *****
NumMatches := 3
MinScore := .3* pose_ref_scoring_dist_rel:HALCON中用于曲面匹配(Surface-Based Matching)的關鍵參數,主要控制精細化姿態優化階段的評分距離容差
* 該參數以相對值形式(相對于物體尺寸)設置匹配評分時的最大允許距離偏差
Params := ['num_matches','pose_ref_scoring_dist_rel','scene_normal_computation']
Values := [NumMatches,0.02,'mls']
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
* 
* 注意:這里的Pose0是相機在世界坐標系的位姿,不是常見標定產生的標定板在相機坐標系的位姿camerapose
pose_invert (Pose0, WorldPose0)
* 
gen_empty_obj (EmptyObject)
NumImages := 15
for Index := 1 to NumImages by 1* * 4.2,讀取重建多視角立體表面模型所需的圖像read_multi_view_stereo_images (Images, ImagePath, ImagePrefix, Index, NumCameras)* * Reconstruct the 3D scene (the pile of pipe fittings)Message := 'Performing the reconstruction...'* 4.3,顯示表面重建所用的圖像display_multi_view_stereo_images (Images, WindowHandle)disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')count_seconds (T0)* 4.4,多視角立體模型重建表面3D模型reconstruct_surface_stereo (Images, StereoModelID, PipeJointPileOM3DID)count_seconds (T1)* 重建所用時間ReconsTime := T1 - T0* PoseIn := [0.0,0.0,0.5,-30,0,180,0]* 4.5,顯示重建的3D模型   if (Index == 1)visualize_object_model_3d (WindowHandle, PipeJointPileOM3DID, CamParam0, PoseIn, ['color','point_size'], ['yellow',1], 'Reconstructed scene in ' + ReconsTime$'.3' + ' s', [], Instructions, PoseOut)endif* * Perform surface-based 3D matchingMessage := 'Search ' + NumMatches + ' best parts with surface based matching...'disp_message (WindowHandle, Message, 'window', 36, 12, 'black', 'true')count_seconds (T2)* 4.6,表面匹配查找find_surface_model (PipeJointSMID, PipeJointPileOM3DID, 0.03, 0.05, MinScore, 'false', Params, Values, Poses, Scores, SurfaceMatchingResultID)count_seconds (T3)* 表面匹配耗時:MatchingDiff := T3 - T2* * Display the results* 4.7, 禁用形輸出的實時刷新,將多個圖形操作緩存后統一顯示,可有效解決界面閃爍問題   set_system ('flush_graphic', 'false')select_obj (Images, Img, 1)dev_set_part (0, 0, Height - 1, Width - 1)dev_display (Img)
*     count_seconds (T4)for MatchIndex := 0 to |Scores| - 1 by 1* 管道接頭在世界坐標系中位姿PoseObjInWorld := Poses[MatchIndex * 7:(MatchIndex * 7) + 6]* 世界坐標系在對象坐標系的位姿
*         rigid_trans_object_model_3d (PipeJointOM3DID, PoseObjInWorld, ObjectModel3DRigidTrans1)
*         visualize_object_model_3d (WindowHandle, [PipeJointPileOM3DID,ObjectModel3DRigidTrans1], [], [],\['color_0','color_1','alpha_1'], ['gray','green',0.5], [], [], [], PoseOut1)pose_invert (PoseObjInWorld, PoseWorldInObj)* 相機在世界坐標系的位姿+世界坐標系在對象坐標系的位姿=相機坐標系在對象坐標系的位姿        pose_compose (PoseWorldInObj, Pose0, PoseCamInObj)   *對象在相機坐標系中的位姿 pose_invert (PoseCamInObj, ObjPoseInCam0)* Display the coordinate system of the partdev_set_colored (3)dev_set_line_width (3)*  4.8,顯示匹配到的管道接頭的坐標系        disp_3d_coord_system (WindowHandle, CamParam0, ObjPoseInCam0, 0.03)* Display the faces of the partrigid_trans_object_model_3d (PipeJointOM3DID, PoseObjInWorld, ObjectModel3DRigidTrans)* 4.9,投影到平面形成輪廓* 'data':'face',指定投影時處理模型的三角面片(faces)而非原始點云數據* 'hidden_surface_removal':'true',使用隱藏面移除技術,消除被遮擋的不可見面,提升投影結果的真實感  project_object_model_3d (ModelContours, ObjectModel3DRigidTrans, CamParam0, WorldPose0, ['data','hidden_surface_removal'], ['faces','true'])dev_set_line_width (2)dev_set_color ('green')dev_display (ModelContours)* clear_object_model_3d (ObjectModel3DRigidTrans)endforset_system ('flush_graphic', 'true')
*     count_seconds (T5)
*     DispTime := T5 - T4* Message := '立體視覺重建耗時: ' + ReconsTime$'.2f' + ' s'Message[1] := '找到: ' + |Scores| + ' 管道接頭表面匹配耗時: ' + MatchingDiff$'.2f' + ' s'
*     Message[2] := 'Visualization: ' + DispTime$'.1f' + ' s'disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')disp_message (WindowHandle, 'Camera 0', 'window', Height - 36, 12, 'white', 'false')if (Index < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif* * clear the 3D object modelclear_object_model_3d (PipeJointPileOM3DID)copy_obj (Images, OldImage, 1, 1)
endfor
* 
* Clear the stereo model and the surface model
clear_stereo_model (StereoModelID)
clear_surface_model (PipeJointSMID)
clear_object_model_3d (PipeJointOM3DID)
dev_set_preferences ('suppress_handled_exceptions_dlg', PreferenceValue)

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

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

相關文章

移遠通信 × 紫光展銳,推動FWA “5G+AI”新體驗

6月19日&#xff0c;在2025 MWC上海期間&#xff0c;移遠通信宣布&#xff0c;攜手紫光展銳&#xff0c;推出面向下一代CPE應用的“5GAI”融合解決方案。目前雙方正聯合多家CPE廠商開展方案深度調優&#xff0c;以加速5GAI CPE終端的產業化落地進程。 該方案以移遠5G模組RG620…

深入理解Grad-CAM:用梯度可視化神經網絡的“注意力“

深入理解Grad-CAM&#xff1a;用梯度可視化神經網絡的"注意力" 引言 在深度學習的發展過程中&#xff0c;模型的可解釋性一直是一個重要的研究方向。盡管現代神經網絡在圖像識別、自然語言處理等任務上取得了令人矚目的成果&#xff0c;但它們往往被稱為"黑盒…

離線環境jenkins構建前端部署鏡像

gitlabjenkins 實現前端項目打包成 docker 鏡像&#xff1b;gitlab部署就不贅述了&#xff1b;因部署的gitlab版本的webhooks有問題&#xff0c;無法進行配置,所以文章的構建是手動觸發的。并且nodejs部署應該也能跟docker一樣直接安裝進jenkins的鏡像(但是多版本可能就有其他問…

案例:塔能科技×某市智能照明——從傳統亮化到智慧光生態的跨越

在城市發展的滾滾浪潮中&#xff0c;市政照明不僅是驅散黑夜的光明使者&#xff0c;更是衡量城市智能化水平的關鍵標尺。貴州某市的城市照明系統正經歷一場意義深遠的革新&#xff0c;塔能科技以創新科技為核心驅動力&#xff0c;為這座城市的夜間照明生態注入全新活力。通過智…

LeapMotion-HandPoseRecorder 腳本詳解

HandPoseRecorder 腳本詳解 這個腳本是一個用于在 Unity 中錄制和保存 Leap Motion 手部姿勢的工具。下面我將詳細解釋腳本的各個部分: 核心功能 該腳本的主要作用是: 從 Leap Motion 設備捕獲當前手部姿勢數據 將姿勢數據序列化為可重用的 ScriptableObject 在 Unity 項目…

【Guava】0.做自己的編程語言

【Guava】0.做自己的編程語言 0.前言1.明確你的目標1.2.設計1.3.寫一個介紹 2.開始吧&#xff01; 0.前言 DO WHAT THE F**K YOU WANT TO DO 我相信&#xff0c;網上有許多各式各樣的做自己的編程語言教程&#xff0c;but 都是這樣 收費 shit 本教程教你真正教你實現一個名叫G…

【軟考高級系統架構論文】論無服務器架構及其應用

論文真題 近年來&#xff0c;隨著信息技術的迅猛發展和 應用需求的快速更迭&#xff0c;傳統的多層企業應用系統架構面臨越來越多的挑戰&#xff0c;已經難以適應這種變化。在這一背景下&#xff0c;無服務器架構(Serverless Architecture) 逐漸流行&#xff0c;它強調業務邏輯…

國產MCU A\B SWAP原理及實操

看到有讀者留言說還是沒理清A\B SWAP的原理。 今天就以某國產MCU為例&#xff0c;實際演示一番&#xff0c;看看大家在芯片設計時思路是什么。 我們首先回顧下SWAP的基本思想。 SWAP的基本思想是將PFLASH分成兩組Bank&#xff0c;Bank A(假設是active)和Bank B(假設是inacti…

目標檢測neck經典算法之FPN的源碼實現

┌────────────────────────────────────────────────────┐│ 初始化構造 (__init__) │└─────────────────────────────────────────────…

extern關鍵字:C/C++跨文件編程利器

在 C 和 C 中&#xff0c;extern 是一個關鍵字&#xff0c;用于聲明變量或函數是在其他文件中定義的。它主要用于實現多個源文件之間的符號共享。 目錄 &#x1f4cc; 一、C語言中的 extern 1. 基本作用 2. 示例說明 定義全局變量&#xff08;只在一個 .c 文件中&#xff…

編程語言的演化與選擇:技術浪潮中的理性決策

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;為什么“選對語言”比“掌握語言”更重要&#xff1f; 在軟件開發的世界里&#xff0c;語言是一切的基礎。…

【StarRocks系列】StarRocks vs Mysql

目錄 StarRocks 簡介 核心特性 典型應用場景 StarRocks vs MySQL&#xff1a;核心區別詳解 關鍵差異總結 如何選擇&#xff1f; StarRocks 簡介 StarRocks 是一款高性能、全場景、分布式、實時分析型的數據庫&#xff08;MPP - 大規模并行處理&#xff09;。它誕生于解決…

Axios 知識點全面總結

文章目錄 Axios 知識點全面總結一、Axios 基礎概念1. 什么是 Axios&#xff1f;2. 核心特性 二、安裝與基本用法1. 安裝2. 基本請求示例 三、請求方法與參數四、請求配置選項&#xff08;config&#xff09;五、攔截器&#xff08;Interceptors&#xff09;六、錯誤處理七、取消…

【軟考高級系統架構論文】論 SOA 在企業集成架構設計中的應用

論文真題 企業應用集成(Enterprise Application Integration, EAI)是每個企業都必須要面對的實際問題。面向服務的企業應用集成是一種基于面向服務體系結構(Service - Oriented Architecture, SOA)的新型企業應用集成技術,強調將企業和組織內部的資源和業務功能暴露為服務,實…

springboot 提供的可擴展接口

一、spring 和 springboot Spring框架提供了全面的基礎架構支持。包含依賴注入和開箱即用等模塊&#xff0c;如&#xff1a;Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test Spring Boot 約定大于配置-----消除了設置Spring應用程序所需…

python學習打卡day55

DAY 55 序列預測任務介紹 知識點回顧 序列預測介紹 單步預測多步預測的2種方式 序列數據的處理&#xff1a;滑動窗口多輸入多輸出任務的思路經典機器學習在序列任務上的劣勢&#xff1b;以隨機森林為例 作業&#xff1a;手動構造類似的數據集&#xff08;如cosx數據&#xff09…

Leetcode hot100 Java刷題

文章目錄 快排146. LRU 緩存acm模式樹的前中后序遍歷acm模式鏈表的基本操作1. 兩數之和49. 字母異位詞分組128. 最長連續序列283. 移動零11. 盛最多水的容器15. 三數之和42. 接雨水53. 最大子數組和56. 合并區間73. 矩陣置零48. 旋轉圖像141. 環形鏈表142. 環形鏈表 II24. 兩兩…

Linux 命令詳解 —— 進程管理

文章目錄 精通Linux操作系統(以Centos7為例)進程管理ps常用組合進程狀態 STAT 詳解高級篩選與格式化輸出按條件過濾進程自定義輸出字段顯示進程樹關系排障場景定位高 CPU檢查僵尸進程查看進程的線程查看進程打開的文件/網絡連接常用組合速查top前5摘要區進程列表信息交互式命令…

【軟考高級系統架構論文】論湖倉一體架構及其應用

論文真題&#xff1a; 隨著5G、大數據、人工智能、物聯網等技術的不斷成熟&#xff0c;各行各業的業務場景日益復雜&#xff0c;企業數據呈現出大規模、多樣性的特點&#xff0c;特別是非結構化數據呈現出爆發式增長趨勢。在這一背景下&#xff0c;企業數據管理不再局限于傳統…

Docker 高級管理筆記

前言&#xff1a;Docker 高級管理概述 隨著 Docker 技術的廣泛應用&#xff0c;容器化已成為現代軟件開發與部署的核心方式。本筆記聚焦 Docker 高級管理中的兩大關鍵技術 —— 容器通信與數據持久化&#xff0c;深入解析 Docker 網絡模式、端口映射、容器互聯機制及數據卷管理…