halcon双目搭建生成3d点云模型

1.搭建平台(halcon和c#联合)

 

1.1.光机

1.2.相机

1.3.平台搭建

 1.4.大恒官网下载相机光机驱动

注意:

        1.PC需要选择有USB3.0的端口,否则相机报警

        2.标定板选择在光机覆盖的1/2-1/3

        3.现在的相机选择的是2600w的看现场实际情况选择

1.5.相机驱动曝光和触发延时30000,将触发模式变成on

 也就是光机每给一个触发相机进行一次拍照。

二.程序运行

2.1程序已经标注具体意思

分为,1.光机内参设定;2.标定(需要配合光机触发软件);3.重构

具体标定如下(main)

 封装内部参数

dev_update_on()
* dev_update_off()
dev_close_window ()
dev_open_window (0, 0, 600, 450, 'black', WindowHandle1)
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
gen_caltab (7, 7, 0.015, 0.5, 'caltab.descr', 'caltab.ps')
create_structured_light_model ('deflectometry', StructuredLightModel)
PatternWidth := 1280
PatternHeight := 720
PatternType := 'gray_code_and_phase_shift'
PatternOrientation := 'both'
MinStripeWidth := 16
Normalization := 'global'
set_structured_light_model_param (StructuredLightModel, \
          ['pattern_width','pattern_height','pattern_type','pattern_orientation','min_stripe_width','normalization','persistence'], \
          [PatternWidth,PatternHeight,PatternType,PatternOrientation,MinStripeWidth,Normalization,true])
gen_structured_light_pattern (PatternImages, StructuredLightModel)
open_framegrabber ('GenICamTL', 0, 0, 0, 0, 0, 0, 'progressive',-1, 'default', -1, 'false', 'default', 'ME2P-2621-15U3M(GCD21010014)', 0, -1, AcqHandle)
set_framegrabber_param (AcqHandle, 'ExposureTime', 33333.0)
while (1)
    set_framegrabber_param (AcqHandle, 'TriggerMode', 'Off')
    grab_image (Image, AcqHandle)
    set_framegrabber_param (AcqHandle, 'TriggerMode', 'On')
endwhile
Calib (PatternImages, WindowHandle1, AcqHandle, StructuredLightModel, CameraParam, ProjectorParam, PoseProjectortoCamera)
read_tuple('CameraParam.tup',CameraParam)
read_tuple('ProjectorParam.tup',ProjectorParam)
read_tuple('PoseProjectortoCamera.tup',PoseProjectortoCamera)
indexI := []
while (1)
    indexI := 1    
    TDGrab (PatternImages, WindowHandle1, AcqHandle, CameraParam, ProjectorParam, PoseProjectortoCamera, StructuredLightModel, indexI, ObjectModel3D)
endwhile
clear_structured_light_model (StructuredLightModel)
close_framegrabber (AcqHandle)
clear_object_model_3d(ObjectModel3D)




dev_set_draw ('margin')
dev_set_line_width (1)
OpSystem := environment('OS')
CaltabFile :='caltab.descr'
caltab_points (CaltabFile, CaltabX, CaltabY, CaltabZ)
gen_cam_par_area_scan_division (0.008, 0, 0.0000025, 0.0000025, 5120/2, 5120/2, 5120, 5120, StartCamPar)
gen_cam_par_area_scan_polynomial (0.008, 0, 0, 0, 0, 0, 0.0000054, 0.0000054, 1280/2, 720/2, 1280, 720, StartProPar)
create_calib_data ('calibration_object', 2, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)
set_calib_data_cam_param (CalibDataID, 1, [], StartProPar)
set_calib_data_calib_object (CalibDataID, 0, CaltabFile)
stop()
NumImages := 8
for I := 1 to NumImages by 1
    try
        PixeltoPixel (PatternImages, ImageR, ImageC, CalibImage, StructuredLightModel, WindowHandle, AcqHandle)
        scale_image(CalibImage, CalibImage1, 1, 0)        
        find_calib_object (CalibImage1, CalibDataID, 0, 0, I, ['alpha'], [0.3])
        get_calib_data_observ_contours (Caltab, CalibDataID, 'marks', 0, 0, I)
        dev_display (Caltab)
        get_calib_data_observ_contours (CaltabL, CalibDataID, 'caltab', 0, 0, I)
        gen_region_contour_xld (CaltabL, Region, 'filled')
        gen_region_contour_xld (Caltab, Region, 'filled')        
        count_obj (Region, Number)
        if (Number != 49)
            disp_message(WindowHandle, '标定板识别错误', 'window', 12, 12, 'black', 'true')
        endif        
        dilation_circle (Region, RegionDilation, 6.5)
        difference (RegionDilation, Region, RegionDifference)
        get_calib_data_observ_points (CalibDataID, 0, 0, I, RCoordC, CCoordC, Index, StartPoseC)   
        fit_surface_first_order(RegionDifference, ImageR, 'regression', 5, 2, Alpha, Beta, Gamma)
        area_center (RegionDifference, Area, Row, Column)
        RCoordP := (RCoordC-Row)*Alpha+(CCoordC-Column)*Beta+Gamma
        fit_surface_first_order(RegionDifference, ImageC, 'regression', 5, 2, Alpha, Beta, Gamma)
        area_center (RegionDifference, Area, Row, Column)
        CCoordP := (RCoordC-Row)*Alpha+(CCoordC-Column)*Beta+Gamma     
        vector_to_pose (CaltabX, CaltabY, CaltabZ, RCoordP, CCoordP, StartProPar, 'iterative', 'error', StartPoseP, Quality) 
        set_calib_data_observ_points(CalibDataID, 1, 0, I, RCoordP, CCoordP, Index, StartPoseP)
    catch (Exception)
        disp_message(WindowHandle, '未找到标定板', 'window', 12, 12, 'black', 'true')
        I := I - 1
        continue
    endtry 
    write_image (CalibImage, 'tiff', 0, '标定使用图片' + I + '.tiff')
    calibrate_cameras (CalibDataID, Error)
    stop ()
endfor
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, 'camera', 0, 'params', CameraParam)
get_calib_data (CalibDataID, 'camera', 1, 'params', ProjectorParam)
get_calib_data (CalibDataID, 'camera', 1, 'pose', PoseProjectortoCamera)
write_tuple(CameraParam,'CameraParam.tup')
write_tuple(ProjectorParam,'ProjectorParam.tup')
write_tuple(PoseProjectortoCamera,'PoseProjectortoCamera.tup')
* 释放内存
clear_calib_data (CalibDataID)
return ()



PixeltoPixel (PatternImages, ImageR0, ImageC0, CalibImage, StructuredLightModel, WindowHandle, AcqHandle)
stop()
copy_image(ImageR0, ImageR)
copy_image(ImageC0, ImageC)
intersection(ImageR, ImageC, ImageRC)
draw_region (Region, WindowHandle)
reduce_domain (ImageRC, Region, ImageReduced)
get_region_points(ImageReduced, Rows, Columns)
get_grayval(ImageC, Rows, Columns, ProjectC)
get_grayval(ImageR, Rows, Columns, ProjectR)
intersect_lines_of_sight(CameraParam, ProjectorParam, RelPose, Rows, Columns, ProjectR, ProjectC, X, Y, Z, Dist)
gen_image_proto(ImageC, ImageX, 0)
gen_image_proto(ImageC, ImageY, 0)
gen_image_proto(ImageC, ImageZ, 0)
set_grayval(ImageX, Rows, Columns, X)
set_grayval(ImageY, Rows, Columns, Y)
set_grayval(ImageZ, Rows, Columns, Z)
compose4(ImageX, ImageY, ImageZ, CalibImage, MultiChannelImage)
threshold (ImageZ, RegionZero, 0, 0)
difference (ImageZ, RegionZero, RegionI)
connection(RegionI, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999999)
union1(SelectedRegions, RegionI)
reduce_domain (ImageX, RegionI, ImageX)
reduce_domain (ImageY, RegionI, ImageY)
reduce_domain (ImageZ, RegionI, ImageZ)
xyz_to_object_model_3d(ImageX, ImageY, ImageZ, ObjectModel3D)
connection_object_model_3d (ObjectModel3D, 'distance_3d', 0.003,ObjectModel3DConnected2)
select_object_model_3d (ObjectModel3DConnected2, 'num_points', 'and',1000, 9999999999, ObjectModel3DSelected2)
visualize_object_model_3d (WindowHandle, ObjectModel3DSelected2, [], [], ['colored'], [12], [], [], [], PoseOut2)
read_object_model_3d ('D:/0840L178A01_00(2016.11.16).STL','mm','file_type', 'stl', ObjectModel3D1, Status1)
create_surface_model (ObjectModel3D1, 0.01,'model_invert_normals','true', SurfaceModelID)
get_surface_model_param (SurfaceModelID, 'sampled_model', GenParamValue)
union_object_model_3d (ObjectModel3DSelected2, 'points_surface', UnionObjectModel3D1)
find_surface_model (SurfaceModelID, UnionObjectModel3D1, 0.05, 0.9, 0.0, 'false','num_matches', 6, Pose, Score, SurfaceMatchingResultID)
tuple_length (Score, Length)
Poses := {[]}
for Index := 0 to Length-1 by 1
    Poses.at(Index) := Pose[0+Index*7:6+Index*7]
endfor
rigid_trans_object_model_3d (ObjectModel3D1, Poses.at(0), ObjectModel3DRigidTrans1)
visualize_object_model_3d (WindowHandle, [ObjectModel3DRigidTrans1,ObjectModel3DSelected2], [], [], ['colored'], [12], [], [], [], PoseOut3)
triangulate_object_model_3d (UnionObjectModel3D1, 'greedy', [], [], TriangulatedObjectModel3D, Information)
write_object_model_3d (TriangulatedObjectModel3D, 'stl','test.stl', [], [])
write_object_model_3d (UnionObjectModel3D1, 'ply', 'test.ply', [], [])
get_object_model_3d_params (TriangulatedObjectModel3D, 'center', GenParamValue1)
open_file ('C:/Users/PC/Desktop/双目视觉/新建文本文档.txt', 'append', FileHandle)
fwrite_string (FileHandle, Poses.at(0))
stop ()
return ()

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锋利成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值