当前位置: 首页 > article >正文

halcon三维点云数据处理(十)locate_cylinder_3d

目录

  • 一、locate_cylinder_3d例程代码
  • 二、gen_binocular_rectification_map函数
  • 三、binocular_disparity函数
  • 四、自定义函数select_best_candidates
  • 五、自定义函数remove_shadowed_regions

一、locate_cylinder_3d例程代码

1、读取或者创建3D形状模型,
2、根据双目相机参数和图像获得校正后图像对的视差图。
3、

gen_cam_par_area_scan_division (0.00855613, -2579.17, 5.99979e-006, 6e-006, 399.681, 232.327, 752, 480, CamParamMatching)
gen_cam_par_area_scan_division (0.0121469, -2514.3, 9.30281e-006, 9.3e-006, 272.773, 273.689, 640, 512, CamParam1)
gen_cam_par_area_scan_division (0.0121592, -2687.76, 9.30085e-006, 9.3e-006, 302.665, 263.738, 640, 512, CamParam2)
create_pose (0.202198, 0.00177953, 0.0376427, 0.325733, 342.295, 359.167, 'Rp+T', 'gba', 'point', RelPose)
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, 1, 'viewing_direction', 'bilinear', CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect)
* 
file_exists ('cylinder.sm3', FileExists)
if (FileExists)
    * Load the model from file
    read_shape_model_3d ('cylinder.sm3', ShapeModel3DID)
else
    * Recreate the model from the DXF file
    read_object_model_3d ('cylinder.dxf', 'mm', [], [], ObjectModel3DID, DxfStatus)
    prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])
    create_shape_model_3d (ObjectModel3DID, CamParamMatching, rad(90), 0, 0, 'gba', 0, 0, 0, rad(45), 0, rad(360), 0.3, 0.45, 10, 'num_levels', 5, ShapeModel3DID)
    write_shape_model_3d (ShapeModel3DID, 'cylinder.sm3')
endif
* 
for Index := 1 to 15 by 1
    * 
    * emphasize() enhances the texture on the cylinders surface
    read_image (Image1, Path + 'stereo_left_' + Index$'02')
    emphasize (Image1, ImageEmphasize1, 5, 5, 2)
    map_image (ImageEmphasize1, Map1, ImageMapped1)
    read_image (Image2, Path + 'stereo_right_' + Index$'02')
    emphasize (Image2, ImageEmphasize2, 5, 5, 2)
    map_image (ImageEmphasize2, Map2, ImageMapped2)
    * 
    * the mask width and height must be (approximately) set according to the size
    * of the pattern projected onto the setup
    binocular_disparity (ImageMapped2, ImageMapped1, Disparity, Score, 'ncc', 7, 7, 0, -20, 140, 1, 0.7, 'left_right_check', 'none')
    select_best_candidates (Disparity, TopMost)
    remove_shadowed_regions (Disparity, 0.01)
    * 
    * display height map and highest object extracted
    clear_window (WindowHandleL)
    dev_set_window (WindowHandle)
    dev_clear_window ()
    dev_display (ImageMapped2)
    dev_display (Disparity)
    wait_seconds (0.5)
    dev_display (TopMost)
    dev_display (Disparity)
    wait_seconds (0.5)
    * 
    * determine exact 3D pose of highest object
    dev_set_window (WindowHandleL)
    read_image (Image, Path + 'closeup_' + Index$'02')
    dev_display (Image)
    find_shape_model_3d (Image, ShapeModel3DID, 0.8, 0.7, [0, 2], [], [], Pose, CovPose, Score_CTRL)
    if (|Score_CTRL| != 0)
        dev_set_color ('green')
        display_match_pose (ShapeModel3DID, Pose, WindowHandleL)
    else
        disp_message (WindowHandleL, ' No match found ', 'window', 12, 12, 'black', 'true')
    endif
    * 
    if (Index != 15)
        disp_continue_message (WindowHandleL, 'black', 'true')
    endif
    stop ()
endfor
disp_message (WindowHandleL, 'Program finished \nPress \'Run\' to clear the shape model', 'window', 1, 1, 'black', 'true')
stop ()
dev_close_window ()

二、gen_binocular_rectification_map函数

生成变换映射,描述双目相机对图像到公共校正图像平面的映射。

gen_binocular_rectification_map( : Map1, Map2 : CamParam1, CamParam2, RelPose, SubSampling, Method, MapType : CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect)

三、binocular_disparity函数

使用相关技术计算校正图像对的视差

binocular_disparity(ImageRect1, ImageRect2 : Disparity, Score : Method, MaskWidth, MaskHeight, TextureThresh, MinDisparity, MaxDisparity, NumLevels, ScoreThresh, Filter, SubDisparity : )

四、自定义函数select_best_candidates

下面这段代码的功能是选取最上层的一个圆柱,感觉非常经典,逐句理解一下:
full_domain 将图像的域(ROI)扩大到最大。
scale_image_max 灰度值范围(minimum,maximum ),扩展到范围是(0 ,255)。
regiongrowing_n 对多通道图像使用区域生长来分割图像
intensity 计算灰度值的均值和偏差。
select_gray 根据灰度值特征选择区域。
select_shape借助形状特征选择区域。
min_max_gray确定区域内的最小和最大灰度值。
tuple_sort_index 对Tuple中的所有元素按升序排序
select_obj 选取图像

* 
full_domain (Disparity, DisparityFull)
scale_image_max (DisparityFull, ImageScaleMax2)
gray_dilation_shape (ImageScaleMax2, ImageMax, 3, 3, 'octagon')
* 
* 
regiongrowing_n (ImageMax, cylinders, '2-norm', 0, 5, 200)
intensity (cylinders, ImageScaleMax2, Mean1, Deviation1)
tuple_max (Mean1, MaxVal)
select_gray (cylinders, ImageScaleMax2, SelectedRegions, 'mean', 'and', MaxVal / 2, MaxVal + 1)
select_shape (SelectedRegions, SelectedRegions, ['area', 'rectangularity'], 'and', [7000, 0.65], [25000, 1.0])
intensity (SelectedRegions, ImageScaleMax2, Mean, Deviation)
* 
min_max_gray (SelectedRegions, ImageScaleMax2, 0, Min, Max, Range)
tuple_sort_index (Max, Indices)
select_obj (SelectedRegions, TopMost, Indices[|Max| - 1] + 1)
* 
return ()

五、自定义函数remove_shadowed_regions

对于每个3D相机,遮挡和阴影都会产生非常高视差的小区域,这将被理解为靠近相机的物体,为了提高结果的质量,我们删除了这些区域,把高视差区域灰度设为0。

scale_image_max (Disparity, ImageScaleMax)
gray_histo (ImageScaleMax, ImageScaleMax, AbsoluteHisto, RelativeHisto)
Percent := RelativeHisto[255]
i := 254
while (Percent < Threshold)
    Percent := RelativeHisto[i] + Percent
    i := i - 1
endwhile
threshold (ImageScaleMax, Region, i, 255)
overpaint_region (Disparity, Region, 0.0, 'fill')
return ()

http://www.kler.cn/a/499903.html

相关文章:

  • 3298. 统计重新排列后包含另一个字符串的子字符串数目 II
  • 一分钟学会文心一言API如何接入,文心一言API接入教程
  • Elastic-Job相关
  • 关于量子神经网络的思考
  • React 元素渲染
  • Unity3d 基于Barracuda推理库和YOLO算法实现对象检测功能
  • VS Code的设置功能以及多层级的设置方式与解密
  • 海康机器人IPO,又近了一步
  • 青稞Talk预告!面向自动驾驶与物理世界对齐的视频生成模型
  • PY_11_07
  • 深入详解自然语言处理(NLP)中的语言模型:BERT、GPT及其他预训练模型的原理与应用
  • Qt学习笔记第81到90讲
  • SpringBoot日常:集成Kafka
  • 【深度学习】数据预处理
  • vue3的v-for 与 v-if
  • React setState详细使用总结
  • Bytebase 3.1.0 - 通过 Google / GitHub SSO 功能开放给专业版
  • C语言gdb调试
  • 14.C语言Union详解:节省内存的利器
  • GaussDB分布式数据倾斜处理
  • 2021 年 3 月青少年软编等考 C 语言五级真题解析
  • 如何使用MVC模式设计和实现校园自助点餐系统的微信小程序
  • Day04-后端Web基础(Maven基础)
  • uniApp通过xgplayer(西瓜播放器)接入视频实时监控
  • 如何修改 Go 结构体的私有字段
  • 关于解决线上问题ES内存直接打满的问题