源代码来自Halcon:3d_vision/camera_calibration_internal。翻译成C#语言,担心自己搞忘了,所以贴出来,最主要贴出图像,一步步分析,也是再熟悉的过程。
代码主要目的:根据已有的10张图像,生成一个相机标定文件。
生成相机标定文件需分几步:
1)生成一个标定数据模板(create_calib_data):指定相机数量和标定对象的数量;
2)设置相机类型及初始相机参数(set_calib_data_cam_param):注意到,只有相机类型相同才能实现一步标定;
3)指定标定对象的描述(set_calib_data_calib_object);
4)收集观察数据(find_calib_object 或者set_calib_data_observ_points):
5)设置标定过程。
下面分别实现:
A)创建标定模板:
//Create a HALCON calibration data model
HOperatorSet.CreateCalibData("calibration_object", 1, 1, out calibDataID);
"calibration_object"表示常量,1个相机,1个标定板;
B)设置相机初始参数:
startCamPar = Gen_Cam_Par_Area_Scan_Division(0.016, 0, 0.0000074, 0.0000074, 326, 247, 652, 494);
HOperatorSet.SetCalibDataCamParam(calibDataID, 0, "", startCamPar);
focus(0.016)=焦距,Kappa(0)=变形系数;Sx,Sy(0.0000074,0.0000074)比例系数,表示相机底片上相邻两个颗粒的水平和竖直的距离;Cx,Cy(326,247)辐射变形的中心位置,常用图像的半幅宽高作为初始值;imageWidth,imageHeight(652,494)表示图像的高宽;
其中生成相机参数元祖表示为:
//Generate a camera parameter tuple for an area scan camera with distortions modeled by the division model.
public HTuple Gen_Cam_Par_Area_Scan_Division(HTuple focus, HTuple kappa, HTuple sx, HTuple sy,
HTuple cx, HTuple cy, HTuple imageWidth, HTuple imageHeight)
{
HTuple cameraParam;
cameraParam = new HTuple();
cameraParam[0] = "area_scan_division";
cameraParam = cameraParam.TupleConcat(focus);
cameraParam = cameraParam.TupleConcat(kappa);
cameraParam = cameraParam.TupleConcat(sx);
cameraParam = cameraParam.TupleConcat(sy);
cameraParam = cameraParam.TupleConcat(cx);
cameraParam = cameraParam.TupleConcat(cy);
cameraParam = cameraParam.TupleConcat(imageWidth);
cameraParam = cameraParam.TupleConcat(imageHeight);
return cameraParam;
}
C)指定描述:
//Define a calibration object in a calibration model
HOperatorSet.SetCalibDataCalibObject(calibDataID, 0, "caltab_30mm.descr");
D)收集数据:依次读取10张图像并提取标定点及标定区域;
//Find the HALCON calibration plate and set the extracted points and contours in a calibration data model
HOperatorSet.FindCalibObject(hImg[i - 1], calibDataID, 0, 0, i, "skip_find_caltab", "false");
//Get contour-based observation data from a calibration data model
HOperatorSet.GetCalibDataObservContours(out caltab, calibDataID, "caltab", 0, 0, i);
E)生成标定结果:
//Determine all camera parameters by a simultaneous minimization process
HOperatorSet.CalibrateCameras(calibDataID, out error);
//Query data stored or computed in a calibration data model
HOperatorSet.GetCalibData(calibDataID, "camera", 0, "params", out camParam);
// Write internal camera parameters into a file
HOperatorSet.WriteCamPar(camParam, "camera_parameters.dat");
下面为程序的开始界面:
标定到第三张的界面:
左边图像中绿色表示D)中caltab对象的显示结果,右边是对应的单独的对象显示;
标定到第十张:
最终会生成一个camParam文件:camera_parameters.dat。
C#源代码。