基于OpenCV的单目工业相机内外参标定

开发需求:

1. 工业相机内参和畸变系数标定;

2. 工业相机外参标定,用于坐标系转换;

道具:

标定板,最好采购精度较高的玻璃标定板,自己打印的A4纸质标定板坑死我了,光是卡尺测量误差就在1mm,标定过程中还有变形;

D65光箱,有条件的话;

开发环节:

1. 工业相机内参标定

1.1  生成真实物理世界的方格点

void CameraCalibration::ComputeActualChessBoardCornersPosition(const cv::Size &boardWidthHeight, const float &boardSquareLength, std::vector &corners)
{
    for (int i = 0; i < boardWidthHeight.height; ++i)
    {
        for (int j = 0; j < boardWidthHeight.width; ++j)
        {
            corners.push_back(Point3f(j * boardSquareLength, i * boardSquareLength, 0.0f));
        }
    }
}

其中(0,0)点为坐标系原点,为什么Z轴赋值为0,是为了优化计算,请参考《learning opencv》中文版 p421。

1.2 计算内参和畸变系数注意事项

一般工业相机不需要鱼眼这种的标定,这样可以让内参k3 = 0,在设置int flag |= CALIB_FIX_K3, 输出设置4个值,如cv::Mat _distortionCoefficients(Mat::zeros(4,1, CV_64F));

1.3 标定过程注意事项

标定过程中要旋转移动标定板,动作幅度不要太大,图片模糊或者光线明显不均匀需要去除;

标定过程中,相同相机多次采集图片,重复标定的结果都会不太一样,重投影误差在0.2左右就可以认为标定结果可以使用了。

2. 外参标定

外参标定过程中,我最担心是真实物理世界的object corners的坐标原点和识别出来的image corners的坐标原点不会总是能够对应,这样多次标定就不具备重复性。

所幸使用上一步内参和畸变系数矫正图片后,使用最常用的cv::solvePnPRansac每次坐标原点都是一样的,见下图。

下一步就是相机坐标系的转换了,参考链接1就可以变换坐标系了。

参考1:https://blog.csdn.net/shenxiaolu1984/article/details/50165635

你可能感兴趣的:(camera)