九点法标定原理以及C++代码
时间: 2023-07-11 20:30:41 浏览: 259
九点标定 opencv 方式实现 手眼标定
九点法标定是一种常用的相机标定方法,它通过将相机在不同位置下对同一平面进行拍摄,采集到的图像信息来计算出相机的内参矩阵和外参矩阵,从而建立相机的几何模型。在进行九点法标定时,需要先在拍摄平面上放置一个已知大小的标定板,通过提取标定板上的角点坐标,并将其与世界坐标系中对应的角点坐标进行匹配,从而得到相机的内参矩阵和外参矩阵。
下面是使用C++实现九点法标定的代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 设置标定板参数
Size boardSize(9, 6); // 内角点个数
float squareSize = 24.23f; // 标定板上每个格子的大小,单位为mm
// 准备标定板上的角点坐标
vector<Point3f> objectPoints;
for (int i = 0; i < boardSize.height; i++)
{
for (int j = 0; j < boardSize.width; j++)
{
objectPoints.push_back(Point3f(j * squareSize, i * squareSize, 0));
}
}
// 读取标定图像
vector<vector<Point2f>> imagePoints;
vector<String> filenames;
glob("images/*.jpg", filenames); // 读取images文件夹下所有jpg格式的图像
for (size_t i = 0; i < filenames.size(); i++)
{
Mat image = imread(filenames[i]);
vector<Point2f> corners;
bool found = findChessboardCorners(image, boardSize, corners);
if (found)
{
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
imagePoints.push_back(corners);
drawChessboardCorners(image, boardSize, corners, found);
imshow("image", image);
waitKey(500);
}
}
// 进行标定
Mat cameraMatrix, distCoeffs;
vector<Mat> rvecs, tvecs;
calibrateCamera(objectPoints, imagePoints, Size(640, 480), cameraMatrix, distCoeffs, rvecs, tvecs);
// 输出标定结果
cout << "camera matrix:\n" << cameraMatrix << endl;
cout << "distortion coefficients:\n" << distCoeffs << endl;
return 0;
}
```
在上述代码中,我们先设置了标定板的参数,包括内角点个数和每个格子的大小。然后准备了标定板上的角点坐标,用于与提取出的图像角点进行匹配。接着使用`glob`函数读取指定文件夹下的所有图像,并在每张图像中提取出标定板的角点坐标。对于每个角点坐标,使用`cornerSubPix`函数进行亚像素级别的精细化处理。最后,使用`calibrateCamera`函数进行相机标定,并输出标定结果。
需要注意的是,在进行九点法标定时,需要保证标定板的姿态不变,因此在拍摄过程中需要尽可能保持相机与标定板的相对位置和姿态不变。同时,为了提高标定的准确性,最好使用多张图像进行标定,且图像中的标定板应该尽可能覆盖整个图像。
阅读全文