3D轉2D模板匹配
工程背景
測量背景
為了確保電池的質量和安全性,並最佳化其效能,製造商需要嚴格控制生產過程中的每一個環節,包括電池的尺寸精度。電池的高度寬度3D檢測旨在通過2D結合3D檢測工具,實現對電池物理尺寸的精確測量。
相機選型
海伯森LCF
測量項
電池長寬及高度
解決方案
Vision-Studio首先將點雲圖轉為深度圖,對深度圖進行模板建立與模板匹配確認樣品位置,接著用3d工具對樣品寬高進行測量。
設計思路

執行效果展示
工程結果展示
- 寬度測量結果

- 高度測量結果

專案流程
一、初始化
使用
Lua脚本工具,將全域性變數初始化使用
加载点云工具,載入需要處理的點雲圖。
-- 初始化全局变量用于循环判断
SetIntVariable("count",1)
二、獲取樣品位置角度資訊

使用
点云转深度图工具,將3D點雲圖轉為深度圖,用於2d模板匹配使用
加载图片工具,載入儲存的深度圖使用
2D模板创建工具,建立2D模板使用
2D模板匹配工具,根據建立的模板對深度圖進行模板匹配使用
Lua脚本工具,獲取所有樣品位置及角度資訊。資料輸出到全域性變數。
繫結變數:模板匹配結果;解析度,原點位置(點雲轉深度圖輸出變數)
編輯指令碼獲取所有樣品匹配角度插入到陣列中;獲取模板匹配結果中的位置資訊,根據
2d匹配位置*分辨率+原点位置將2D匹配XY位置轉為3DXY座標輸出資料到全域性變數
-- 获取匹配角度
angles = {}
for i = 1,5,1 do
table.insert(angles,Result[i].Angle)
end
-- 获取实际点云图位置 2d匹配位置*分辨率+原点位置
positionX = {}
positionY = {}
for i = 1,5,1 do
table.insert(positionX,Result[i].Center.X*resolutionx + offsetx)
table.insert(positionY,Result[i].Center.Y*resolutiony + offsety)
end
for i = 1,5,1 do
DrawPoint2D(0, "blue", positionX[i], positionY[i])
end
SetFloatArrayVariable("angles",angles)
SetFloatArrayVariable("positionX",positionX)
SetFloatArrayVariable("positionY",positionY)
SetIntVariable("counts",5)
三、迴圈進行寬度高度測量
通過獲取模板匹配角度及位置資訊來對點雲進行方位調整使需要測量塊左右邊與y軸平行,上下邊與x軸平行,之後推送box對塊的寬度高度進行測量。

使用
标记工具,標記迴圈初始。通過指令碼獲取模板匹配當前位置及角度:指令碼根據count計數獲取當前位置及角度並輸出到全域性變數。
使用
3D位置调整工具,調整定位到當前待測樣品XY位置。
使用
3D变换工具,根據待測樣品模板匹配的角度旋轉點雲。
將點雲複製到IM4用於寬度高度測量
使用四個
方形探针工具,找到樣品的四條邊使用四個
3D几何交点工具,繫結上一步找到的兩條邊作為輸入幾何,分別找到四條邊的交點使用四個
3D距离工具,分別繫結四個交點中的兩個作為輸入點,測量樣品長寬距離。使用兩個
3D区域工具,設定基準區域使用
3D平面工具,繫結上一步設定的區域作為區域,擬合基準面使用
3D高度工具,分別測量樣品上層到底面的距離以及樣品上層到樣品下層的距離。



- 使用
Lua脚本工具,迴圈標記全域性變數值+1。
綁定當前迴圈值count及樣品總數量counts
編輯指令碼判斷迴圈是否結束
if count < counts then
Jump("ReStart")
SetIntVariable("count",count+1)
else
Jump("End")
end- 標記迴圈結束:使用
标记工具,建立迴圈停止標記位。
經驗提煉
核心步驟:
3D點雲圖轉為深度圖進行2D模板匹配得到樣品相對模板角度及在2D圖中XY位置。
將2D獲取的角度位置及資訊轉為3D資訊。
根據獲取資訊在3D點雲圖進行測量。
