Halcon: Camera Calibration Internal

源代码来自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");

下面为程序的开始界面:

Halcon: Camera Calibration Internal_第1张图片

标定到第三张的界面:

Halcon: Camera Calibration Internal_第2张图片

左边图像中绿色表示D)中caltab对象的显示结果,右边是对应的单独的对象显示;

标定到第十张:

Halcon: Camera Calibration Internal_第3张图片

最终会生成一个camParam文件:camera_parameters.dat。

C#源代码。


你可能感兴趣的:(Halcon)