opencv-tbb 相机标定
时间: 2023-06-30 07:03:32 浏览: 168
OpenCV中提供了使用TBB(Threading Building Blocks)库来加速相机标定的方法。TBB是一个开源的C++跨平台并发性库,旨在使并行编程更加容易,高效和可伸缩。
下面是使用TBB库进行相机标定的步骤:
1. 导入必要的头文件和命名空间:
```c++
#include <opencv2/opencv.hpp>
#include <opencv2/core/parallel.hpp>
using namespace cv;
using namespace cv::detail; // 标定相关的命名空间
```
2. 定义标定所需的变量:
```c++
Mat cameraMatrix; // 相机内参矩阵
Mat distCoeffs; // 畸变参数
std::vector<Mat> rvecs, tvecs; // 旋转矩阵和平移矩阵
```
3. 加载标定板图像:
```c++
std::vector<std::vector<Point2f>> imagePoints; // 图像点集
std::vector<std::vector<Point3f>> objectPoints; // 对应的世界坐标点集
Size boardSize(9, 6); // 棋盘格大小
float squareSize = 1.f; // 格子大小
std::vector<String> filenames; // 存放图像文件名的向量
glob("path/to/images/*.jpg", filenames); // 加载所有图像文件
for (size_t i = 0; i < filenames.size(); ++i) {
Mat image = imread(filenames[i]); // 读取一张图像
std::vector<Point2f> corners; // 存放检测到的角点坐标
bool found = findChessboardCorners(image, boardSize, corners,
CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE | CALIB_CB_FAST_CHECK);
if (found) {
cornerSubPix(image, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
imagePoints.push_back(corners); // 存储图像点集
std::vector<Point3f> obj; // 生成世界坐标点集
for (int j = 0; j < boardSize.height; ++j) {
for (int k = 0; k < boardSize.width; ++k) {
obj.push_back(Point3f(k * squareSize, j * squareSize, 0));
}
}
objectPoints.push_back(obj); // 存储世界坐标点集
}
}
```
4. 调用TBB库进行标定:
```c++
double rms = parallelCalibrateCamera(objectPoints, imagePoints, image.size(), cameraMatrix, distCoeffs, rvecs, tvecs, CALIB_FIX_ASPECT_RATIO | CALIB_FIX_PRINCIPAL_POINT | CALIB_FIX_K4 | CALIB_FIX_K5, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, DBL_EPSILON));
```
参数说明:
- `objectPoints`:世界坐标点集;
- `imagePoints`:图像坐标点集;
- `image.size()`:图像尺寸;
- `cameraMatrix`:相机内参矩阵;
- `distCoeffs`:畸变参数;
- `rvecs`:旋转矩阵;
- `tvecs`:平移矩阵;
- `CALIB_FIX_ASPECT_RATIO | CALIB_FIX_PRINCIPAL_POINT | CALIB_FIX_K4 | CALIB_FIX_K5`:标定参数,限制相机内参矩阵的纵横比、主点坐标以及畸变参数k4和k5不变;
- `TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, DBL_EPSILON)`:停止标定的条件,当迭代次数达到100次或者精度达到double类型的最小精度时停止。
5. 输出标定结果:
```c++
std::cout << "RMS error: " << rms << std::endl;
std::cout << "Camera matrix:\n" << cameraMatrix << std::endl;
std::cout << "Distortion coefficients: " << distCoeffs << std::endl;
```
这样,使用TBB库进行相机标定的过程就完成了。
阅读全文
相关推荐















