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 ()