目录
- 代码示例
- 代码示例的逐句解释
以下是halcon中的代码示例
* This example shows how to calibrate a sheet-of-light setup with
* calibrate_sheet_of_light.
*
* In order to use calibrate_sheet_of_light, you need a 3D calibration object.
* You can create a CAD model of the 3D calibration object with
* create_sheet_of_light_calib_object. Then, you can use this CAD model
* to manufacture your individual 3D calibration object. Note that MVTec
* does not offer 3D calibration objects. More information on how to
* manufacture a calibration object is provided by
* the reference of create_sheet_of_light_calib_object.
*
dev_update_off ()
read_image (CalibObjectDisparity, 'sheet_of_light/calib_object_disparity')
get_image_size (CalibObjectDisparity, Width, Height)
dev_close_window ()
dev_open_window_fit_image (CalibObjectDisparity, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*
* The first step in the calibration procedure is to create a new sheet-of-light
* model and initialize it with the parameters of the camera. So far,
* calibrate_sheet_of_light only supports pinhole cameras and the division model
read_object_model_3d ('calib_object.dxf', 'm', [], [], CalibObject3D, Status)
create_pose (0.000, 0.07, 2.7, 130, 350, 125, 'Rp+T', 'gba', 'point', VisualizationPoseModel)
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom: Shift + left button'
Instructions[2] := 'Move: Ctrl + left button'
Title := 'CAD model of the calibration object\nThe object must be scanned low edge first'
visualize_object_model_3d (WindowHandle, CalibObject3D, [], VisualizationPoseModel, [], [], Title, [], Instructions, PoseOut)
*
* Create sheet-of-light model
gen_cam_par_area_scan_division (0.016, 0, 4.65e-06, 4.65e-06, 640, 512, 1280, 1024, CameraParam)
set_system ('clip_region', 'false')
get_cam_par_data (CameraParam, 'image_width', ImageWidth)
get_cam_par_data (CameraParam, 'image_height', ImageHeight)
gen_rectangle1 (Domain, 0, 0, ImageHeight - 1, ImageWidth - 1)
create_sheet_of_light_model (Domain, [], [], SheetOfLightModelID)
set_sheet_of_light_param (SheetOfLightModelID, 'camera_parameter', CameraParam)
*
* Define the 3D calibration object
set_sheet_of_light_param (SheetOfLightModelID, 'calibration_object', 'calib_object.dxf')
*
* Reconstruct the 3D calibration object with this sheet-of-light model
* Be careful with the setup
* - The camera must be mounted correctly, such that higher parts on the calibration
* target correspond to lower values in the disparity image.
* - All sides of the truncated pyramid must be visible (at least 10 pixels wide)
*
* This example uses a precompute reconstruction (disparity image)
dev_clear_window ()
dev_set_paint (['3d_plot','shaded',8,0.9,0.02,0.3,-0.3,0.3,-0.01,-0.003,-0.025])
dev_display (CalibObjectDisparity)
disp_message (WindowHandle, 'Measured disparity of the calibration object', 'window', 12, 12, 'black', 'true')
set_profile_sheet_of_light (CalibObjectDisparity, SheetOfLightModelID, [])
disp_message (WindowHandle, 'Now calibrating. This may take a minute...', 'image', Height - 50, 12, 'orange', 'false')
dev_set_paint ('default')
*
* Perform the calibration (this may take a minute...)
calibrate_sheet_of_light (SheetOfLightModelID, Error)
* The error is the RMS of the distance of the reconstructed points to the calibration
* object in meters
*
* Obtain the now calibrated reconstruction of the 3D calibration object
set_profile_sheet_of_light (CalibObjectDisparity, SheetOfLightModelID, [])
get_sheet_of_light_result_object_model_3d (SheetOfLightModelID, ObjectModel3D)
dev_clear_window ()
*
* Align the reconstructed object model with the object model of the 3D calibration object
create_surface_model (CalibObject3D, 0.03, [], [], SurfaceModelID)
find_surface_model (SurfaceModelID, ObjectModel3D, 0.05, 0.2, 0, 'false', [], [], Pose, Score, SurfaceMatchingResultID)
pose_to_hom_mat3d (Pose, CHomMat3D)
affine_trans_object_model_3d (CalibObject3D, CHomMat3D, ObjectModel3DAffineTrans)
create_pose (0.1, 0.02, 2.8, 135, 360, 110, 'Rp+T', 'gba', 'point', VisualizationPoseResult)
*
* Remove background and subsample the reconstructed object model for a better visualization
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 0.001, 1, ObjectModel3DThresholded)
sample_object_model_3d (ObjectModel3DThresholded, 'accurate', 0.001, [], [], ObjectModel3DSampled)
Title := 'Calibrated reconstruction of the measurement (yellow) together with the calibration object (blue)'
TitleWrapped := regexp_replace(Title + ' ',['(.{0,60})\\s','replace_all'],'$1\n')
visualize_object_model_3d (WindowHandle, [ObjectModel3DSampled,ObjectModel3DAffineTrans], [], VisualizationPoseResult, ['alpha_0','alpha_1','color_0','color_1'], [0.5,0.3,'yellow','blue'], TitleWrapped, [], Instructions, PoseOut)
*
* Get calibration result, can be used for debugging
get_sheet_of_light_param (SheetOfLightModelID, 'camera_parameter', CamParamResult)
get_sheet_of_light_param (SheetOfLightModelID, 'camera_pose', CameraPose)
get_sheet_of_light_param (SheetOfLightModelID, 'lightplane_pose', LightPlanePose)
get_sheet_of_light_param (SheetOfLightModelID, 'movement_pose', MovementPose)
dev_inspect_ctrl ([CameraParam,CamParamResult,CameraPose,LightPlanePose,MovementPose])
stop ()
dev_close_inspect_ctrl ([CameraParam,CamParamResult,CameraPose,LightPlanePose,MovementPose])
*
* Visualize setup with calibration object
gen_sheet_of_light_object_model_3d (SheetOfLightModelID, 0.2, 0.05, 0.4, OM3DLightPlane, OM3DMovement, OM3DCamera, OM3DCone)
visualize_object_model_3d (WindowHandle, [CalibObject3D,OM3DLightPlane,OM3DMovement,OM3DCamera,OM3DCone], [], [0.0309362,0.15155,8.14821,100.687,1.86383,90.368,0], ['alpha_1','alpha_3','alpha_4','alpha_5','color_0','color_3','color_4','color_5'], [0.5,0.5,0.5,0.5,'blue','green','green','green'], 'Setup with calibration object', [], [], PoseOut)
*
* Visualize setup with reconstructed object
visualize_object_model_3d (WindowHandle, [ObjectModel3DSampled,OM3DLightPlane,OM3DMovement,OM3DCamera,OM3DCone], [], PoseOut, ['alpha_1','alpha_3','alpha_4','alpha_5','color_0','color_3','color_4','color_5'], [0.5,0.5,0.5,0.5,'blue','green','green','green'], 'Setup with reconstructed object', [], [], PoseOut)
逐句解释
dev_update_off ()
关闭图形更新。
read_image (CalibObjectDisparity, 'sheet_of_light/calib_object_disparity')
读取校准对象的视差图像。
get_image_size (CalibObjectDisparity, Width, Height)
获取视差图像的大小。
dev_close_window ()
关闭窗口。
dev_open_window_fit_image (CalibObjectDisparity, 0, 0, -1, -1, WindowHandle)
打开一个窗口,将视差图像适配到窗口中。
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
设置窗口字体。
gen_cam_par_area_scan_division (0.016, 0, 4.65e-06, 4.65e-06, 640, 512, 1280, 1024, CamParam)
创建相机参数
read_object_model_3d ('calib_object.dxf', 'm', [], [], CalibObject3D, Status)
read_object_model_3d函数的作用是从DXF文件中读取三维对象模型。该函数需要以下参数:
- 文件名:要读取的DXF文件的完整路径和文件名。
- 单位:DXF文件中的单位。可以设置为'm'(米)、'cm'(厘米)、'mm'(毫米)、'inch'(英寸)等。
- 颜色:读取对象时所使用的颜色。可以设置为'gray'(灰色)、'color'(彩色)等。
- 保留空间信息:是否保留对象的空间信息。可以设置为'true'或'false'。
该函数返回以下参数:
- 三维对象模型:一个包含对象的几何形状、颜色、法线等属性的三维对象模型。
- 状态:一个包含函数执行状态的字符串。如果函数执行成功,则状态为'true',否则为错误消息。
create_pose (0.000, 0.07, 2.7, 130, 350, 125, 'Rp+T', 'gba', 'point', VisualizationPoseModel)
*create_pose(::TransX,TransY,TransZ,RotX,RotY,RotZ,OrderOfTransform,OrderOfRotation,ViewOfTransform,Pose)
*TransX, TransY和TransZ分别指定沿x轴,y轴和z轴的平移,
*RotX, RotY和 RotZ描述旋转
create_pose函数的作用是创建一个姿态模型,用于描述物体在三维空间中的姿态。该函数需要以下参数:
- 平移X:物体在X轴上的平移量,单位为米。
- 平移Y:物体在Y轴上的平移量,单位为米。
- 平移Z:物体在Z轴上的平移量,单位为米。
- 旋转角度A:物体绕X轴旋转的角度,单位为度。
- 旋转角度B:物体绕Y轴旋转的角度,单位为度。
- 旋转角度C:物体绕Z轴旋转的角度,单位为度。
- 姿态表示方式:描述姿态的方式。可以设置为'Rp+T'(旋转矩阵和平移向量表示)或'Quaternion'(四元数表示)。
- 姿态约束:姿态约束的类型。可以设置为'gba'(广义球面约束)或'point'(点约束)。
- 可视化模式:生成的姿态模型的可视化方式。可以设置为'point'(点模式)或'model'(模型模式)。
该函数返回一个姿态模型,用于描述物体在三维空间中的姿态。
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom: Shift + left button'
Instructions[2] := 'Move: Ctrl + left button'
Title := 'CAD model of the calibration object\nThe object must be scanned low edge first'
创建可视化指令和标题。
visualize_object_model_3d (WindowHandle, CalibObject3D, [], VisualizationPoseModel, [], [], Title, [], Instructions, PoseOut)
visualize_object_model_3d函数的作用是在HALCON窗口中可视化三维对象模型。该函数需要以下参数:
- 窗口句柄:用于显示三维对象模型的HALCON窗口的句柄。
- 三维对象模型:要可视化的三维对象模型。
- 相机参数:相机参数,用于设置视角和透视效果。可以为空,表示使用默认相机参数。
- 姿态模型:描述物体在三维空间中的姿态的模型。可以为空,表示使用默认姿态模型。
- 环境光源:环境光源的参数。可以为空,表示使用默认环境光源。
- 点光源:点光源的参数。可以为空,表示不使用点光源。
- 标题:窗口标题。可以为空,表示不设置窗口标题。
- 窗口大小:窗口大小。可以为空,表示使用默认窗口大小。
- 指示:用户界面指示信息。可以为空,表示不设置指示信息。
- 输出姿态:输出姿态信息。可以为空,表示不输出姿态信息。
该函数会在指定的窗口中显示三维对象模型,并根据相机参数和姿态模型设置视角和透视效果。同时,可以通过设置环境光源和点光源来调整光照效果。可以设置窗口标题、窗口大小和用户界面指示信息来增强用户体验。
gen_cam_par_area_scan_division (0.016, 0, 4.65e-06, 4.65e-06, 640, 512, 1280, 1024, CameraParam)
gen_cam_par_area_scan_division函数的作用是生成一个区域扫描相机的相机参数。该函数需要以下参数:
- 像素大小:相机像素的大小,单位为米。
- 像素宽度偏差:相机像素宽度方向上的偏差,可以设置为0。
- 像素高度偏差:相机像素高度方向上的偏差,可以设置为0。
- 图像宽度:图像的宽度,单位为像素。
- 图像高度:图像的高度,单位为像素。
- 图像中心X坐标:图像中心点在X轴上的坐标,单位为像素。
- 图像中心Y坐标:图像中心点在Y轴上的坐标,单位为像素。
- 图像分辨率X:图像在X轴上的分辨率,单位为dpi。
- 图像分辨率Y:图像在Y轴上的分辨率,单位为dpi。
该函数返回一个相机参数,用于描述区域扫描相机的内部参数。可以将该相机参数应用于HALCON中的其他三维视觉算子中。
set_system ('clip_region', 'false')
使用set_system函数将系统的剪切区域设置为false,以避免在后续的处理中对图像进行剪切。
get_cam_par_data (CameraParam, 'image_width', ImageWidth)
get_cam_par_data (CameraParam, 'image_height', ImageHeight)
使用get_cam_par_data函数从相机参数中获取图像的宽度和高度。
gen_rectangle1 (Domain, 0, 0, ImageHeight - 1, ImageWidth - 1)
创建一个矩形区域,作为光板模型的域。
create_sheet_of_light_model (Domain, [], [], SheetOfLightModelID)
create_sheet_of_light_model函数的作用是创建一个光板模型,用于描述光板三维视觉系统的内部参数。该函数需要以下参数:
- 域:描述光板的域。可以是'row'(行模式)或'column'(列模式)。
- 光线起点:描述光线的起点。可以为空,表示使用默认光线起点。
- 光线方向:描述光线的方向。可以为空,表示使用默认光线方向。
该函数返回一个光板模型的ID,用于描述光板三维视觉系统的内部参数。可以将该ID应用于HALCON中的其他三维视觉算子中
set_sheet_of_light_param (SheetOfLightModelID, 'camera_parameter', CameraParam)
*
* Define the 3D calibration object
set_sheet_of_light_param (SheetOfLightModelID, 'calibration_object', 'calib_object.dxf')
set_sheet_of_light_param函数的作用是设置光板三维视觉系统的参数。该函数需要以下参数:
- 光板模型ID:用于描述光板三维视觉系统的内部参数的光板模型ID。
- 参数类型:要设置的参数类型。可以设置为'camera_parameter'(相机参数)。
- 参数值:要设置的参数值。可以是相机参数。
该函数将指定的参数值设置为光板三维视觉系统的参数。可以设置相机参数以调整光板三维视觉系统的内部参数。
dev_clear_window ()
清除窗口中的所有绘图
dev_set_paint (['3d_plot','shaded',8,0.9,0.02,0.3,-0.3,0.3,-0.01,-0.003,-0.025])
设置绘图属性,包括绘制三维图形、使用阴影、设置光照、设置透明度等
dev_display (CalibObjectDisparity)
在窗口中显示视差图像
disp_message (WindowHandle, 'Measured disparity of the calibration object', 'window', 12, 12, 'black', 'true')
在窗口中显示一条消息,提示用户测量校准物体的视差
set_profile_sheet_of_light (CalibObjectDisparity, SheetOfLightModelID, [])
设置光板模型的参数,将视差图像和光板模型关联起来
disp_message (WindowHandle, 'Now calibrating. This may take a minute...', 'image', Height - 50, 12, 'orange', 'false')
在窗口中显示一条消息,提示用户正在进行校准,可能需要一分钟
dev_set_paint ('default')
恢复默认的绘图属性
calibrate_sheet_of_light (SheetOfLightModelID, Error)
执行光板模型的校准,计算重建点到校准物体的RMS距离误差,单位为米
set_profile_sheet_of_light (CalibObjectDisparity, SheetOfLightModelID, [])
将视差图像和已校准的光板模型关联起来,获取校准后的重建结果
get_sheet_of_light_result_object_model_3d (SheetOfLightModelID, ObjectModel3D)
获取校准后的重建结果的三维对象模型
dev_clear_window ()
清除窗口中的所有绘图
create_surface_model (CalibObject3D, 0.03, [], [], SurfaceModelID)
创建三维表面模型,并将其与校准物体的对象模型关联起来
find_surface_model (SurfaceModelID, ObjectModel3D, 0.05, 0.2, 0, 'false', [], [], Pose, Score, SurfaceMatchingResultID)
将重建的对象模型与三维校准对象的对象模型对齐,并计算对齐的姿态和得分
pose_to_hom_mat3d (Pose, CHomMat3D)
将姿态转换为齐次变换矩阵
affine_trans_object_model_3d (CalibObject3D, CHomMat3D, ObjectModel3DAffineTrans)
对校准物体的对象模型进行仿射变换,以与重建的对象模型对齐
create_pose (0.1, 0.02, 2.8, 135, 360, 110, 'Rp+T', 'gba', 'point', VisualizationPoseResult)
创建姿态,并设置姿态结果的显示方式
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 0.001, 1, ObjectModel3DThresholded)
选择对象模型中Z轴坐标大于0.001的点,并将其存储到新的对象模型中
sample_object_model_3d (ObjectModel3DThresholded, 'accurate', 0.001, [], [], ObjectModel3DSampled)
对新的对象模型进行采样,以获得更好的可视化效果
Title := 'Calibrated reconstruction of the measurement (yellow) together with the calibration object (blue)'
设置标题
TitleWrapped := regexp_replace(Title + ' ',['(.{0,60})\s','replace_all'],'$1\n')
将标题按照每行60个字符进行自动换行
visualize_object_model_3d (WindowHandle, [ObjectModel3DSampled,ObjectModel3DAffineTrans], [], VisualizationPoseResult, ['alpha_0','alpha_1','color_0','color_1'], [0.5,0.3,'yellow','blue'], TitleWrapped, [], Instructions, PoseOut)
可视化校准后的重建结果和校准物体,并显示标题和姿态结果
get_sheet_of_light_param (SheetOfLightModelID, 'camera_parameter', CamParamResult)
获取光板模型中相机参数的结果
get_sheet_of_light_param (SheetOfLightModelID, 'camera_pose', CameraPose)
获取光板模型中相机姿态的结果
get_sheet_of_light_param (SheetOfLightModelID, 'lightplane_pose', LightPlanePose)
获取光板模型中光平面姿态的结果
get_sheet_of_light_param (SheetOfLightModelID, 'movement_pose', MovementPose)
获取光板模型中运动姿态的结果
dev_inspect_ctrl ([CameraParam,CamParamResult,CameraPose,LightPlanePose,MovementPose])
显示参数结果
stop ()
停止程序运行
dev_close_inspect_ctrl ([CameraParam,CamParamResult,CameraPose,LightPlanePose,MovementPose])
关闭参数结果窗口
gen_sheet_of_light_object_model_3d (SheetOfLightModelID, 0.2, 0.05, 0.4, OM3DLightPlane, OM3DMovement, OM3DCamera, OM3DCone)
生成光板模型,并将其与光平面、运动、相机和圆锥体关联起来
visualize_object_model_3d (WindowHandle, [CalibObject3D,OM3DLightPlane,OM3DMovement,OM3DCamera,OM3DCone], [], [0.0309362,0.15155,8.14821,100.687,1.86383,90.368,0], ['alpha_1','alpha_3','alpha_4','alpha_5','color_0','color_3','color_4','color_5'], [0.5,0.5,0.5,0.5,'blue','green','green','green'], 'Setup with calibration object', [], [], PoseOut)
可视化带有校准物体的设置,并显示标题和姿态结果
visualize_object_model_3d (WindowHandle, [ObjectModel3DSampled,OM3DLightPlane,OM3DMovement,OM3DCamera,OM3DCone], [], PoseOut, ['alpha_1','alpha_3','alpha_4','alpha_5','color_0','color_3','color_4','color_5'], [0.5,0.5,0.5,0.5,'blue','green','green','green'], 'Setup with reconstructed object', [], [], PoseOut)
可视化带有重建对象的设置,并显示标题和姿态结果