opencv使用tbb库加速相机标定
时间: 2023-07-07 10:05:57 浏览: 331
单目标定_c++opencv单目标定_相机标定_
5星 · 资源好评率100%
OpenCV可以使用Intel的TBB(Threading Building Blocks)库进行多线程加速,从而提高相机标定的速度。以下是使用TBB库进行相机标定的基本步骤:
1. 导入OpenCV和TBB库
```c++
#include <opencv2/opencv.hpp>
#include <tbb/tbb.h>
```
2. 定义并行任务
使用TBB库的主要目的是将相机标定中的一些计算密集型任务分配到多个线程中并行计算。在这里,我们可以将每个图像的角点检测和角点坐标的提取作为一个任务。
```c++
class FindCornersTask {
public:
FindCornersTask(const cv::Mat& image, std::vector<cv::Point2f>& corners,
cv::Size pattern_size, int flags) :
image_(image), corners_(corners), pattern_size_(pattern_size), flags_(flags) {}
void operator()() const {
bool found = cv::findChessboardCorners(image_, pattern_size_, corners_, flags_);
if (found)
cv::cornerSubPix(image_, corners_, cv::Size(11, 11), cv::Size(-1, -1),
cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1));
}
private:
cv::Mat image_;
std::vector<cv::Point2f>& corners_;
cv::Size pattern_size_;
int flags_;
};
```
3. 创建并行任务列表
我们可以使用TBB的并行算法`parallel_for`来运行一组任务。下面的代码创建一个任务列表,每个任务都是使用上一步定义的`FindCornersTask`类。
```c++
std::vector<FindCornersTask> tasks;
for (int i = 0; i < image_list.size(); i++) {
tasks.push_back(FindCornersTask(image_list[i], corners[i], pattern_size, flags));
}
```
4. 运行并行任务
我们可以使用`parallel_for`算法来运行一组任务。这将自动将任务分配到可用的线程上并行执行。
```c++
tbb::parallel_for(tbb::blocked_range<size_t>(0, tasks.size()),
[&](const tbb::blocked_range<size_t>& r) {
for (size_t i = r.begin(); i != r.end(); ++i) {
tasks[i]();
}
});
```
完整的示例代码如下:
```c++
#include <opencv2/opencv.hpp>
#include <tbb/tbb.h>
class FindCornersTask {
public:
FindCornersTask(const cv::Mat& image, std::vector<cv::Point2f>& corners,
cv::Size pattern_size, int flags) :
image_(image), corners_(corners), pattern_size_(pattern_size), flags_(flags) {}
void operator()() const {
bool found = cv::findChessboardCorners(image_, pattern_size_, corners_, flags_);
if (found)
cv::cornerSubPix(image_, corners_, cv::Size(11, 11), cv::Size(-1, -1),
cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1));
}
private:
cv::Mat image_;
std::vector<cv::Point2f>& corners_;
cv::Size pattern_size_;
int flags_;
};
int main(int argc, char** argv) {
std::vector<cv::Mat> image_list;
// load images ...
int flags = cv::CALIB_CB_ADAPTIVE_THRESH + cv::CALIB_CB_NORMALIZE_IMAGE + cv::CALIB_CB_FAST_CHECK;
cv::Size pattern_size(9, 6);
std::vector<std::vector<cv::Point2f>> corners(image_list.size());
std::vector<FindCornersTask> tasks;
for (int i = 0; i < image_list.size(); i++) {
tasks.push_back(FindCornersTask(image_list[i], corners[i], pattern_size, flags));
}
tbb::parallel_for(tbb::blocked_range<size_t>(0, tasks.size()),
[&](const tbb::blocked_range<size_t>& r) {
for (size_t i = r.begin(); i != r.end(); ++i) {
tasks[i]();
}
});
// run camera calibration ...
return 0;
}
```
这样,我们就可以使用TBB库加速相机标定的过程了。需要注意的是,TBB库需要在编译时与OpenCV一起链接。
阅读全文