Appearance
3D转2D模板匹配
工程背景
测量背景
为了确保电池的质量和安全性,并优化其性能,制造商需要严格控制生产过程中的每一个环节,包括电池的尺寸精度。电池的高度宽度3D检测旨在通过2D结合3D检测工具,实现对电池物理尺寸的精确测量。
相机选型
海伯森LCF
测量项
电池长宽及高度
解决方案
AI-Vision首先将点云图转为深度图,对深度图进行模板创建与模板匹配确认样品位置,接着用3d工具对样品宽高进行测量。
设计思路
执行效果展示
工程结果展示
- 宽度测量结果
- 高度测量结果
项目流程
一、初始化
使用
Lua脚本
工具,将全局变量初始化使用
加载点云
工具,加载需要处理的点云图。
lua
-- 初始化全局变量用于循环判断
SetIntVariable("count",1)
二、获取样品位置角度信息
使用
点云转深度图
工具,将3D点云图转为深度图,用于2d模板匹配使用
加载图片
工具,加载保存的深度图使用
2D模板创建
工具,创建2D模板使用
2D模板匹配
工具,根据创建的模板对深度图进行模板匹配使用
Lua脚本
工具,获取所有样品位置及角度信息。数据输出到全局变量。
绑定变量:模板匹配结果;分辨率,原点位置(点云转深度图输出变量)
编辑脚本获取所有样品匹配角度插入到数组中;获取模板匹配结果中的位置信息,根据
2d匹配位置*分辨率+原点位置
将2D匹配XY位置转为3DXY坐标输出数据到全局变量
lua
-- 获取匹配角度
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
编辑脚本判断循环是否结束
lua
if count < counts then
Jump("ReStart")
SetIntVariable("count",count+1)
else
Jump("End")
end
- 标记循环结束:使用
标记
工具,创建循环停止标记位。
经验提炼
核心步骤:
3D点云图转为深度图进行2D模板匹配得到样品相对模板角度及在2D图中XY位置。
将2D获取的角度位置及信息转为3D信息。
根据获取信息在3D点云图进行测量。