本文是工作和學(xué)習(xí)過程中整理的3D相關(guān)案例,內(nèi)容包括但不限于: 預(yù)處理、檢測、量測以及配準(zhǔn)… 具體展開可見如下思維導(dǎo)圖。
一、預(yù)處理
1、平滑濾波
平滑濾波用到的主要算子是:smooth_object_model_3d
算子說明
操作符smooth_object_model_3d
使用方法指定的方法對ObjectModel3D
中的3D點進行平滑處理。得到的平滑點在SmoothObjectModel3D
中返回。目前,移動最小二乘法(Method=’ MLS '
)是唯一支持的平滑方法。
對于每個點P, MLS平滑算法將一個平面或一個高階多項式曲面與其k鄰域(k個最近點)相匹配。曲面擬合實質(zhì)上是對平面或多項式曲面參數(shù)分別進行加權(quán)最小二乘參數(shù)估計的一種標(biāo)準(zhǔn)方法。P的最近鄰的貢獻比其他點的貢獻大,這是由下面帶參數(shù)σ(sigma) 的加權(quán)函數(shù)控制的:
然后將點投射到表面上。對所有點重復(fù)這個過程,得到一個平滑的點集。(它們可以很容易地從表面參數(shù)計算出來)。因此,這些點被相應(yīng)的法線作為平滑的副作用加以擴大。
通過將GenParamName
設(shè)置為以下值之一,可以用GenParamValue
設(shè)置額外的MLS
特定參數(shù):
- “mls_kNN”:
指定用于將MLS曲面與每個點匹配的最近鄰k的數(shù)量。
建議值:40、60(默認(rèn)值)、80、100、400 - “mls_order”:
指定MLS多項式曲面的順序。對于’mls_order’=1,表面是一個平面。
建議值:1、2(默認(rèn)值)、3 - “mls_abs_sigma”:
將加權(quán)參數(shù)指定為以米為單位的固定絕對值。要選擇的值取決于點數(shù)據(jù)的規(guī)模。根據(jù)經(jīng)驗,可以選擇P點與其k/2相鄰點之間的典型距離。注意,對于不同密度的點數(shù)據(jù)設(shè)置一個絕對加權(quán)參數(shù),可能會導(dǎo)致位于不同密度點數(shù)據(jù)部分的點的平滑結(jié)果不同。
這個問題可以通過使用’mls_relative_sigma’來避免,它是與比例無關(guān)的,這也使它成為指定鄰域加權(quán)的一種更方便的方法。注意,如果傳遞了’mls_abs_sigma’,則忽略’mls_relative_sigma’中的任何值。
建議值:0.0001,0.001,0.01,0.1,1.0 - “mls_relative_sigma”:
指定一個乘法因子,用于計算點P的公式:
注意,與所有點的全局參數(shù)不同,它是為每個點P計算的,因此使權(quán)重函數(shù)適應(yīng)于它的鄰域。這避免了在試圖將全局參數(shù)(‘mls_abs_sigma’)設(shè)置為具有高度變化的點密度的點數(shù)據(jù)時可能出現(xiàn)的問題。但是請注意,如果設(shè)置了’mls_abs_sigma’,則忽略’mls_relative_sigma’。
建議值:0.1、0.5、1.0(默認(rèn)值)、1.5、2.0 - “mls_force_inwards”:
如果這個參數(shù)設(shè)置為“真”,所有的表面法線都指向“原點的方向”。用數(shù)學(xué)方法表示,可以保證法向量和從各自的曲面點到原點的向量的標(biāo)量積是正的。如果生成的SmoothObjectModel3D用于基于表面的匹配,可能需要這樣做,無論是作為create_surface_model中的模型,還是作為find_surface_model中的3D場景,因為在這里,法線的一致方向?qū)τ谄ヅ溥^程非常重要。如果’mls_force_inwards’設(shè)置為’false’,則法向量的方向是任意的。
可能的值:‘true’, ‘false’(默認(rèn)值)
平滑效果圖
二、檢測
1、外觀缺陷檢測
基于3d算法開發(fā)的檢測壓傷、劃傷等有深度信息的缺陷,主要算子:convex_hull_object_model_3d
算子說明
計算 ObjectModel3D
中給出的 3D 對象模型的凸包。 該運算符將凸包作為 3D 對象模型返回,其句柄為 ObjectModel3DConvexHull
。
如果輸入點的某一維度完全沒有偏差,則結(jié)果將由直線而不是三角形組成。
請注意,如果不再需要或應(yīng)替換3D 對象模型,則必須首先通過調(diào)用運算符clear_object_model_3d
釋放內(nèi)存。
缺陷檢測效果圖
2、點云邊界框
邊界框用到的主要算子是:smallest_bounding_box_object_model_3d
算子說明
smallest_bounding_box_object_model_3d
計算 3D 對象模型點周圍的最小邊界框。 生成的邊界框使用其坐標(biāo)系 (Pose) 進行描述,該坐標(biāo)系的方向使得框的最長邊與 x 軸對齊,第二長邊與 y 軸對齊,最小邊與 z 軸對齊 。 邊的長度以 Length1
、Length2
和 Length3
的形式返回,按降序排列。 盒子可以是軸對齊的,也可以是定向的,可以通過類型來選擇。 “定向”算法的計算成本明顯高于“axis_aligned”算法,并且僅返回定向邊界框的近似值。 請注意,定向邊界框的算法是隨機的,并且可以為每次調(diào)用返回不同的框。
為了檢索“axis_aligned”框的角點,可以將運算符 get_object_model_3d_params
與參數(shù)“bounding_box1”一起使用。
邊界框效果圖
3、平面度檢測
平面度檢測用到的主要算子是:distance_object_model_3d
算子說明
操作符distance_object_model_3d
計算三維對象模型ObjectModel3DFrom
中的點到三維對象模型ObjectModel3DTo
中的點、三角形、多邊形或原語的距離。在3D對象模型ObjectModel3DFrom
中,距離被存儲為一個名為“&distance”的擴展屬性。隨后可以使用get_object_model_3d_params``查詢該屬性,或者使用select_points_object_model_3d
或其他使用擴展屬性的操作符處理該屬性。
目標(biāo)數(shù)據(jù)(點、三角形、多邊形或原語)是根據(jù)ObjectModel3DTo
中包含的屬性選擇的。它是根據(jù)以下優(yōu)先級中數(shù)據(jù)的存在而選擇的:原語、三角形、多邊形和點。作為這種自動目標(biāo)數(shù)據(jù)選擇的替代方法,還可以使用通用參數(shù)’distance_to’設(shè)置目標(biāo)數(shù)據(jù)類型(參見下面)。在計算到最終三角形的距離之前,操作符在內(nèi)部對一般的非三角形多邊形進行三角化。因此,用三角形對象調(diào)用操作符比用具有不同多邊形面的對象調(diào)用它要快。
可以選擇使用參數(shù)MaxDistance
設(shè)置閾值。超過此閾值的距離設(shè)置為MaxDistance
的值,即,值被剪切。設(shè)置MaxDistance
可以顯著加快該操作符的執(zhí)行速度。如果MaxDistance
設(shè)置為0,則不使用閾值。
如果Pose是非空元組,那么在計算距離之前,它必須包含一個應(yīng)用于ObjectModel3DFrom
中的點的Pose??梢允褂猛ㄓ脜?shù)‘invert_pose’(見下面)來反轉(zhuǎn)這個位姿。
根據(jù)目標(biāo)數(shù)據(jù)類型(點、三角形或原語),有幾種計算距離的方法。其中一些方法在ObjectModel3DTo
的元素上計算數(shù)據(jù)結(jié)構(gòu),以加速距離計算??梢允褂貌僮鞣?code>prepare_object_model_3d預(yù)先計算這些數(shù)據(jù)結(jié)構(gòu)。這允許對distance_object_model_3d
的多個調(diào)用來重用數(shù)據(jù)結(jié)構(gòu),從而節(jié)省了為每個調(diào)用重新計算數(shù)據(jù)結(jié)構(gòu)的時間。對于具有非三角形多邊形面的對象,操作符prepare_object_model_3d
可以額外執(zhí)行三角剖分并將其保存到對象中,以進一步加速distance_object_model_3d
操作符。只有在將通用參數(shù)’distance_to’設(shè)置為’triangle '時才會執(zhí)行這種三角測量。注意,與操作符triangulate_object_model_3d
相反,這種三角劃分并不清除polygons屬性。
當(dāng)計算到點或三角形的距離時,操作符可以選擇返回ObjectModel3DFrom
中每個點的最近點或三角形的索引,方法是將通用參數(shù)‘store_closest_index’設(shè)置為‘true’(參見下面)。索引在3D對象模型ObjectModel3DFrom
中存儲為擴展屬性’&closest_index’。注意,在使用“體素”方法時,不能計算最近的索引。如果點到最近元素的距離超過MaxDistance
中設(shè)置的最大距離,則最近的索引設(shè)置為-1。
可以選擇計算到點、三角形或原語的帶符號距離。因此,必須將通用參數(shù)’signed_distance ‘設(shè)置為’true’。注意,當(dāng)使用“體素”方法結(jié)合點到點距離時,不能計算符號距離。
下面將介紹不同的目標(biāo)類型和方法,并描述它們的優(yōu)缺點。注意,操作符根據(jù)目標(biāo)數(shù)據(jù)類型自動選擇默認(rèn)方法。可以使用通用參數(shù)’method’覆蓋此方法。
計算點到點的距離有以下幾種方法:
-
Linear search
線性搜索:
對于ObjectModel3DFrom
中的每個點,計算到ObjectModel3DTo
中的所有點的距離,并使用最小的距離。這種方法不需要預(yù)先計算數(shù)據(jù)結(jié)構(gòu),并且對于ObjectModel3DTo
中的少量點來說是最快的。
- KD-Tree:
ObjectModel3DTo
中的點被組織在一個kd樹中,這加快了對最近點的搜索。樹的構(gòu)造非常高效。搜索時間與ObjectModel3DTo
中的點數(shù)近似為對數(shù)。但是,搜索時間不是恒定的,并且根據(jù)查詢點在ObjectModel3DFrom
中的位置可能會發(fā)生顯著變化。
- Voxel 體素:
ObjectModel3DTo
中的點組織在一個體素結(jié)構(gòu)中。這種體素結(jié)構(gòu)允許在幾乎恒定的時間內(nèi)進行搜索。,獨立于查詢點在ObjectModel3DFrom
中的位置和在ObjectModel3DTo
中的點的數(shù)量。但是,準(zhǔn)備這個數(shù)據(jù)結(jié)構(gòu)需要幾秒鐘或幾分鐘。它特別適合使用prepare_object_model_3d
進行預(yù)計算。
平面度效果圖
三、量測
1、高度測量
高度測量用到的主要算子是:get_object_model_3d_params
算子說明
get_object_model_3d_params
允許訪問給定 3D 對象模型的屬性和元數(shù)據(jù)。 請求的屬性或元數(shù)據(jù)的名稱在通用參數(shù)GenParamName
中傳遞,相應(yīng)的值在 GenParamValue
中返回。 如果請求的屬性或元數(shù)據(jù)不可用,則會引發(fā)異常。
get_object_model_3d_params
支持同時訪問多個 3D 對象模型和多個屬性。 請注意,屬性或元數(shù)據(jù)可以具有不同的長度。 一些標(biāo)準(zhǔn)屬性具有定義的長度,如下面的屬性描述中所述。 其他屬性的長度取決于實際的3D對象模型,可以通過將參數(shù)GenParamName
設(shè)置為“num_points”、“num_triangles”、“num_polygons”或“num_lines”來查詢。 因此,要獲取標(biāo)準(zhǔn)屬性“point_coord_x”的長度,請將 GenParamName 設(shè)置為“num_points”。
測量效果圖
2、體積測量
體積測量用到的主要算子是:volume_object_model_3d_relative_to_plane
算子說明
Volume_object_model_3d_relative_to_plane
計算 3D 對象模型面下相對于平面的體積。 該平面由 Plane 中給出的姿勢的 x-y 平面定義。
對于 ObjectModel3D
,三角剖分或多邊形列表必須可用。 使用默認(rèn)設(shè)置,如果網(wǎng)格是有序的,則將計算 3D 對象模型的實際體積。 為了還涵蓋網(wǎng)格未閉合或面排序不一致的情況,可以使用參數(shù) Mode
和 UseFaceOrientation
影響體積的計算。
體積的計算方法:
1)首先,計算通過將每個面投影到平面上而構(gòu)造的棱柱的體積。
棱柱的各個體積可以是正值或負(fù)值,具體取決于面的方向(遠離或朝向平面)或面的位置(在平面上方或下方)。 這可以通過參數(shù) UseFaceOrientation
進行控制。
2)然后,根據(jù)參數(shù)模式將棱鏡的體積相加。
Volume 中返回的體積是計算總和的絕對值。
測量效果圖
四、配準(zhǔn)
1、根據(jù)模型配準(zhǔn)
模型配準(zhǔn)用到的主要算子有:create_surface_model
、find_surface_model
、distance_object_model_3d
算子說明
1)create_surface_model
運算符 create_surface_model
為 3D 對象模型 ObjectModel3D
創(chuàng)建基于表面的匹配模型。 例如,3D 對象模型可以先前使用 read_object_model_3d
從文件中讀取,或者使用 xyz_to_object_model_3d
創(chuàng)建。 創(chuàng)建的表面模型在SurfaceModelID
中返回。
創(chuàng)建模型后,可以使用 set_surface_model_param
設(shè)置表面模型的其他參數(shù)。
表面模型的創(chuàng)建要求3D對象模型包含點和法線。 可能有以下組合:
- 點和點法線;
- 點和三角形或多邊形網(wǎng)格,例如來自 CAD 文件;
- 點和 2D 映射,例如使用 xyz_to_object_model_3d 轉(zhuǎn)換的 XYZ 圖像三元組。
請注意,模型法線的方向和方位(向內(nèi)或向外)對于匹配非常重要。 對于邊緣支持的基于表面的匹配,法線需要指向內(nèi),并且模型必須包含三角形或多邊形網(wǎng)格(見下文)。
表面模型是通過以一定距離對3D物體模型進行采樣來創(chuàng)建的。 采樣距離必須在參數(shù) RelSamplingDistance
中指定,并相對于 3D 對象模型的軸平行邊界框的直徑進行參數(shù)化。 例如,如果 RelSamplingDistance
設(shè)置為 0.05 并且 ObjectModel3D
的直徑為“10 厘米”,則從對象表面采樣的點將相距大約“5 毫米”。 采樣點用于算子 find_surface_model
中的近似匹配(見下文)。 采樣點可以通過運算符 get_surface_model_param
使用值“sampled_model”獲得。 請注意,應(yīng)避免對象模型中的異常點,因為它們會破壞直徑。 減少 RelSamplingDistance
會導(dǎo)致更多的點,進而導(dǎo)致更穩(wěn)定但更慢的匹配。 增加 RelSamplingDistance
會導(dǎo)致點數(shù)減少,進而導(dǎo)致匹配穩(wěn)定性降低但速度更快。
2)find_surface_model
算子 find_surface_model
在 3D 場景 ObjectModel3D
中找到表面模型 SurfaceModelID
的最佳匹配,并在 Pose 中返回它們的姿態(tài)。
匹配分為三步:
- 近似匹配
- 稀疏姿態(tài)細化
- 稠密姿態(tài)細化
3)distance_object_model_3d
運算符 distance_object_model_3d
計算 3D 對象模型 ObjectModel3DFrom
中的點到 3D 對象模型 ObjectModel3DTo
中的點、三角形、多邊形或圖元的距離。 距離作為名為“&distance”的擴展屬性存儲在 3D 對象模型 ObjectModel3DFrom
中。 隨后可以使用 get_object_model_3d_params
查詢該屬性,或者使用 select_points_object_model_3d
或其他使用擴展屬性的運算符進行處理。
目標(biāo)數(shù)據(jù)(點、三角形、多邊形或圖元)是根據(jù) ObjectModel3DTo
中包含的屬性選擇的。 它是根據(jù)數(shù)據(jù)的存在情況來選擇的,按以下優(yōu)先順序:基本體、三角形、多邊形和點。 作為自動目標(biāo)數(shù)據(jù)選擇的替代方案,還可以使用通用參數(shù)“distance_to”設(shè)置目標(biāo)數(shù)據(jù)類型(見下文)。 在計算到結(jié)果三角形的距離之前,操作員對通用非三角形多邊形進行內(nèi)部三角剖分。 因此,使用三角化對象調(diào)用運算符比使用具有不同多邊形面的對象調(diào)用運算符要快。
MaxDistance
可用于限制要計算的距離值的范圍。 如果 MaxDistance
設(shè)置為 0,則計算所有距離。 如果將 MaxDistance
設(shè)置為其他值,則不會處理距離超過 MaxDistance
的點并將其設(shè)置為 MaxDistance
。 因此,將 MaxDistance
設(shè)置為非 0 的值可以顯著加快該運算符的執(zhí)行速度。
如果 Pose 是非空元組,則它必須包含在計算距離之前應(yīng)用于 ObjectModel3DFrom
中的點的姿勢。 可以使用通用參數(shù)“invert_pose”反轉(zhuǎn)姿態(tài)(見下文)。
根據(jù)目標(biāo)數(shù)據(jù)類型(點、三角形或圖元),可以使用多種計算距離的方法。 其中一些方法計算 ObjectModel3DTo
元素的數(shù)據(jù)結(jié)構(gòu),以加速距離計算。 這些數(shù)據(jù)結(jié)構(gòu)可以使用操作符prepare_object_model_3d
來預(yù)先計算。 這允許對 distance_object_model_3d
進行多次調(diào)用以重用數(shù)據(jù)結(jié)構(gòu),從而節(jié)省每次調(diào)用重新計算的時間。 對于具有非三角形多邊形面的對象,算子prepare_object_model_3d
還可以執(zhí)行三角測量并將其保存到對象中,以進一步加速distance_object_model_3d
算子。 僅當(dāng)通用參數(shù)“distance_to”設(shè)置為“triangles”時,才會執(zhí)行此三角測量。 請注意,此三角剖分與運算符 triangulate_object_model_3d
的三角剖分相反,不會清除多邊形屬性。
計算到點或三角形的距離時,可以選擇通過將通用參數(shù)“store_closest_index”設(shè)置為“true”(見下文),返回 ObjectModel3DFrom
中每個點的最近點或三角形的索引。 該索引作為名為“&closest_index”的擴展屬性存儲在 3D 對象模型 ObjectModel3DFrom
中。 請注意,使用“體素”方法時無法計算最接近的索引。 如果點到其最近元素的距離超過 MaxDistance
中設(shè)置的最大距離,則最近索引將設(shè)置為 -1。
可選地,可以計算到點、三角形或基元的有符號距離。 因此,通用參數(shù)“signed_distances”必須設(shè)置為“true”。 請注意,將“體素”方法與點到點距離結(jié)合使用時,無法計算有符號距離。
下表列出了不同的目標(biāo)數(shù)據(jù)類型、方法及其屬性。 搜索時間是 ObjectModel3DFrom
中每個點的近似時間。 N 是 ObjectModel3DTo
中目標(biāo)元素的數(shù)量。
配準(zhǔn)效果圖
文章來源:http://www.zghlxwxcb.cn/news/detail-725743.html
【備注】對源碼有需求的,訂閱專欄后在后臺私信我~文章來源地址http://www.zghlxwxcb.cn/news/detail-725743.html
到了這里,關(guān)于Halcon 3D相關(guān)案例分享的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!