高度测量步骤:
1.执行双目标定;
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 平均错误误差
2.获取非标准外极线几何到标准外极线几何之间的变换矩阵;
gen_binocular_rectification_map( : Map1, Map2 : CamParam1, CamParam2, RelPose, SubSampling, Method, MapType :CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect)
参数含义:
Map1:左面相机校正映射数据
Map2:右面相机校正映射数据
CamParam1:左面相机的摄像机内部参数
CamParam2:右面相机的摄像机内部参数
RelPose: 右相机相对左相机的位姿
SubSampling:采样因子
Method: 映射校正方法
MapType: 映射校正类型
CamParamRect1: 左面相机校正以后的摄像机内部参数
CamParamRect2: 右面相机校正以后的摄像机内部参数
CamPoseRect1: 校正以后的左面相机相对原始相机的位姿
CamPoseRect2:校正以后的右面相机相对原始相机的位姿
RelPoseRect:校正以后的右面相机相对校正以后的左面相机的位姿关系
3.通过变换矩阵对未校正的图像进行图像校正
map_image(Image, Map : ImageMapped : : )
参数含义:
Image: 待校正图像
Map: 相机校正映射数据
ImageMapped: 校正后的图像
4.计算左右摄像机的视差图像
binocular_disparity(ImageRect1, ImageRect2 : Disparity, Score : Method, MaskWidth, MaskHeight, TextureThresh,MinDisparity, MaxDisparity, NumLevels, ScoreThresh, Filter, SubDisparity:)
参数含义:
ImageRect1:左边相机校正后的图像
ImageRect2:右边相机校正后的图像
Disparity:视差映射图
Score:视差值得匹配分数
Method:匹配方法
MaskWidth:校正窗口的宽度
MaskHeight:校正窗口的高度
TextureThresh:匹配需要的阈值
MinDisparity:视差的最小值
MaxDisparity:视差的最大值
NumLevels:金字塔层级
ScoreThresh:相关函数的最小分值,保证匹配质量
Filter:增加匹配的鲁棒性
SubDisparity :视差图是否采用亚像素
5.通过视差计算距离图像
binocular_distance_mg(ImageRect1, ImageRect2 : Distance, Score : CamParamRect1, CamParamRect2, RelPoseRect,GrayConstancy, GradientConstancy, Smoothness, InitialGuess, CalculateScore, MGParamName, MGParamValue : )
参数含义:
ImageRect1:左边相机校正后的图像
ImageRect2:右边相机校正后的图像
Distance:距离图像
Score:视差值得匹配分数
CamParamRect1:左边相机校正后的摄像机内部参数
CamParamRect2:右边相机校正后的摄像机内部参数
RelPoseRect:校正后的右相机相对左相机的位姿
GrayConstancy:距离图像中灰度值的权重
GradientConstancy:距离图像中梯度的权重
Smoothness:图像滤波权重
InitialGuess:初始的视差
CalculateScore:匹配分数
MGParamName:多重网格算法
//多重网格法:求解偏微分问题离散方程的一种快速迭代方法
*关闭图像窗口更新
dev_update_window ('off')
*关闭变量更新
dev_update_var ('off')
*关闭程序计数器更新
dev_update_pc ('off')
*关闭窗口
dev_close_window ()
*打开新窗口
dev_open_window (0, 0, 672, 484, 'black', WindowHandle)
*设置字体显示信息
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*读取左面相机采集的图像
read_image (ImageL, 'stereo/board/board_l_01')
*读取右面相机采集的图像
read_image (ImageR, 'stereo/board/board_r_01')
*获取图像的大小
get_image_size (ImageR, Width, Height)
*根据双目立体视觉标定获取到左右相机的摄像机内部参数和右相机相对左相机的位姿
*左相机的摄像机内部参数
CamParamL := [0.0130507774353,-665.817817207,1.4803417027e-5,1.48e-5,155.89225769,126.70664978,320,240]
*右相机的摄像机内部参数
CamParamR := [0.0131776504517,-731.860636733,1.47997569293e-5,1.48e-5,162.98210144,119.301040649,320,240]
*右相机相对左相机的位姿
RelPose := [0.153573364258,-0.00373362231255,0.0447351264954,0.174289124775,319.843388114,359.894955219,0]
*获取非标准外极限图像和标准外极限图像之间的变换矩阵(映射图像)
gen_binocular_rectification_map (MapL, MapR, CamParamL, CamParamR, RelPose, 1, 'geometric', 'bilinear', RectCamParL, RectCamParR, CamPoseRectL, CamPoseRectR, RectLPosRectR)
*根据变换矩阵对左边相机进行图像校正
map_image (ImageL, MapL, ImageRectifiedL)
*根据变换矩阵对右边相机进行图像校正
map_image (ImageR, MapR, ImageRectifiedR)
binocular_disparity (ImageRectifiedL, ImageRectifiedR, Disparity, Score1, 'ncc', 17, 17, 5, 0, 60, 1, 0.1, 'none', 'none')
*根据左右相机的校正图像计算深度信息
binocular_distance_mg (ImageRectifiedL, ImageRectifiedR, Distance, Score, RectCamParL, RectCamParR, RectLPosRectR, 1, 10, 5, 0, 'false', 'default_parameters', 'accurate')
*清除窗口内容
dev_clear_window ()
*显示距离图像
dev_display (Distance)
*计算IC的高度
gen_rectangle2 (IC, 107.276, 62.0363, rad(-25.6343), 7.64174, 6.41978)
gen_rectangle2 (PCB, 101.986, 145.771, rad(4.75463), 7.97698, 6.76498)
get_grayval (Distance, 107.276, 62.0363, IC_Grayval)
get_grayval (Distance, 101.986, 145.771, PCB_Grayval)
IC_Height:=(PCB_Grayval-IC_Grayval)*100
*显示结果
dev_display (ImageRectifiedL)
set_tposition (WindowHandle, 103, 54)
write_string (WindowHandle, 'IC零件的高度是:'+IC_Height+'cm')