halcon的标定助手生成的代码注释,部分变量做了全局处理
- 相机参数初始化
/// <summary>
/// 相机参数初始化
/// </summary>
/// <param name="focalLength">焦距,单位:mm</param>
/// <param name="cellWidth">像素宽度,单位:um</param>
/// <param name="cellHeigth">像素高度,单位:um</param>
/// <param name="width">分辨率宽度,单位:像素</param>
/// <param name="heigth">分辨率高度,单位:像素</param>
public void ParamInit(double focalLength, double cellWidth, double cellHeigth, int width, int heigth)
{
//相机参数初始化
startParameters = new HTuple();
startParameters[0] = focalLength/1000.0;//焦距此处单位为m,需要转换
startParameters[1] = 0; //畸变参数,初始为0
startParameters[2] = cellWidth/1000000.0; //像素宽度
startParameters[3] = cellHeigth / 1000000.0; //像素高度
startParameters[4] = width/2;
startParameters[5] = heigth/2;
startParameters[6] = width;
startParameters[7] = heigth;
}
- 列表内容
// 本地图形变量
HObject ho_Image = null, ho_TmpObj_PlateRegion = null;
//本地控制变量
HTuple hv_TmpCtrl_AllMarkRows = null;
HTuple hv_TmpCtrl_AllMarkColumns = null, hv_TmpCtrl_StartPoses = null;
HTuple hv_TmpCtrl_ReferenceIndex = 0;//位姿图片序号选择
HTuple hv_TmpCtrl_MarkRows = new HTuple();
HTuple hv_TmpCtrl_MarkColumns = new HTuple(), hv_TmpCtrl_EstimatedPose = new HTuple();
HTuple hv_TmpCtrl_X = null, hv_TmpCtrl_Y = null, hv_TmpCtrl_Z = null;
HTuple hv_TmpCtrl_FinalPoses = null;
//图形变量初始化
ho_Image.GenEmptyObj();
ho_TmpObj_PlateRegion.GenEmptyObj();
if(imageFiles.Count==0)
{
throw new Exception("标定图片信息异常");
}
for (int hv_Index = 0; hv_Index < imageFiles.Count;hv_Index++)
{
//读取图片
HOperatorSet.ReadImage(out ho_Image, imageFiles[hv_Index]);
//提取图像Images中标定板上的圆形标志来确定标定板的有效区域
HOperatorSet.FindCaltab(
ho_Image,
out ho_TmpObj_PlateRegion, //有效区域
plateDescription,//标定板描述文件
3, //高斯滤波器大小,可选参数:0, 3, 5, 7, 9, 11, 'gap_tolerance'
112, //标记提取的阈值,可选参数:48, 64, 80, 96, 112, 128, 144, 160, 0.5, 0.9, 1.0, 1.1, 1.5
5);//标定板上孔的最小直径,可选参数: 3, 5, 9, 15, 30, 50, 70
//确定标定板上圆形标志点的二维坐标,并得到摄像机外部参数的初始值
HOperatorSet.FindMarksAndPose(
ho_Image,
ho_TmpObj_PlateRegion, //有效区域
plateDescription,//描述文件
startParameters, //相机参数
128, //轮廓检测的初始阈值,可选参数:80, 96, 112, 128, 144, 160
10, //循环值,用于与轮廓检测的初始阀值,可选参数:6, 8, 10, 12, 14, 16, 18, 20, 22
18, //轮廓检测的最小阈值,可选参数: 8, 10, 12, 14, 16, 18, 20, 22
0.9, //轮廓检测的过滤参数,建议值:0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1
15, //标记轮廓的最小长度,建议值:10.0, 15.0, 20.0, 30.0, 40.0, 100.0
100, //标记的最大预期直径,建议值:50.0, 100.0, 150.0, 200.0, 300.0
out hv_TmpCtrl_MarkRows,//Mark行坐标序列
out hv_TmpCtrl_MarkColumns,//Mark列坐标序列
out hv_TmpCtrl_EstimatedPose);//相机姿态数据
//保存坐标值
hv_TmpCtrl_AllMarkRows = hv_TmpCtrl_AllMarkRows.TupleConcat(hv_TmpCtrl_MarkRows);
hv_TmpCtrl_AllMarkColumns = hv_TmpCtrl_AllMarkColumns.TupleConcat(hv_TmpCtrl_MarkColumns);
hv_TmpCtrl_StartPoses = hv_TmpCtrl_StartPoses.TupleConcat(hv_TmpCtrl_EstimatedPose);
}
//标定板描述文件读出坐标序列
HOperatorSet.CaltabPoints(plateDescription, out hv_TmpCtrl_X, out hv_TmpCtrl_Y,
out hv_TmpCtrl_Z);
//确定摄像机的内参,误差分析
HOperatorSet.CameraCalibration(hv_TmpCtrl_X, hv_TmpCtrl_Y, hv_TmpCtrl_Z, hv_TmpCtrl_AllMarkRows,
hv_TmpCtrl_AllMarkColumns, startParameters, hv_TmpCtrl_StartPoses, "all",
out cameraParameters, out hv_TmpCtrl_FinalPoses, out errors);
//标定板位姿数组选择
HOperatorSet.TupleSelectRange(hv_TmpCtrl_FinalPoses, 7 * hv_TmpCtrl_ReferenceIndex,
(7 * hv_TmpCtrl_ReferenceIndex) + 6, out cameraPose);
//依据标定板位姿及厚度调整原点
HOperatorSet.SetOriginPose(cameraPose, 0.0, 0.0, thickness/1000.0, out cameraPose);