标定结果
文章图片
- Halcon标定过程
- 获取左右相机图像中标定板的区域;
参数含义:
Image :输入图像
CalPlate :标定板区域
CalPlateDescr:标定板描述文件
SizeGauss:高斯滤波核;
MarkThresh,提取mark的阈值
MinDiamMarks :标定板中MARK圆的最小半径
- 提取左右相机图像中标定板的MARK点坐标和摄像机外部参数;
参数含义:
Image:输入图像
CalPlateRegion:标定板区域
CalPlateDescr:标定板描述文件
StartCamParam:摄像机内部参数
DeltaThresh:提取MARK黑点所需的初始阈值
MinThresh:提取MARK黑点步进阈值
Alpha:提取MARK黑点轮廓的滤波参数
MinContLength:MARK黑点轮廓的最小长度
MaxDiamMarks:MARK黑点轮廓的最大直径
RCoord:探测到MARK黑点的行坐标
CCoord:探测到MARK黑点的列坐标
StartPose输出摄像机外部参数
- 执行双目标定;
binocular_calibration( : : NX, NY, NZ, NRow1, NCol1, NRow2, NCol2, StartCamParam1, StartCamParam2, NStartPose1,NStartPose2, EstimateParams : CamParam1, CamParam2, NFinalPose1, NFinalPose2, RelPose, Errors)
参数含义:
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平均错误误差
- 获取非标准外极线几何到标准外极线几何之间的变换矩阵;
参数含义:
Map1:左面相机校正映射数据
Map2:右面相机校正映射数据
CamParam1:左面相机的摄像机内部参数
CamParam2:右面相机的摄像机内部参数
RelPose:右相机相对左相机的位姿
SubSampling:采样因子
Method:映射校正方法
MapType:映射校正类型
CamParamRect1: 左面相机校正以后的摄像机内部参数
CamParamRect2: 右面相机校正以后的摄像机内部参数
CamPoseRect1:校正以后的左面相机相对原始相机的位姿
CamPoseRect2:校正以后的右面相机相对原始相机的位姿
RelPoseRect:校正以后的右面相机相对校正以后的左面相机的位姿关系
- 通过变换矩阵对未校正的图像进行图像校正
map_image(Image, Map : ImageMapped : : )
参数含义:
Image:待校正图像
Map:相机校正映射数据
ImageMapped:校正后的图像
- 显示图像校正后标准外极线几何时的图像.
参数含义:
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)
【halcon|双目立体视觉之Halcon标定】
推荐阅读
- halcon|halcon 制作标定板
- halcon|halcon 畸变图像校正与长度测量
- halcon|halcon联合C#的实时采集显示
- halcon|halcon 深度学习(一)(分类)
- 大数据|2021全球程序员收入报告出炉!字节高级码农年薪274万元排第5【文末送5本书】...
- Python OpenCV仿射变换实现详细指南
- 机器学习|机器学习——垃圾邮件识别——SVM、MNB模型使用
- 深度学习|学习笔记(深度学习(4)——卷积神经网络(CNN)PyTorch实践篇)
- Python使用OpenCV实现图像模糊详解