双目立体视觉之Halcon标定

标定结果

双目立体视觉之Halcon标定

  • Halcon标定过程

  1. 获取左右相机图像中标定板的区域;

find_caltab(Image : CalPlate : CalPlateDescrSizeGaussMarkThreshMinDiamMarks :)

参数含义:

Image :         输入图像

CalPlate :      标定板区域

CalPlateDescr:    标定板描述文件

SizeGauss:        高斯滤波核;

MarkThresh,       提取mark的阈值

MinDiamMarks :    标定板中MARK圆的最小半径

  1. 提取左右相机图像中标定板的MARK点坐标和摄像机外部参数;

find_marks_and_pose(ImageCalPlateRegion : : CalPlateDescrStartCamParamStartThreshDeltaThreshMinThresh,AlphaMinContLengthMaxDiamMarks : RCoordCCoordStartPose)

参数含义:

Image:            输入图像

CalPlateRegion:   标定板区域

CalPlateDescr:     标定板描述文件

StartCamParam:     摄像机内部参数

DeltaThresh:       提取MARK黑点所需的初始阈值

MinThresh:         提取MARK黑点步进阈值

Alpha:             提取MARK黑点轮廓的滤波参数

MinContLength:     MARK黑点轮廓的最小长度

MaxDiamMarks:      MARK黑点轮廓的最大直径

RCoord:            探测到MARK黑点的行坐标

CCoord:           探测到MARK黑点的列坐标

StartPose          输出摄像机外部参数

  1. 执行双目标定;

binocular_calibration( : : NXNYNZNRow1NCol1NRow2NCol2StartCamParam1StartCamParam2NStartPose1,NStartPose2EstimateParams : CamParam1CamParam2NFinalPose1NFinalPose2RelPoseErrors)

参数含义:

NX:          标定板MARK点行坐标(经过排序的,单位是米)

NY:          标定板MARK点列坐标(经过排序的,单位是米)

NZ:          标定板MARK点Z坐标(经过排序的,单位是米)

NRow1:        左面相机中标定板提取出的MARK点行坐标(经过排序的,单位是像素)

NCol1:       左面相机中标定板提取出的MARK点列坐标(经过排序的,单位是像素)

NRow2:       右面相机中标定板提取出的MARK点行坐标(经过排序的,单位是像素)

NCol2:       右面相机中标定板提取出的MARK点列坐标(经过排序的,单位是像素)

StartCamParam1:左面相机的摄像机内部参数

StartCamParam2:右面相机的摄像机内部参数

NStartPose1: 左面相机的摄像机外部参数

NStartPose2: 右面相机的摄像机外部参数

EstimateParams: 选择要标定出哪些相机参数,”all”代表所有的参数

CamParam1:     标定后得到的左面相机的摄像机内部参数

CamParam2:     标定后得到的右面相机的摄像机内部参数

NFinalPose1:   标定后得到的左面相机的摄像机外部参数

NFinalPose2:   标定后得到的右面相机的摄像机外部参数

RelPose:     右边相机相对于左面相机的位姿

Errors         平均错误误差

  1. 获取非标准外极线几何到标准外极线几何之间的变换矩阵;

gen_binocular_rectification_map( : Map1Map2 : CamParam1CamParam2RelPoseSubSamplingMethodMapType :CamParamRect1CamParamRect2CamPoseRect1CamPoseRect2RelPoseRect)

参数含义:

Map1:左面相机校正映射数据

Map2:右面相机校正映射数据

CamParam1:左面相机的摄像机内部参数

CamParam2:右面相机的摄像机内部参数

RelPose:  右相机相对左相机的位姿

SubSampling:采样因子

Method:    映射校正方法

MapType:   映射校正类型

CamParamRect1: 左面相机校正以后的摄像机内部参数

CamParamRect2: 右面相机校正以后的摄像机内部参数

CamPoseRect1:  校正以后的左面相机相对原始相机的位姿

CamPoseRect2:校正以后的右面相机相对原始相机的位姿

RelPoseRect:校正以后的右面相机相对校正以后的左面相机的位姿关系

  1. 通过变换矩阵对未校正的图像进行图像校正

map_image(ImageMap : ImageMapped : : )

参数含义:

Image:          待校正图像

Map:            相机校正映射数据

ImageMapped:    校正后的图像

  1. 显示图像校正后标准外极线几何时的图像.

check_epipolar_constraint(ImageRectifiedLImageRectifiedR : : RectCamParLRectCamParRWindowHandle1WindowHandle2CaltabFile :EpipolarError)

参数含义:

ImageRectifiedL:左面相机校正以后的图像

ImageRectifiedR:右面相机校正以后的图像

RectCamParL:左面相机校正以后的摄像机内部参数

RectCamParR:右面相机校正以后的摄像机内部参数

WindowHandle1:左面摄像机图像窗口

WindowHandle2:右面摄像机图像窗口

CaltabFile:标定板文件

EpipolarError:错误信息


*设置离线图像存放的路径
ImgPath := 'stereo/board/'

Index := 1
*读取左边相机离线图像
read_image (ImageL, ImgPath + 'calib_l_' + Index$'02d')

*读取右边相机离线图像
read_image (ImageR, ImgPath + 'calib_r_' + Index$'02d')

*关闭已经打开的窗口
dev_close_window ()

*关闭程序计数器,变量更新,图像更新窗口
dev_update_off ()

*获取左边相机图像大小
get_image_size (ImageL, WidthL, HeightL)

*创建左边的窗口
dev_open_window (0, 0, WidthL, HeightL, 'black', WindowHandle1)

*设置区域填充模式为边缘模式
dev_set_draw ('margin')

*设置输出对象的颜色为绿色
dev_set_color ('green')

*设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')

*获取右边相机图像大小
get_image_size (ImageR, WidthR, HeightR)

*创建右边的窗口
dev_open_window (0, WidthL + 12, WidthL, HeightL, 'black', WindowHandle2)

*设置区域填充模式为边缘模式
dev_set_draw ('margin')

*设置输出对象的颜色为绿色
dev_set_color ('green')


* 校正文件
CaltabFile := 'caltab_30mm.descr'

*获取标定板中所有mark点的中心坐标
caltab_points (CaltabFile, X, Y, Z)

* 设置左右两个相机的摄像机内部参数[Focus,Kappa,Sx,Sy,Cx,Cy,Whith,Height]
StartCamParL := [0.0125,0,1.48e-5,1.48e-5,WidthL / 2.0,HeightL / 2.0,WidthL,HeightL]
StartCamParR := StartCamParL
* Parameter settings for find_caltab and find_marks_and_pose
SizeGauss := 3
MarkThresh := 120
MinDiamMarks := 5
StartThresh := 128
DeltaThresh := 10
MinThresh := 18
Alpha := 0.9
MinContLength := 15
MaxDiamMarks := 100
* Create the tuples in which the image coordinates of the
* calibration marks and the initial poses will be accumulated
RowsL := []
ColsL := []
StartPosesL := []
RowsR := []
ColsR := []
StartPosesR := []
* Start the loop over the calibration images
for Index := 1 to 15 by 1
    * 读取左面相机拍照的标定板图像
    read_image (ImageL, ImgPath + 'calib_l_' + Index$'02d')
    
    * 读取右面相机拍照的标定板图像
    read_image (ImageR, ImgPath + 'calib_r_' + Index$'02d')
    
    * 分割左面相机拍照的标定板图像标定板区域
    find_caltab (ImageL, CaltabL, CaltabFile, SizeGauss, MarkThresh, MinDiamMarks)
    
    * 分割右面相机拍照的标定板图像标定板区域
    find_caltab (ImageR, CaltabR, CaltabFile, SizeGauss, MarkThresh, MinDiamMarks)
    
    *激活左面的窗口
    dev_set_window (WindowHandle1)
    
    *显示左面相机拍照的标定板图像
    dev_display (ImageL)
    
    *显示左面相机拍照的标定板图像标定板区域
    dev_display (CaltabL)
    
    *激活右面的窗口
    dev_set_window (WindowHandle2)
    
    *显示右面相机拍照的标定板图像
    dev_display (ImageR)
    
    *显示右面相机拍照的标定板图像标定板区域
    dev_display (CaltabR)

    *提取左面相机拍照的标定板中MARK点坐标和摄像机外部参数
    find_marks_and_pose (ImageL, CaltabL, CaltabFile, StartCamParL, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoordL, CCoordL, StartPoseL)
    
    *显示左面图像中标定板三维模型
    disp_caltab (WindowHandle1, CaltabFile, StartCamParL, StartPoseL, 1)

    *提取右面相机拍照的标定板中MARK点坐标和摄像机外部参数
    find_marks_and_pose (ImageR, CaltabR, CaltabFile, StartCamParR, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoordR, CCoordR, StartPoseR)
    
    *显示右面图像中标定板三维模型
    disp_caltab (WindowHandle2, CaltabFile, StartCamParR, StartPoseR, 1)

    *将17张左面相机拍照图像的MARK点行坐标连接起来
    RowsL := [RowsL,RCoordL]
    
    *将17张左面相机拍照图像的MARK点列坐标连接起来
    ColsL := [ColsL,CCoordL]
    
    *将左面相机的摄像机外部参数连接起来
    StartPosesL := [StartPosesL,StartPoseL]
    
    *将17张右面相机拍照图像的MARK点行坐标连接起来
    RowsR := [RowsR,RCoordR]
    
    *将17张右面相机拍照图像的MARK点列坐标连接起来
    ColsR := [ColsR,CCoordR]
    
    *将右面相机的摄像机外部参数连接起来
    StartPosesR := [StartPosesR,StartPoseR]
endfor


* 执行双目标定
binocular_calibration (X, Y, Z, RowsL, ColsL, RowsR, ColsR, StartCamParL, StartCamParR, StartPosesL, StartPosesR, 'all', CamParamL, CamParamR, NFinalPoseL, NFinalPoseR, cLPcR, Errors)
* If required, save the results to disk:
* write_cam_par (CamParamL, 'cam_left-125.dat')
* write_cam_par (CamParamR, 'cam_right-125.dat')
* write_pose (cLPcR, 'pos_right2left.dat')


* 获取非标准外极线几何到标准外极线几何之间的变换关系
gen_binocular_rectification_map (MapL, MapR, CamParamL, CamParamR, cLPcR, 1, 'geometric', 'bilinear', RectCamParL, RectCamParR, CamPoseRectL, CamPoseRectR, RectLPosRectR)

*读取左相机拍照的一张图
read_image (ImageL, ImgPath + 'calib_l_01')


*读取右相机拍照的一张图
read_image (ImageR, ImgPath + 'calib_r_01')


*根据上述变换关系,对左相机拍照图进行校正
map_image (ImageL, MapL, ImageRectifiedL)

*根据上述变换关系,对右相机拍照图进行校正
map_image (ImageR, MapR, ImageRectifiedR)


显示最后的双目标定结果,得到标准外极线几何时的图像.
check_epipolar_constraint (ImageRectifiedL, ImageRectifiedR, RectCamParL, RectCamParR, WindowHandle1, WindowHandle2, CaltabFile, EpipolarError)

上一篇:GO语言GC的历史及演进简介


下一篇:Easyui 根据多个列合并单元格和每列单独合并