1.scene_flow_uncalib(ImageRect1T1, ImageRect2T1, ImageRect1T2, ImageRect2T2, Disparity : OpticalFlow, DisparityChange : SmoothingFlow, SmoothingDisparity, GenParamName, GenParamValue : )
scene_flow_uncalib计算两个连续校正的立体图像对之间的未校准场景流。
场景流是动态场景中表面点的三维位置和运动。
图像中的运动可以由在空间上运动的物体引起,
也可以由相机(或两者)在获取两个图像对之间的运动引起。
使用scene_flow_calib计算标定后的场景流量。
图像序的两个连续立体图像对分别在ImageRect1T1、ImageRect2T1、ImageRect1T2和ImageRect2T2中传递。
每一对立体图像都必须校正。
注意,可以使用操作符calibrate_cameras、gen_binocular_rectification_map和map_image对图像进行校正。
此外,需要一个单通道视差图像,它根据方程c2=c1+d(r,c1)为ImageRect1T1的每个像素(r,c1)指定一个匹配的ImageRect2T1像素(r,c2),
其中d(r,c)为像素(r,c)处的视差。
视差图像可以用双筒望远镜视差或双筒望远镜差值来计算。
计算未标定的场景流保存于 OpticalFlow 和DisparityChange。
向量场OpticalFlow中的向量表示ImageRect1T1和ImageRect1T2在图像平面上的运动。
单通道图像差分变化描述了ImageRect2T1和ImageRect2T2之间视差的变化。
将一个世界点投影到ImageRect1T1中(r,c)位置的。
同样的点还被投影到ImageRect2T1 的 (r,c+d(r,c)),
ImageRect1T2 的 (r+u(r,c),c+v(r,c)),
ImageRect2T2 的 (r+u(r,c),c+v(r,c)+d(r,c)+dc(r,c)),
其中u(r,c)和v(r,c)表示向量场图像OpticalFlow的行和列分量的值,
d(r,c)表示视差,dc(r,c)表示像素(r,c)处的差值变化。
工业视觉halcon三维重建函数scene_flow_uncalib介绍
四幅图像与光流的关系以及视差图像的差异。
参数介绍
经过校正的输入图像在ImageRect1T1、ImageRect2T1、ImageRect1T2和ImageRect2T2中传递。
场景流的计算是在ImageRect1T1的区域中进行的,该域也是 OpticalFlow 和DisparityChange中场景流的域。
Disparity描述了经过校正的图像ImageRect1T1和ImageRect2T1之间的视差。
SmoothingFlow和SmoothingDisparity指定了正则化的权重
工业视觉halcon三维重建函数scene_flow_uncalib介绍
以及与数据项相关的权重
工业视觉halcon三维重建函数scene_flow_uncalib介绍
。
这些参数值越大,计算得到的场景流越平滑。
对于灰度值范围为0-255的字节图像,值在40左右通常会产生良好的结果。
迭代方案和由粗到细的变形策略的参数可以用通用参数GenParamName和GenParamValue指定。
通常,通过使用GenParamName = 'default_parameters'和GenParamValue = 'very_accurate'、'accurate'、'fast'或'very_fast'为参数使用一个默认参数集就足够了。
如果需要,可以通过在GenParamName和GenParamValue中指定一个参数子集,
并在'default_parameters'之后指定相应的值(例如,GenParamName = ['default_parameters','warp_zoom_factor']和GenParamValue = ['accurate',0.6]),
从而在选择默认参数集之后修改各个参数。
下面将详细描述各个参数的含义。默认参数集由下面表格给出
工业视觉halcon三维重建函数scene_flow_uncalib介绍
如果参数应该单独指定,则必须将GenParamName和GenParamValue设置为相同长度的元组。
与GenParamName中指定的参数对应的值必须在GenParamValue中对应的位置指定。
要更深入地理解以下参数,请参阅下面的部分算法。
GenParamName = 'warp_zoom_factor'可用于在粗到细的变形层次结构中指定两个连续变形级别之间的分辨率。
必须从开间隔(0,1)中选择'warp_zoom_factor'。
出于性能原因,'warp_zoom_factor'通常设置为0.5,即,对于每个较粗的变形级别,每个方向上的像素数减半。
'warp_zoom_factor'的值接近1时,结果会稍微好一些。然而,它们需要更多的计算时间。
GenParamName = 'warp_levels'可用于将扭曲层次结构限制为最大级别数。
对于'warp_levels' = 0,使用尽可能多的级别。如果图像大小不允许使用指定数量的级别(考虑到分辨率'warp_zoom_factor'),
则使用尽可能多的级别。通常,'warp_levels'应该设置为0。
GenParamName = 'warp_last_level'可用于指定不再计算流增量的变形级别的数量。
通常,'warp_last_level'被设置为1或2,即,对于每个整经级别计算流量增量,或在计算中跳过最细的整经级别。
在后一种情况下,对原始图像的一半分辨率的图像执行计算,然后插值到完整分辨率。
GenParamName = 'outer_iter'可用于指定最小化方案中的外部迭代次数。
通常,“outer_iter”越大,数值结果就越准确。该参数值越高,计算时间越长。
通常,'outer_iter'被设置为5到10之间的值
GenParamName = 'inner_iter'可用于指定最小化方案中的内部迭代次数。
通常,“inner_iter”越大,数值结果越精确。该参数值越高,计算时间越长。
通常,两个内部迭代就足够了。
GenParamName = 'sor_iter'可用于指定求解线性方程组的SOR迭代次数。
通常,“sor_iter”越大,数值结果就越精确。该参数值越高,计算时间越长。
通常,三个SOR迭代就足够了。
GenParamName = 'omega'可用于指定SOR方法的松弛因子。
必须从打开区间(1,2)中选择'omega'。通常,'omega'被设置为1.9。
2.scene_flow_calib(ImageRect1T1, ImageRect2T1, ImageRect1T2, ImageRect2T2, Disparity : :
SmoothingFlow, SmoothingDisparity, GenParamName, GenParamValue, CamParamRect1, CamParamRect2, RelPoseRect : ObjectModel3D)
scene_flow_calib计算两个连续经过校正的立体图像对之间经过校准的场景流。
场景流是动态场景中表面点的三维位置和运动。
图像中的运动可以由在世界空间上运动的物体引起,也可以由相机(或两者)在获取两个图像对之间的运动引起。
场景流作为3D对象模型ObjectModel3D返回。
三维对象模型包含重建的三维点的坐标。
此外,3D流在3D对象模型中由属性'&flow_x'、'&flow_y'和'&flow_z'编码。
注意,如果不再需要或应该重写3D对象模型,则必须通过调用操作符clear_object_model_3d来释放其内存。
图像序列的两个连续立体图像对分别在ImageRect1T1、ImageRect2T1、ImageRect1T2和ImageRect2T2中传递。
每一对立体图像都必须校正。
注意,可以使用操作符calibrate_cameras、 gen_binocular_rectification_map和map_image对图像进行校正。
校正后的双目相机系统的相机几何参数由校正后的相机1的CamParamRect1和
校正后的相机2的CamParamRect2的内部相机参数指定,
并由确定校正后的相机2相对于校正后的相机1的位姿的位姿相关关系确定。
这些相机参数可以从calibrate_cameras和 gen_binocular_rectification_map操作符中获得。
校正后的相机系统1和2的焦距和比例因子必须相等。
此外,需要一个单通道视差图像,它根据方程c2=c1+d(r,c1)为ImageRect1T1的每个像素(r,c1)指定一个匹配的ImageRect2T1像素(r,c2),
其中d(r,c)为像素(r,c)处的视差。
视差图像可以用双筒望远镜视差或双筒望远镜差值来计算。
为了计算校准后的场景流,首先在内部执行scene_flow_uncalib。然后利用上述立体相机几何参数将结果转换为三维点和三维流向量。
scene_flow_calib剩余参数的描述请参考上边的scene_flow_uncalib。
下面是halcon自带的一实例:
* 例程演示使用两个函数scene_flow_uncalib 和 scene_flow_calib计算两个连续经过校正的立体图像对之间的场景流。
*场景流是动态场景中表面点的三维位置和运动,图像中的运动可以由在空间上运动的物体引起,也可以由相机(或两者)在获取两个图像对之间的运动引起。
*示例演示了如何使用三维场景流在三维中恢复刚体运动。为此,它使用了旋转球体的立体图像对。
*首先,未经校准的场景流,即利用光流和视差变化对地球进行分割。
*然后,被标定的场景流,即曲面点的三维位置和移动用来计算地球仪的运动,在这种情况下,由三维旋转轴和旋转角度来定义。
*生成已标定的两相机参数,相机标定参考相对章节
gen_cam_par_area_scan_division (0.00600532, -2506.22, 4.96835e-006, 5.3e-006, 317.839, 228.795, 640, 480, CamParamL)
gen_cam_par_area_scan_division (0.00602268, -2314.94, 4.97045e-006, 5.3e-006, 326.022, 232.059, 640, 480, CamParamR)
* Relative pose of the cameras
*创建两相机的相对位姿
create_pose (-0.0079576, 0.202734, 0.0372651, 20.163, 0.795608, 184.056, 'Rp+T', 'gba', 'point', RelPose)
*创建校正映射
gen_binocular_rectification_map (MapL, MapR, CamParamL, CamParamR, RelPose, 1, 'geometric', 'bilinear', CamParamRectL, CamParamRectR, CamPoseRectL, CamPoseRectR, RelPoseRect)
* Obtain image sizes
get_image_size (MapL, WidthL, Height)
get_image_size (MapR, WidthR, Height)
* 初始化图形窗口
dev_update_off ()
dev_close_window ()
dev_open_window_fit_size (0, 0, WidthL, Height, -1, -1, WindowHandle1)
get_window_extents (WindowHandle1, Row, Column, WidthW1, HeightW1)
dev_open_window_fit_size (0, WidthW1 + 5, WidthR, Height, -1, -1, WindowHandle2)
* 读取与校正全部图像
gen_empty_obj (ImagesL)
gen_empty_obj (ImagesR)
gen_empty_obj (ImagesRectL)
gen_empty_obj (ImagesRectR)
for Index := 1 to 5 by 1
read_image (ImageL, 'stereo/globe/globe_l_' + Index$'02')
read_image (ImageR, 'stereo/globe/globe_r_' + Index$'02')
concat_obj (ImagesL, ImageL, ImagesL)
concat_obj (ImagesR, ImageR, ImagesR)
map_image (ImageL, MapL, ImageRectL)
map_image (ImageR, MapR, ImageRectR)
concat_obj (ImagesRectL, ImageRectL, ImagesRectL)
concat_obj (ImagesRectR, ImageRectR, ImagesRectR)
endfor
stop()
* 显示用于计算场景流的经过校正的立体图像对的序列
for Index := 1 to 5 by 1
select_obj (ImagesRectL, ImageRectL, Index)
select_obj (ImagesRectR, ImageRectR, Index)
dev_set_window (WindowHandle1)
dev_display (ImageRectL)
dev_set_window (WindowHandle2)
dev_display (ImageRectR)
disp_message (WindowHandle1, 'Sequence of rectified stereo images\nof a rotating globe', 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle1, 'Image pair ' + Index + ' of 5', 'window', 70, 12, 'black', 'true')
endfor
stop ()
* Loop over the different image pairs
for Index := 1 to 4 by 1
*计算校正后的立体图像对1,和2间的场景流
select_obj (ImagesL, ImageL1, Index)
select_obj (ImagesR, ImageR1, Index)
select_obj (ImagesL, ImageL2, Index + 1)
select_obj (ImagesR, ImageR2, Index + 1)
select_obj (ImagesRectL, ImageRectL1, Index)
select_obj (ImagesRectR, ImageRectR1, Index)
select_obj (ImagesRectL, ImageRectL2, Index + 1)
select_obj (ImagesRectR, ImageRectR2, Index + 1)
* 显示立体图像对1,和2
dev_set_window (WindowHandle1)
dev_clear_window ()
dev_display (ImageRectL1)
disp_message (WindowHandle1, '立体图像对 ' + Index$'1i' + ', 左图', 'window', 12, 12, 'black', 'true')
dev_set_window (WindowHandle2)
dev_clear_window ()
dev_display (ImageRectR1)
disp_message (WindowHandle2, '立体图像对 ' + Index$'1i' + ', 右图', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
dev_set_window (WindowHandle1)
dev_display (ImageRectL2)
disp_message (WindowHandle1, '立体图像对 ' + (Index + 1)$'1i' + ', 左图', 'window', 12, 12, 'black', 'true')
dev_set_window (WindowHandle2)
dev_display (ImageRectR2)
disp_message (WindowHandle2, '立体图像对 ' + (Index + 1)$'1i' + ', 右图', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
*计算图像对1的视差
binocular_disparity (ImageRectL1, ImageRectR1, Disparity1, Score1, 'ncc', 11, 11, 0, -150, 150, 1, 0.7, 'left_right_check', 'interpolation')
*选择对象上视差的部分
disparity_image_to_xyz (Disparity1, X1, Y1, Z1, CamParamRectL, CamParamRectR, RelPoseRect)
threshold (Z1, Regions, 0.44361, 0.50799)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 1e10)
reduce_domain (Z1, SelectedRegions, Z1Reduced)
if (Index == 1)
dev_set_window (WindowHandle1)
dev_clear_window ()
dev_display (Disparity1)
disp_message (WindowHandle1, '图像对1的视差图 ' + Index$'1i', 'window', 12, 12, 'black', 'true')
dev_set_window (WindowHandle2)
dev_clear_window ()
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
endif
* 将一个球体放入重建的点中
xyz_to_object_model_3d (X1, Y1, Z1Reduced, OM3DReconstructedScene)
get_region_points (Z1Reduced, Rows, Columns)
get_grayval (ImageRectL1, Rows, Columns, Grayvals)
set_object_model_3d_attrib_mod (OM3DReconstructedScene, '&gray', 'points', Grayvals)
fit_primitives_object_model_3d (OM3DReconstructedScene, ['primitive_type','min_radius','max_radius'], ['sphere',0.06,0.1], OM3DSphereMatched)
copy_object_model_3d (OM3DSphereMatched, 'primitives_all', OM3DSphereOnly)
get_object_model_3d_params (OM3DSphereOnly, 'primitive_parameter', SphereParameters)
SphereCenter := SphereParameters[0:2]
SphereRadius := SphereParameters[3]
* 计算场景流
scene_flow_uncalib (ImageRectL1, ImageRectR1, ImageRectL2, ImageRectR2, \
Disparity1, OpticalFlow, DisparityChange, 15, 60, 'default_parameters', 'accurate')
dev_set_window (WindowHandle1)
dev_set_color ('green')
dev_clear_window ()
dev_display (ImageRectL1)
dev_display (OpticalFlow)
disp_message (WindowHandle1, '未标定的场景流:\n可视化流和 ...', 'window', 12, 12, 'black', 'true')
dev_set_window (WindowHandle2)
dev_set_color ('green')
dev_set_part (266, 211, 367, 284)
dev_display (ImageRectL1)
dev_display (OpticalFlow)
disp_message (WindowHandle2, ' \n... 可视化流的细节', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
dev_set_window (WindowHandle2)
dev_set_part (0, 0, -1, -1)
dev_clear_window ()
dev_display (DisparityChange)
stop ()
* 解压缩第二图像,并与第一图像对的第一图像进行比较
if (Index == 1)
unwarp_image_vector_field (ImageRectL2, OpticalFlow, ImageUnwarped)
abs_diff_image (ImageRectL1, ImageUnwarped, DifferenceImage, 1)
scale_image_range (DifferenceImage, DifferenceImageScaled, 0, 30)
*
Message := 'To verify the results, the left image of pair ' + (Index + 1)$'1i' + ' is unwarped with the vector field that represents the optical flow. Then, it is compared with the left image of pair ' + Index$'1i' + '.'
MessageWrapped := regexp_replace(Message + ' ',['(.{0,40})\\s','replace_all'],'$1\n')
dev_set_window (WindowHandle1)
dev_clear_window ()
dev_set_window (WindowHandle2)
dev_clear_window ()
disp_message (WindowHandle1, MessageWrapped, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
full_domain (ImageUnwarped, ImageUnwarpedFull)
full_domain (ImageRectL1, ImageRectL1Full)
NumDisp := 5
for IndexDisp := 1 to NumDisp by 1
dev_set_window (WindowHandle1)
dev_display (ImageRectL1Full)
disp_message (WindowHandle1, 'Original image (pair ' + Index$'1i' + ', left image)', 'window', 12, 12, 'black', 'true')
disp_progress_bar (WindowHandle1, real(2 * IndexDisp - 1) / real(NumDisp * 2))
wait_seconds (0.5)
*
dev_set_window (WindowHandle1)
dev_display (ImageUnwarpedFull)
disp_message (WindowHandle1, 'Unwarped image (pair ' + (Index + 1)$'1i' + ', left image)', 'window', 12, 12, 'black', 'true')
disp_progress_bar (WindowHandle1, real(2 * IndexDisp) / real(NumDisp * 2))
wait_seconds (0.5)
endfor
dev_set_window (WindowHandle2)
dev_clear_window ()
dev_display (DifferenceImageScaled)
disp_message (WindowHandle2, 'Photo consistency between original \nand unwarped image (scaled)', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
endif
dev_set_window (WindowHandle2)
dev_clear_window ()
* 计算校准后的场景流,找到球体上的点
distance_object_model_3d (OM3DReconstructedScene, OM3DSphereOnly, [], 0, [], [])
select_points_object_model_3d (OM3DReconstructedScene, '&distance', 0, 0.005, OM3DPointsOnSphere)
get_object_model_3d_params (OM3DPointsOnSphere, 'mapping_row', Rows)
get_object_model_3d_params (OM3DPointsOnSphere, 'mapping_col', Cols)
gen_region_points (Region, Rows, Cols)
reduce_domain (Disparity1, Region, DisparityReduced)
*寻找具有良好照片一致性的点
reduce_domain (DisparityReduced, SelectedRegions, DisparityReduced)
threshold (DifferenceImage, RegionGoodDifferenceImage, 0, 10)
* 删除奇异点
dilation_circle (RegionGoodDifferenceImage, RegionDilation, 1.5)
erosion_circle (RegionDilation, RegionErosion, 3.5)
reduce_domain (DisparityReduced, RegionGoodDifferenceImage, DisparityReduced)
*计算场景流
scene_flow_calib (ImageRectL1, ImageRectR1, ImageRectL2, ImageRectR2, DisparityReduced, 15, 60, 'default_parameters', 'accurate', CamParamRectL, CamParamRectR, RelPoseRect, ObjectModel3D)
* 矢量场图显示所有矢量太杂乱
select_points_object_model_3d (ObjectModel3D, '&flow_x', 0.002, 1, OM3DSelected)
sample_object_model_3d (OM3DSelected, 'fast', SphereRadius * 0.05, [], [], OM3DSampled)
get_object_model_3d_params (OM3DSampled, '&flow_x', FlowX)
get_object_model_3d_params (OM3DSampled, '&flow_y', FlowY)
get_object_model_3d_params (OM3DSampled, '&flow_z', FlowZ)
get_object_model_3d_params (OM3DSampled, 'point_coord_x', X)
get_object_model_3d_params (OM3DSampled, 'point_coord_y', Y)
get_object_model_3d_params (OM3DSampled, 'point_coord_z', Z)
get_object_model_3d_params (OM3DSampled, 'num_points', NumberPoints)
lineIndex := gen_tuple_const(3 * NumberPoints,2)
temp := [1:3:3 * NumberPoints]
lineIndex[temp] := [0:NumberPoints - 1]
temp := [2:3:3 * NumberPoints]
lineIndex[temp] := [NumberPoints:2 * NumberPoints - 1]
FlowLength := sqrt(FlowX * FlowX + FlowY * FlowY + FlowZ * FlowZ)
set_object_model_3d_attrib_mod (OM3DSampled, '&flow_length', 'vertices', FlowLength)
gen_object_model_3d_from_points ([X,X + FlowX], [Y,Y + FlowY], [Z,Z + FlowZ], OM3DFlowVectors)
set_object_model_3d_attrib_mod (OM3DFlowVectors, 'lines', 'lines', lineIndex)
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom: Shift + left button'
Instructions[2] := 'Move: Ctrl + left button'
visualize_object_model_3d (WindowHandle1, [OM3DSampled,OM3DFlowVectors], [], [], ['color_attrib_0','lut_0','disp_background'], ['&flow_length','temperature','false'], 'Calibrated scene flow:\nPoints and vectors in 3D', [], Instructions, PoseOut)
dev_clear_window ()
*
* 拟合轴,计算旋转角度
if (Index == 1)
Message := 'One possible application is to calculate the rotation axis and the rotation angle of the rotating globe'
MessageWrapped := regexp_replace(Message + ' ',['(.{0,40})\\s','replace_all'],'$1\n')
disp_message (WindowHandle1, MessageWrapped, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
endif
* 注意scene_flow_calib将流向量存储为扩展属性 “&flow_x”等。
get_object_model_3d_params (OM3DSelected, '&flow_x', FlowX)
get_object_model_3d_params (OM3DSelected, '&flow_y', FlowY)
get_object_model_3d_params (OM3DSelected, '&flow_z', FlowZ)
get_object_model_3d_params (OM3DSelected, 'point_coord_x', X)
get_object_model_3d_params (OM3DSelected, 'point_coord_y', Y)
get_object_model_3d_params (OM3DSelected, 'point_coord_z', Z)
*使用流计算匹配的刚性转换
vector_to_hom_mat3d ('rigid', X, Y, Z, X + FlowX, Y + FlowY, Z + FlowZ, HomMat3D)
* 计算旋转角度和旋转轴的方向
hom_mat3d_to_axis_angle (HomMat3D, Angle, Axis, FixedPoint)
* 在定点线上找一个最接近球体中心的点
compute_closest_point_on_line (SphereCenter, FixedPoint, Axis, PointOnAxis)
* 创建一个漂亮的“箭头”来可视化旋转轴
SphereAxis := PointOnAxis + Axis * SphereRadius
OutAxis := PointOnAxis + Axis * (SphereRadius * 1.5)
gen_object_model_3d_from_points ([PointOnAxis[0],SphereAxis[0]], [PointOnAxis[1],SphereAxis[1]], [PointOnAxis[2],SphereAxis[2]], OM3DAxisInside)
set_object_model_3d_attrib_mod (OM3DAxisInside, 'lines', [], [2,0,1])
gen_object_model_3d_from_points ([SphereAxis[0],OutAxis[0]], [SphereAxis[1],OutAxis[1]], [SphereAxis[2],OutAxis[2]], OM3DAxisOutside)
set_object_model_3d_attrib_mod (OM3DAxisOutside, 'lines', [], [2,0,1])
*创建旋转角度的可视化
gen_rotation_angle_visualization (SphereCenter, SphereRadius, SphereAxis, Axis, HomMat3D, OM3DMeridian1, OM3DMeridian2)
* 可视化旋转轴和角度
dev_set_window (WindowHandle1)
dev_display (ImageRectL1)
disp_object_model_3d (WindowHandle1, [OM3DAxisInside,OM3DAxisOutside], CamParamRectL, [0,0,0,0,0,0,0], ['disp_background','color_0','color_1','line_width'], ['true','dark green','green',5.0])
disp_object_model_3d (WindowHandle1, [OM3DMeridian1,OM3DMeridian2], CamParamRectL, [0,0,0,0,0,0,0], ['disp_background','color_0','color_1','line_width'], ['true','red','red',1.0])
dev_set_window (WindowHandle2)
dev_clear_window ()
dev_display (ImageRectR1)
pose_invert (RelPoseRect, RectRPosRectL)
disp_object_model_3d (WindowHandle2, [OM3DAxisInside,OM3DAxisOutside], CamParamRectR, RectRPosRectL, ['disp_background','color_0','color_1','line_width'], ['true','dark green','green',5.0])
disp_object_model_3d (WindowHandle2, [OM3DMeridian1,OM3DMeridian2], CamParamRectR, RectRPosRectL, ['disp_background','color_0','color_1','line_width'], ['true','red','red',1.0])
disp_message (WindowHandle1, 'Rotation axes fitted into flow vectors.\nRotation angle: ' + Angle$'2.1f' + '°', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
* 在三维中显示
gen_sphere_object_model_3d_center (SphereCenter[0], SphereCenter[1], SphereCenter[2], 0.995 * SphereRadius, OM3DSphereForVis)
triangulate_object_model_3d (OM3DSphereForVis, 'greedy', 'greedy_radius_value', 0.04, OM3DSphereTriangulatedForVis, Information)
dev_set_window (WindowHandle1)
visualize_object_model_3d (WindowHandle1, [OM3DReconstructedScene,OM3DAxisInside,OM3DAxisOutside,OM3DSphereTriangulatedForVis], [], [], ['color_attrib_0','color_attrib_start_0','color_attrib_end_0','color_1','color_2','color_3','alpha_3','disp_background','line_width_1','line_width_2','disp_lines_3','line_color_3'], ['&gray',0,255,'dark green','green','medium blue',1.0,'false',5.0,5.0,'true','blue'], 'Reconstructed points and rotation axis', [], Instructions, PoseOut2)
* 释放资源
clear_object_model_3d (ObjectModel3D)
clear_object_model_3d (OM3DFlowVectors)
clear_object_model_3d (OM3DPointsOnSphere)
clear_object_model_3d (OM3DSelected)
clear_object_model_3d (OM3DSampled)
clear_object_model_3d (OM3DReconstructedScene)
clear_object_model_3d (OM3DSphereMatched)
clear_object_model_3d (OM3DSphereOnly)
clear_object_model_3d (OM3DAxisInside)
clear_object_model_3d (OM3DAxisOutside)
clear_object_model_3d (OM3DMeridian1)
clear_object_model_3d (OM3DMeridian2)
clear_object_model_3d (OM3DSphereForVis)
clear_object_model_3d (OM3DSphereTriangulatedForVis)
endfor
dev_set_window (WindowHandle2)
dev_close_window ()
执行结果为
工业视觉halcon三维重建函数scene_flow_uncalib介绍
|