南寧cms建站影視網(wǎng)站建設
鶴壁市浩天電氣有限公司
2026/01/24 10:33:54
南寧cms建站,影視網(wǎng)站建設,wordpress windows主題,企業(yè)網(wǎng)站托管方案Halcon實戰(zhàn)#xff1a;基于surface_fusion的多相機3D表面重建技術詳解
一、引言
在工業(yè)機器視覺領域#xff0c;多視圖立體視覺#xff08;MVS#xff09; 是實現(xiàn)三維重建的核心技術之一。它通過從不同視角拍攝的多張二維圖像#xff0c;計算像素間的視差#xff0c;進而…Halcon實戰(zhàn)基于surface_fusion的多相機3D表面重建技術詳解一、引言在工業(yè)機器視覺領域多視圖立體視覺MVS是實現(xiàn)三維重建的核心技術之一。它通過從不同視角拍攝的多張二維圖像計算像素間的視差進而恢復出場景的三維結構。本案例詳細展示了如何使用Halcon的surface_fusion方法對多相機采集的圖像序列進行3D表面重建。surface_fusion方法是Halcon提供的一種高級3D重建技術它建立在surface_pairwise成對匹配的基礎上通過融合來自多個相機對的重建結果生成一個更完整、更精確的三維表面模型。這種方法特別適用于需要高精度、高完整性3D模型的場景如零部件檢測、逆向工程和質(zhì)量控制。二、核心知識點鋪墊1. 多相機系統(tǒng)與相機模型一個典型的多相機3D重建系統(tǒng)由多個固定在不同位置的相機組成。在進行重建前必須通過相機標定過程獲取每個相機的內(nèi)參如焦距、主點和外參如位置、姿態(tài)。這些參數(shù)被保存在相機設置模型.csm文件中供重建算法使用。2. 視差計算Disparity Calculation視差是指同一物理點在不同相機圖像上的投影位置差異。它是三維重建的基礎。Halcon提供了多種視差計算方法如binocular_disparity可以通過設置不同的匹配算法如NCC、窗口大小和過濾選項來優(yōu)化視差圖的質(zhì)量。3.surface_pairwise與surface_fusionsurface_pairwise該方法首先對每一對相機拍攝的圖像進行立體匹配計算出視差圖然后通過三角測量原理將視差圖轉換為稀疏的三維點云。surface_fusion該方法以surface_pairwise生成的多組稀疏點云為輸入通過一種融合算法將這些點云合并并優(yōu)化最終生成一個連續(xù)、光滑的三維表面模型。4. 關鍵參數(shù)Resolution定義了重建后3D模型的體素Voxel大小。分辨率越高模型越精細但計算量和內(nèi)存消耗也越大。BoundingBox定義了3D重建的空間范圍。只有在該范圍內(nèi)的點才會被重建合理設置可以顯著減少計算量。SurfaceTolerance表面容差用于控制表面重建的平滑程度和精度。三、核心算子列表算子名核心功能read_camera_setup_model讀取相機設置模型文件.csm獲取相機內(nèi)外參。create_stereo_model創(chuàng)建一個多視圖立體模型并指定重建方法如’surface_fusion’。set_stereo_model_param設置立體模型的各種參數(shù)如視差計算方法、分辨率、邊界框等。set_stereo_model_image_pairs定義用于立體匹配的相機圖像對。reconstruct_surface_stereo執(zhí)行3D表面重建生成最終的3D物體模型。get_stereo_model_object_model_3d獲取重建過程中生成的中間結果如’surface_pairwise’的點云。visualize_object_model_3d可視化顯示3D物體模型支持旋轉、縮放和平移交互。clear_stereo_model清除立體模型釋放內(nèi)存。clear_object_model_3d清除3D物體模型釋放內(nèi)存。四、完整代碼中文注釋// 格式// 【示例說明】本示例演示如何使用 surface_fusion 方法從多個相機的圖像中重建多個物體的3D模型。 // 核心流程加載相機模型 - 創(chuàng)建立體模型 - 設置參數(shù) - 循環(huán)重建并顯示結果。 dev_close_window () // 關閉當前窗口 dev_update_off () // 關閉窗口更新提高運行效率 dev_open_window (0, 0, 512, 512, black, WindowHandle) // 打開一個新窗口 dev_resize_window_fit_size (0, 0, 1024, 600, -1, -1) // 調(diào)整窗口大小以適應顯示 set_display_font (WindowHandle, 14, mono, true, false) // 設置顯示字體 // 定義交互說明信息 Instructions : Rotate: Left button Instructions[1] : Zoom: Shift left button Instructions[2] : Move: Ctrl left button // 顯示介紹信息 Message : This example reconstructs several 3D objects using the method surface_fusion. Message[2] : Message[3] : The surface_fusion method uses the results of the method surface_pairwise as Message[4] : input for the fusion algorithm. Therefore, the pairwise parameters have to be Message[5] : configured as well. Message[6] : Message[7] : For all reconstructions, the same parameter settings are used. Message[8] : It is possible to tweak the parameters to optimally fit one particular object. Message[9] : This will improve the reconstruction results even further. dev_disp_text (Message, window, 12, 12, white, box, false) // 顯示多行文本 dev_disp_text (Press Run (F5) to continue, window, bottom, right, black, [], []) // 顯示底部提示 stop () // 暫停等待用戶按鍵 // 【重建分辨率選擇】 // 為了演示目的使用相對較低的分辨率以減少運行時間。 // 如果追求更高精度可以將此參數(shù)設置為false。 FastReconstruction : true // 根據(jù)分辨率選擇設置參數(shù) if (FastReconstruction) Resolution : 0.0012 // 設置重建分辨率為1.2毫米 Info : , coarse resolution // 記錄分辨率信息 else Resolution : 0.0006 // 設置重建分辨率為0.6毫米 Info : , fine resolution // 記錄分辨率信息 endif SurfaceTolerance : 2 * Resolution // 設置表面容差為分辨率的兩倍 // 【加載相機模型】 read_camera_setup_model (cam_setup_model.csm, CameraSetupModelID) // 讀取相機設置模型文件 // 獲取相機數(shù)量 get_camera_setup_param (CameraSetupModelID, general, num_cameras, NumCameras) // 【創(chuàng)建立體模型】 // 使用 surface_fusion 方法創(chuàng)建一個多視圖立體模型 create_stereo_model (CameraSetupModelID, surface_fusion, [], [], StereoModelID) clear_camera_setup_model (CameraSetupModelID) // 清除相機設置模型釋放內(nèi)存 // 【配置立體模型參數(shù)】 // 設置圖像校正的插值方法為雙線性插值 set_stereo_model_param (StereoModelID, rectif_interpolation, bilinear) // 定義用于立體匹配的相機圖像對這里使用相機0與相機1、相機0與相機2的組合 set_stereo_model_image_pairs (StereoModelID, [0,0], [1,2]) // 設置視差計算方法為 binocular set_stereo_model_param (StereoModelID, disparity_method, binocular) // 設置雙目匹配算法為歸一化互相關NCC set_stereo_model_param (StereoModelID, binocular_method, ncc) // 設置匹配窗口大小為11x11 set_stereo_model_param (StereoModelID, binocular_mask_width, 11) set_stereo_model_param (StereoModelID, binocular_mask_height, 11) // 啟用左右一致性檢查以提高匹配的魯棒性 set_stereo_model_param (StereoModelID, binocular_filter, left_right_check) // 使用插值方法計算亞像素級視差提高精度 set_stereo_model_param (StereoModelID, binocular_sub_disparity, interpolation) // 【循環(huán)處理多個物體數(shù)據(jù)集】 NumObjects : 5 // 物體總數(shù) for I : 1 to NumObjects by 1 // 讀取當前物體的所有相機圖像 read_image (Images, 3d_machine_vision/multi_view/engine_part_cam_ [0:2] _0 I) // 將圖像拼接起來以便顯示 tile_images (Images, TiledImage, 2, vertical) // 【設置重建邊界框】 // 根據(jù)不同物體設置不同的3D重建空間范圍 if (I 1) BoundingBox : [-0.134,-0.043,-0.005,-0.022,0.067,0.042] elseif (I 2) BoundingBox : [-0.135,-0.039,-0.005,-0.02,0.075,0.035] elseif (I 3 or I 4) BoundingBox : [-0.14,-0.048,-0.005,-0.018,0.088,0.040] elseif (I 5) BoundingBox : [-0.147,-0.077,-0.005,-0.02,0.088,0.04] endif set_stereo_model_param (StereoModelID, bounding_box, BoundingBox) // 啟用持久化模式以便獲取 surface_pairwise 的中間結果 set_stereo_model_param (StereoModelID, persistence, 1) // 設置點云網(wǎng)格化方法為 isosurface生成連續(xù)的表面 set_stereo_model_param (StereoModelID, point_meshing, isosurface) // 設置重建分辨率 set_stereo_model_param (StereoModelID, resolution, Resolution) // 設置表面容差 set_stereo_model_param (StereoModelID, surface_tolerance, SurfaceTolerance) // 設置結果的顏色屬性為 median中值顏色 set_stereo_model_param (StereoModelID, color, median) // 如果是快速重建增加平滑程度以減少噪點 if (FastReconstruction) set_stereo_model_param (StereoModelID, smoothing, 1.5) endif // 顯示當前處理的圖像 dev_resize_window_fit_image (TiledImage, 0, 0, -1, -1) get_part (WindowHandle, Row1, Column1, Row2, Column2) dev_clear_window () dev_display (TiledImage) dev_disp_text (Reconstruct scene from 3 different views. Please wait..., window, 12, 12, black, [], []) // 【執(zhí)行3D重建】 count_seconds (S1) // 記錄開始時間 reconstruct_surface_stereo (Images, StereoModelID, OM3DFusion) // 執(zhí)行表面融合重建 count_seconds (S2) // 記錄結束時間 // 獲取 surface_pairwise 方法生成的中間3D模型點云 get_stereo_model_object_model_3d (StereoModelID, m3d_pairwise, OM3DPairwise) // 創(chuàng)建一個可視化用的位姿Pose create_pose (0.026, -0.07, 1.9, 330, 345, 300, RpT, gba, point, VisPose) // 【可視化顯示結果】 // 1. 顯示 surface_pairwise 的中間結果橙色點云 Title : Intermediate result (reconstructed using surface_pairwise Info ) ( I / NumObjects ) visualize_object_model_3d (WindowHandle, OM3DPairwise, [], VisPose, [color,point_size], [orange,1], Title, [], Instructions, VisPose) // 2. 顯示 surface_fusion 的融合結果 Title : Reconstructed object model using surface_fusion Info ( I / NumObjects ) visualize_object_model_3d (WindowHandle, OM3DFusion, [], VisPose, [], [], Title, [], Instructions, VisPose) // 3. 顯示最終的、帶顏色和三角化的融合結果并顯示重建時間 Title : Final result (colored and triangulated Info ) ( I / NumObjects )
Reconstruction time: (S2 - S1)$.2 s (Resolution (Resolution * 1000) mm) visualize_object_model_3d (WindowHandle, OM3DFusion, [], VisPose, color_attrib, red, Title, [], Instructions, VisPose) // 清理當前物體的3D模型釋放內(nèi)存 clear_object_model_3d (OM3DPairwise) clear_object_model_3d (OM3DFusion) endfor // 清理立體模型釋放內(nèi)存 clear_stereo_model (StereoModelID)五、核心算子深度剖析1.create_stereo_model功能創(chuàng)建一個多視圖立體視覺模型是進行3D重建的入口。該算子會根據(jù)指定的相機設置模型和重建方法初始化內(nèi)部數(shù)據(jù)結構。參數(shù)說明參數(shù)名含義示例值CameraSetupModelID輸入相機設置模型的句柄包含了所有相機的內(nèi)外參數(shù)。CameraSetupModelIDMethod指定3D重建的方法。surface_fusionGenParamName可選的通用參數(shù)名列表。[]GenParamValue可選的通用參數(shù)值列表。[]StereoModelID輸出新創(chuàng)建的立體模型的句柄。StereoModelID2.set_stereo_model_param功能設置立體模型的各種參數(shù)以控制重建過程的各個方面。這是優(yōu)化重建效果的關鍵。常用參數(shù)說明參數(shù)名含義常用取值disparity_method視差計算方法。binocularbinocular_method雙目匹配算法。ncc,sadbinocular_mask_width匹配窗口寬度。5, 7, 9, 11binocular_mask_height匹配窗口高度。5, 7, 9, 11bounding_box3D重建的空間范圍。[XMin, YMin, ZMin, XMax, YMax, ZMax]resolution3D模型的體素分辨率。0.001(1mm)surface_tolerance表面重建的容差。2 * Resolutioncolor輸出3D模型的顏色屬性。median,nearest3.reconstruct_surface_stereo功能執(zhí)行3D表面重建。該算子是整個流程的核心它會使用之前設置好的所有參數(shù)和相機模型對輸入的多張圖像進行處理最終生成一個三維物體模型。參數(shù)說明參數(shù)名含義示例值Images輸入的多張相機圖像。ImagesStereoModelID立體模型的句柄。StereoModelIDObjectModel3D輸出的重建結果是一個3D物體模型句柄。OM3DFusion4.get_stereo_model_object_model_3d功能獲取在reconstruct_surface_stereo執(zhí)行過程中生成的中間或附加的3D物體模型。參數(shù)說明參數(shù)名含義示例值StereoModelID立體模型的句柄。StereoModelIDObjectName要獲取的3D物體模型的名稱。m3d_pairwiseObjectModel3D輸出獲取到的3D物體模型句柄。OM3DPairwise六、全流程解析步驟1環(huán)境初始化與參數(shù)設置代碼首先關閉了不必要的窗口更新打開了一個新的顯示窗口并設置了字體。然后定義了一個布爾變量FastReconstruction來選擇不同的重建分辨率這直接影響了重建的速度和精度。步驟2加載相機模型通過read_camera_setup_model讀取相機配置文件.csm該文件包含了進行三維重建所必需的相機內(nèi)外參數(shù)。步驟3創(chuàng)建并配置立體模型使用create_stereo_model創(chuàng)建了一個基于surface_fusion方法的立體模型。接著通過一系列set_stereo_model_param調(diào)用詳細配置了視差計算、圖像對選擇、重建分辨率、邊界框等關鍵參數(shù)。步驟4循環(huán)處理多個物體代碼對5個不同的物體進行了循環(huán)處理讀取圖像讀取當前物體的所有相機視圖圖像。設置邊界框根據(jù)物體的大小和位置設置合適的3D重建空間范圍。執(zhí)行重建調(diào)用reconstruct_surface_stereo進行3D表面融合重建并記錄重建時間。獲取中間結果使用get_stereo_model_object_model_3d獲取surface_pairwise方法生成的中間點云結果??梢暬Y果使用visualize_object_model_3d分別顯示了中間的點云結果、最終的融合表面模型以及帶有顏色和三角化的最終模型方便用戶進行觀察和比較。資源清理在每次循環(huán)結束后清理當前物體的3D模型釋放內(nèi)存。步驟5資源釋放最后在所有物體處理完畢后清理立體模型釋放所有相關資源。七、實戰(zhàn)優(yōu)化建議1. 分辨率與精度的權衡高精度需求如果應用場景如精密零件檢測對模型精度要求極高應將FastReconstruction設為false使用Resolution : 0.0006或更小的分辨率。實時性需求如果需要快速得到重建結果如在線檢測則應使用較高的分辨率如0.0012并可以考慮啟用smoothing參數(shù)來減少噪點。2. 邊界框BoundingBox的優(yōu)化精確測量在設置BoundingBox前可以先用較低分辨率對物體進行一次快速重建獲取其大致的空間范圍然后在此基礎上稍微擴大一點作為精確重建的邊界框。避免冗余邊界框不應設置過大否則會包含大量空的空間增加計算量和內(nèi)存使用。3. 視差計算參數(shù)調(diào)優(yōu)匹配窗口大小對于紋理豐富的表面可以使用較小的窗口如5x5或7x7以提高細節(jié)對于紋理較少或重復紋理的表面應使用較大的窗口如11x11或15x15以提高匹配的魯棒性。匹配算法選擇ncc歸一化互相關對光照變化不敏感適用于大多數(shù)場景sad絕對差之和計算速度更快但對光照變化較為敏感。4. 表面后處理重建得到的3D模型可以通過Halcon的其他算子進行后處理例如smooth_object_model_3d對表面進行平滑處理。reduce_object_model_3d對點云進行下采樣減少數(shù)據(jù)量。compute_object_model_3d_metrics計算3D模型的體積、表面積等度量。八、總結本案例詳細介紹了如何使用Halcon的surface_fusion方法進行多相機3D表面重建。通過對代碼的逐行解析和核心算子的深入剖析我們理解了多視圖立體視覺重建的完整流程包括相機模型加載、立體模型創(chuàng)建與配置、三維重建執(zhí)行以及結果可視化。surface_fusion方法通過融合多個相機對的重建結果能夠生成比傳統(tǒng)成對匹配方法更完整、更精確的3D表面模型是工業(yè)三維檢測和質(zhì)量控制領域的強大工具。掌握其參數(shù)調(diào)優(yōu)方法和實戰(zhàn)技巧對于成功應用該技術至關重要。