opencv-tbb 相机标定
时间: 2023-06-30 08:03:48 浏览: 167
基于OpenCV-Python 相机标定及矫正,张正友相机标定法
OpenCV-TBB 是 OpenCV 库的一个拓展,它使用了 Intel 的 TBB(Threading Building Blocks)库来实现多线程加速。相机标定是计算机视觉中的一个重要问题,它的目的是确定相机的内部参数和外部参数,以便进行准确的三维重建和测量。在 OpenCV 中,可以使用 calibrateCamera 函数来进行相机标定。使用 TBB 加速相机标定的方法如下:
1. 安装 TBB 库,可以从 Intel 的官网下载。
2. 在 OpenCV 中使用 TBB 加速需要编译 OpenCV 库时开启 TBB 选项。
3. 在代码中使用 TBB 的 parallel_for 函数来并行化计算。具体来说,可以将每一幅图片的标定任务分配给不同的线程进行计算,这样可以大大加快计算速度。
下面是一个简单的示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/core/affine.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <tbb/tbb.h>
using namespace std;
using namespace cv;
using namespace tbb;
int main()
{
// 加载图片
vector<string> filenames;
glob("*.jpg", filenames);
vector<Mat> images;
for (auto filename : filenames) {
Mat image = imread(filename);
images.push_back(image);
}
// 设置标定板参数
Size boardSize(6, 9);
float squareSize = 1.0f;
// 检测标定板角点
vector<vector<Point2f>> corners(images.size());
parallel_for(blocked_range<int>(0, images.size()), [&](const blocked_range<int>& range) {
for (int i = range.begin(); i != range.end(); ++i) {
Mat gray;
cvtColor(images[i], gray, COLOR_BGR2GRAY);
bool found = findChessboardCorners(gray, boardSize, corners[i]);
if (found) {
cornerSubPix(gray, corners[i], Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
}
}
});
// 设置标定板世界坐标系
vector<vector<Point3f>> objectPoints(1);
for (int y = 0; y < boardSize.height; ++y) {
for (int x = 0; x < boardSize.width; ++x) {
objectPoints[0].push_back(Point3f(x * squareSize, y * squareSize, 0));
}
}
// 标定相机
Mat cameraMatrix, distCoeffs;
vector<Mat> rvecs, tvecs;
calibrateCamera(objectPoints, corners, images[0].size(), cameraMatrix, distCoeffs, rvecs, tvecs);
return 0;
}
```
在这个代码中,我们使用了 TBB 的 parallel_for 函数来并行化检测标定板角点的任务。由于每一幅图片的处理是相互独立的,因此可以将它们分配给不同的线程来计算。
阅读全文