针孔相机标定opencvC++
时间: 2023-11-19 16:07:23 浏览: 115
针孔相机标定是计算机视觉中的一个重要问题,它是指通过已知的一组二维图像点和对应的三维空间点,计算出相机的内部参数矩阵和外部参数矩阵的过程。下面是使用OpenCV C++实现针孔相机标定的步骤:
1.准备标定板:选择一个标定板,例如棋盘格,然后拍摄多张包含标定板的图片。
2.提取角点:使用OpenCV的findChessboardCorners函数在每张图片中检测标定板的角点,并使用cornerSubPix函数对角点进行亚像素级别的提取。
3.建立三维空间点:根据标定板的实际尺寸和布局,建立标定板上每个角点的三维坐标。
4.进行标定:使用calibrateCamera函数计算相机的内部参数矩阵和外部参数矩阵。
下面是一个简单的OpenCV C++针孔相机标定的示例代码:
```cpp
// 准备标定板
Size boardSize = Size(9, 6);
vector<Point2f> imageCorners;
vector<Point3f> objectCorners;
vector<vector<Point2f>> image_points;
vector<vector<Point3f>> object_points;
Mat img, gray;
vector<String> filelist;
glob("calib_images/*.jpg", filelist, false);
for (size_t i = 0; i < filelist.size(); i++)
{
img = imread(filelist[i]);
cvtColor(img, gray, COLOR_BGR2GRAY);
bool found = findChessboardCorners(img, boardSize, imageCorners);
if (found)
{
cornerSubPix(gray, imageCorners, Size(5, 5), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
drawChessboardCorners(img, boardSize, imageCorners, found);
vector<Point3f> temp;
for (int i = 0; i < boardSize.height; i++)
{
for (int j = 0; j < boardSize.width; j++)
{
temp.push_back(Point3f(j, i, 0));
}
}
objectCorners.push_back(temp);
image_points.push_back(imageCorners);
object_points.push_back(objectCorners);
}
}
// 进行标定
Mat intrinsicMatrix, distortionCoeff, rvecs, tvecs;
calibrateCamera(object_points, image_points, img.size(), intrinsicMatrix, distortionCoeff, rvecs, tvecs);
```
阅读全文