当前位置:   article > 正文

用C++和opencv详细到每一步教你实现张正友标定法求参和畸变系数_opencv 张正友

opencv 张正友

网上和有很多介绍张正友标定法原理的,但是就是没有一个教大家如何一步一步实现张正友标定求参和畸变系数的。本文就教大家如何具体实现张正友标定法。

第一步:准备黑白棋盘格,可以从网上下载,一般要求是九行六列的,这个九行六列指的是内角点的行和列。然后打印出来,这样你才能量出来每个格子的具体尺寸。虽然具体尺寸对程序的实现没有太大关系,但是会使参数更准确。

第二步:给棋盘格拍照。可以用手机拍,但是偏差会很大。实验室有海康的单目相机,博主就使用相机拍照了。一般来说,张正友标定法会要求拍数十张照片。正常放着的为一组,拍10张;换个角度,然后让纸保持不动,继续拍10张;然后再找一个角度,再拍10张;看看参数和畸变系数的差异。但是如果为了只是看看一个程序实现的过程,就很简单,只用一个角度拍4张照片就行了。

第三步: 创建一个文本文档,文件每一行为一张所拍照片的地址和名字,一定要写照片的地址和名字。

第四步:直接上代码 

#include<opencv2/opencv.hpp>
#include <iostream>
#include<vector>
#include<fstream>

//头文件一个不能少

using namespace std;
using namespace cv;

int main()

{

    //读取所有图像

    vector<Mat>imgs;

    string imageName;

    ifstream fin("E://zzy//calibdata.txt");//文本文档里面的图片也要加上地址

    while (getline(fin, imageName))

    {

        Mat img = imread(imageName);

        imgs.push_back(img);

    }

    Size board_size = Size(9, 6);

    vector<vector<Point2f>>imgsPoints;

    for (int i = 0; i < imgs.size(); i++)

    {

        Mat img1 = imgs[i];

        Mat gray1;

        cvtColor(img1, gray1, COLOR_BGR2GRAY);

        vector<Point2f>img1_points;

        findChessboardCorners(gray1, board_size, img1_points);

        find4QuadCornerSubpix(gray1, img1_points,Size(3, 3));//size()一般是(3,3)或者(55),别乱改

        bool pattern = true;

        drawChessboardCorners(img1, board_size, img1_points, pattern);

        namedWindow("img1", WINDOW_NORMAL);

        imshow("img1", img1);

        imgsPoints.push_back(img1_points);

    }

    Size squareSize = Size(20, 20);//棋盘格每个方格的真实尺寸

    vector<vector<Point3f>>objectPoints;

    for (int i = 0; i < imgsPoints.size(); i++)

    {

        vector<Point3f>tempPointSet;

        for (int j = 0; j < board_size.height; j++)

        {

            for (int k = 0; k < board_size.width; k++)

            {

                Point3f realPoint;

                realPoint.x=j*squareSize.width;

                realPoint.y = k*squareSize.height;

                realPoint.z = 0;

                tempPointSet.push_back(realPoint);

            }

        }

        objectPoints.push_back(tempPointSet);

    }

    Size imageSize;

    imageSize.width = imgs[0].cols;

    imageSize.height = imgs[0].rows;

    Mat cameraMatrix = Mat(3, 3, CV_32FC1, Scalar::all(0));

    Mat distCoeffs = Mat(1, 5, CV_32FC1, Scalar::all(0));

    vector<Mat> rvecs;

    vector<Mat> tvecs;

    calibrateCamera(objectPoints, imgsPoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, 0);

    cout << "相机的内参矩阵=" << endl << cameraMatrix << endl;

    cout << "相机的畸变系数" << distCoeffs << endl;

    waitKey(0);

    return 0;

}

最后结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/495639?site
推荐阅读
相关标签
  

闽ICP备14008679号