1、硬件搭建

激光与相机的夹角在30°到60°之间,越大精度越高,但同时带来被测物体的阴影越大。

景深越大可以测得的物体高度越大,可通过调小光圈使景深变大,同时增加曝光或增益补偿亮度。

假设被拍摄物体的长度确定,传送带速度固定,及传送带运动的时间等于相机扫描的时间,因此相机每秒扫的线数越快,获得的点云越多,精度越高

2、参数标定

需要知道像素坐标、摄像机坐标、世界坐标的概念。其中摄像机坐标为相机位置为原点的三维坐标系。

2.1、相机内参

采用张正友标定法,准备最少10张标定板在不同视场下的图片,所有图片加起来尽可能覆盖整个相机视野。

2.2、光平面位姿标定

即标定激光平面在摄像机坐标下的相对位姿。三点确定一个平面,因此我们求出光平面上不在一条线上的三个点即可。采取的做法是把标定板放在两个不同的视场下(不同高度)拍摄四张标定图片,分别在打开光源关闭激光(关闭光源打开激光)下的高度1(2)拍摄,取其中三点即可确定光平面。

其中,世界坐标点集+像素坐标点集+相机内参+畸变系数可求得该标定板下的相机外参(RT),参考OpenCV中的solvePnP;相机外参+标定板的一个世界坐标点可求得该点的摄像机坐标,标定板上的坐标点需要在光条上,可通过相对标定板原点的位置求出。

2.3、移动位姿标定

即获取点云时相机每拍摄一次被拍物体对应位姿。采取的做法是关闭激光,让标定板在传送带上被扫描,拍摄保存起始及停止时的两张照片,记录拍摄次数(扫描线数)。

         根据世界坐标点集+像素坐标点集+相机内参+畸变系数可分别求得该标定板下运动前后的相机外参(位姿),即可推断出停止时的位姿相对与开始时的位姿。除以拍摄次数(扫描线数),即为移动位姿。

2.4、光条重心提取

2.5、厂家提供标定参数

以上为自己搭建相机及激光,也可以直接购买激光三角相机,厂家已经标定好,直接输入参数即可,价钱高,精度高。

3、点云测高

3.1、获取三维模型

下面为Smart Ray采集三维图片代码。

*打开3D传感器
open_framegrabber ('GenICamTL', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'default', 0, -1, AcqHandle)
*设置延时
set_framegrabber_param (AcqHandle, 'grab_timeout', 10000)
*加载型号
get_framegrabber_param (AcqHandle, 'Parameter_Set_values', ParameterSetValues)
tuple_regexp_select (ParameterSetValues, '.*_3D_Repeat_Snapshot', ParameterSet)
set_framegrabber_param (AcqHandle, 'Parameter_Set', ParameterSet)
*设置标定数据
set_framegrabber_param (AcqHandle, 'Activate_Calibration', true)
*可以获得中间结果
get_framegrabber_param (AcqHandle, 'Width', Width)
get_framegrabber_param (AcqHandle, 'Height', Height)
get_framegrabber_param (AcqHandle, 'Number_of_Profiles_to_Capture', NumberOfZILCaptured)
get_framegrabber_param (AcqHandle, 'ZMap_Lateral_Resolution', ZILLatRes)
get_framegrabber_param (AcqHandle, 'ZMap_Vertical_Resolution', ZILVerRes)
*初始化传感器
grab_image_start (AcqHandle, -1)
*抓取深度图(Z-map)
grab_image_async (PointCloudZ, AcqHandle, -1)

另外也可以通过普通相机获得的一张张扫描图自己构建,以下参考Halcon实例中的reconstruct_connection_rod_calib.hdev。

* Set the poses and camera parameters required to compute
* a calibrated measurement
gen_cam_par_area_scan_polynomial (0.0126514, 640.275, -2.07143e+007, 3.18867e+011, -0.0895689, 0.0231197, 6.00051e-006, 6e-006, 387.036, 120.112, 752, 240, CamParam)
create_pose (-0.00164029, 1.91372e-006, 0.300135, 0.575347, 0.587877, 180.026, 'Rp+T', 'gba', 'point', CamPose)
create_pose (0.00270989, -0.00548841, 0.00843714, 66.9928, 359.72, 0.659384, 'Rp+T', 'gba', 'point', LightplanePose)
create_pose (7.86235e-008, 0.000120112, 1.9745e-006, 0, 0, 0, 'Rp+T', 'gba', 'point', MovementPose)
*
* Create a model in order to process the profile images
* and set the required parameters for the model.
gen_rectangle1 (ProfileRegion, 120, 75, 195, 710)
create_sheet_of_light_model (ProfileRegion, ['min_gray','num_profiles','ambiguity_solving'], [70,290,'first'], SheetOfLightModelID)
set_sheet_of_light_param (SheetOfLightModelID, 'calibration', 'xyz')
set_sheet_of_light_param (SheetOfLightModelID, 'scale', 'mm')
set_sheet_of_light_param (SheetOfLightModelID, 'camera_parameter', CamParam)
set_sheet_of_light_param (SheetOfLightModelID, 'camera_pose', CamPose)
set_sheet_of_light_param (SheetOfLightModelID, 'lightplane_pose', LightplanePose)
set_sheet_of_light_param (SheetOfLightModelID, 'movement_pose', MovementPose)
*
* Measure the profile from successive images
for Index := 1 to 290 by 1read_image (ProfileImage, 'sheet_of_light/connection_rod_' + Index$'.3')dev_display (ProfileImage)dev_display (ProfileRegion)measure_profile_sheet_of_light (ProfileImage, SheetOfLightModelID, [])
endfor

3.2、获取物体相对高度

*读入点云数据(文件中)
read_object_model_3d ('./2020-01-10-235331.om3', 'm', [], [], ObjectModel3D, Status)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut)
*2得到电池表面点云的数据(mm)
get_object_model_3d_params (ObjectModel3D, 'point_coord_z', GenParamValue)
*去掉噪点
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 15, 16, ObjectModel3DThresholded)
visualize_object_model_3d (WindowHandle, ObjectModel3DThresholded, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut1)
connection_object_model_3d (ObjectModel3DThresholded, 'distance_3d', 1, ObjectModel3DConnected)
get_object_model_3d_params (ObjectModel3DConnected, 'num_points', GenParamValue1)
select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 1000, 50000, ObjectModel3DBattery)
visualize_object_model_3d (WindowHandle, ObjectModel3DBattery, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut1)
*3得到背景的点云数据集合(mm)
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 12, 14, ObjectModel3DBackGround)
visualize_object_model_3d (WindowHandle, ObjectModel3DBackGround, [], PoseOut1,  ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut2)
*4求电池上表面点云的z坐标值
get_object_model_3d_params (ObjectModel3DBattery, 'point_coord_z', GenParamValue1)
*5求背景表面的点云的z坐标值
get_object_model_3d_params (ObjectModel3DBackGround, 'point_coord_z', GenParamValue2)
*6求电池上表面点云的z坐标的平均值
A:=mean(GenParamValue1)
*7求背景表面点云的z坐标的平均值
B:=mean(GenParamValue2)
*8求电池表面的高度
H:=A-B
Param[0]:='Shift+left button Zoom'
Param[1]:='ctrl+ left button Move'
Param[2]:='left button Rotat'
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], '电池点云的高度为'+H+'mm', 'Battery Object', Param, PoseOut)

激光三角测量物体高度相关推荐

  1. opencv 通过标定摄像头测量物体大小_激光三角测量法在工业视觉检测上的应用...

    来源:公众号|3D视觉工坊(系投稿) 作者:白杨 「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉.CV&深度学习.SLAM.三维重建.点云后处理.自动驾驶.C ...

  2. 激光三角测量法在工业视觉检测上的应用

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 激光三角测量法,是工业视觉领域较为常用也是比较容易理解的一种3D检测算法.本文主要从应用层次来阐述, ...

  3. 激光三角测量(sheet of light)halcon示例详解 Reconstruct_Connection_Rod_Calib.hdev 模型三维重建...

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11555100.html 前言:最近公司项目用到halcon的3d模板匹配,三维重建,相机标定, ...

  4. 激光三角测量法 原理、优点和不足

    目录 引言 激光三角测量法的原理 正入射 斜入射 正入射与斜入射的对比 激光三角测量法测距的特点 主要误差来源 激光抖动 被测物体表面颜色 激光光斑检测精度 入射光束的景深限制 参考文献 引言 激光测 ...

  5. 3D视觉——线激光测量胶水高度

    线激光测量胶水高度 1. 项目背景介绍 2. 基恩士线激光的设置 3. 使用Halcon处理深度图 3.1 线激光高度数据转为深度图 5. Halcon图像处理方法 6. Halcon代码 1. 项目 ...

  6. 激光三角测量法中像素坐标与相机坐标转换

    对激光三角测量原理进行数学建模.以相机光心Oc为原点建立相机坐标系Oc-XcYcZc.沿OcZc轴在距离光心Oc焦距f处建立等效像素坐标系Opix-uv.设轴OcZc交Opix-uv平面于Op,建立图 ...

  7. halcon 激光三角测量 (片光技术)标定 ,示例 calibrate_sheet_of_light_3d_calib_object.hdev

    halcon 激光三角测量 (片光技术)标定 ,示例 calibrate_sheet_of_light_3d_calib_object.hdev Halcon自定义函数 算子翻译 xyz_to_obj ...

  8. 带标定的激光三角测量代码实例

    * This program demonstrates how to perform the calibration * of a sheet-of-light measurement system. ...

  9. 激光近视手术-高度近视女孩-近视手术多少钱

    刘馨睿,今年13岁,是一个活泼开朗.成绩优异的女孩,她的妈妈是学校老师,爸爸是一所二级甲等医院的主治医师.下面这篇文章是刘馨睿一家人通过回忆写出来的,如果您的孩子视力不好或者正在视力康复过程中,认真读 ...

最新文章

  1. php与tcp哪个快,PHP程序员如何理解TCP协议
  2. TP返回原生SQL语句:fetchSql
  3. 【知识图谱】一、知识表示与知识建模
  4. 《算法导论》读书笔记之第1章 算法在计算机中的作用
  5. 数据结构-链表4-企业链表
  6. 简洁的架构还能高效和准确?清华华为提出新型残差循环超分模型:RRN!
  7. MNIST的AlexNet实现
  8. 运维之Linux秋招重点(根据面经和常见笔试题总结,持续更新)
  9. js判断是否为手机端访问
  10. 【数据库】数据库系统工程师(软考中级)——学习过程总结
  11. 交换机端口mtu值最大_思科交换机基本配置命令全集-mtu值怎么设置
  12. vim/gvim 主题配色方案下载 安装修改配置
  13. 【Segmentation】
  14. python实现词云(爬取豆瓣影评)
  15. 工业互联网·制药设备远程监控运维维护平台
  16. qq侧滑界面的实现(DreawerLayout)
  17. 关于Fiddler使用和答疑
  18. 透过华为军团看科技之变(一):广域网络
  19. (HTTP的)幂等性Idempotence
  20. TeeChart Pro VCL/FMX教程之3D图表和OpenGL

热门文章

  1. 怎么添加设置微信定位服务器,微信怎么设置定位功能!
  2. Xcode Warning: “no rule to process file
  3. 将centos7打造成桌面系统centos
  4. abp moveto mysql_abp 使用 hangfire结合mysql
  5. C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
  6. Samsung-WLAN-AP路由器RCE漏洞复现
  7. 五阶魔方公式java_五阶魔方降阶法公式是什么?
  8. corelDraw 的CDR格式解析
  9. openstack学习笔记六 多节点部署之keystone
  10. 有机酸膜分离之柠檬酸生产应用反渗透技术