张正友相机标定,opencv中calibrate函数内部具体实现过程附具体代码(四)-----利用优化后的内外参、畸变系数矫正整个图像

张正友相机标定,opencv中calibrate函数内部具体实现过程附具体代码(四)-----利用优化后的内外参、畸变系数矫正整个图像

  • 先甩一个锅
  • 直接上代码

先甩一个锅

由于导师安排了新任务,这个进行不下去了,直接跳到最后矫正图像部分,求解畸变系数和第二次优化过程相似,请读者发挥足够大的想象空间~代码也会传到csdn上
https://download.csdn.net/download/weixin_38907150/10936389

直接上代码

int main(){
    // -------------------对标定结果进行评价------------------------------
    double total_err = 0.0;         /* 所有图像的平均误差的总和 */
    double err = 0.0;               /* 每幅图像的平均误差 */
    vector<Point2f> image_points2;  /* 保存重新计算得到的投影点 */
    fout<<"每幅图像的标定误差:\n";

    for (int i=0;i<image_count;i++)//第几张图片
    {
        vector<Point3f> tempPointSet = object_points[i];

        /* 通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的投影点 */
        projectPoints(tempPointSet, tvecsMat[i],rvecsMat[i],  cameraMatrix, distCoeffs, image_points2);

        /* 计算新的投影点和旧的投影点之间的误差*/
        vector<Point2f> tempImagePoint = image_points_seq[i];
        Mat tempImagePointMat = Mat(1, tempImagePoint.size(), CV_32FC2);
        Mat image_points2Mat = Mat(1, image_points2.size(), CV_32FC2);

        for (int j = 0 ; j < tempImagePoint.size(); j++)
        {
            image_points2Mat.at<Vec2f>(0,j) = Vec2f(image_points2[j].x, image_points2[j].y);
            tempImagePointMat.at<Vec2f>(0,j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);
        }
        err = norm(image_points2Mat, tempImagePointMat, NORM_L2);
        total_err += err/= point_counts[i];
        fout << "第" << i+1 << "幅图像的平均误差:" << err<< "像素" << endl;
    }
    fout << "总体平均误差:" << total_err/image_count << "像素" <<endl <<endl;

    //-------------------------评价完成---------------------------------------------


    //-----------------------保存定标结果-------------------------------------------
    Mat rotation_matrix = Mat(3,3,CV_32FC1, Scalar::all(0));  /* 保存每幅图像的旋转矩阵 */
    fout << "相机内参数矩阵:" << endl;
    fout << cameraMatrix << endl << endl;
    fout << "畸变系数:\n";
    fout << distCoeffs << endl << endl << endl;
    for (int i=0; i<image_count; i++)
    {
        fout << "第" << i+1 << "幅图像的旋转向量:" << endl;
        fout << tvecsMat[i] << endl;

        /* 将旋转向量转换为相对应的旋转矩阵 */
        Rodrigues(tvecsMat[i], rotation_matrix);
        fout << "第" << i+1 << "幅图像的旋转矩阵:" << endl;
        fout << rotation_matrix << endl;
        fout << "第" << i+1 << "幅图像的平移向量:" << endl;
        fout << rvecsMat[i] << endl << endl;
    }
    fout<<endl;

    //--------------------标定结果保存结束-------------------------------

    //---------------------------------查看标定效果——利用标定结果对棋盘图进行矫正-----

    Mat mapx = Mat(image_size, CV_32FC1);
    Mat mapy = Mat(image_size, CV_32FC1);
    Mat R = Mat::eye(3, 3, CV_32F);
    string imageFileName;
    std::stringstream StrStm;
    for (int i = 0 ; i != image_count ; i++)
    {
        initUndistortRectifyMap(cameraMatrix, distCoeffs, R, cameraMatrix, image_size, CV_32FC1, mapx, mapy);
        Mat imageSource = imread(filenames[i]);
        Mat newimage = imageSource.clone();
        remap(imageSource, newimage, mapx, mapy, INTER_LINEAR);
        StrStm.clear();
        imageFileName.clear();
        StrStm << i+1;
        StrStm >> imageFileName;
        imageFileName += "_d.jpg";
        imwrite(imageFileName, newimage);

    }

    fin.close();
    fout.close();
    return 0;
}
}

转载请注明出处。
欢迎交流学习。

你可能感兴趣的:(学习笔记)