效果不太好且性能差
时间: 2023-07-04 18:28:02 浏览: 86
如果效果不太好且性能差,可能是由于图像分割不均匀,导致某些线程处理的时间过长,从而影响整体性能。为了解决这个问题,我们可以使用OpenCV中提供的parallel_for_函数来实现更加均匀的图像分割和线程调度。代码如下所示:
```cpp
Mat RotateMat = getRotationMatrix2D(m_pdCenter, -m_dAngle, 1);
const int num_threads = cv::getNumThreads(); // 获取当前系统可用的线程数
cv::parallel_for_(cv::Range(0, RoiMat.rows), [&](const cv::Range& range) {
for (int r = range.start; r < range.end; ++r) {
Mat RoiMat_part = RoiMat.row(r);
warpAffine(RoiMat_part, RoiMat_part, RotateMat, m_mInputMat.size(), WARP_INVERSE_MAP);
}
});
```
在这个代码中,我们首先使用cv::getNumThreads函数获取当前系统可用的线程数,并使用cv::Range来表示图像的行范围。然后,我们使用cv::parallel_for_函数来实现图像的并行处理。其中,cv::parallel_for_函数会自动将图像分割成多个部分,并使用多个线程分别处理每个部分。由于OpenCV会根据系统情况自动调整图像分割和线程调度的策略,因此可以得到更加均匀的性能。需要注意的是,由于cv::parallel_for_函数是在OpenCV中提供的,并不是C++11标准库的一部分,因此需要在代码中包含OpenCV头文件。
另外,如果您使用的是OpenCV 4.2及以上版本,还可以使用cv::parallel_for_函数的另一种形式cv::parallel_for_(),它可以接受一个lambda表达式和一个cv::BlockedRange类型的参数,从而更加方便地实现图像的并行处理。代码如下所示:
```cpp
Mat RotateMat = getRotationMatrix2D(m_pdCenter, -m_dAngle, 1);
const int num_threads = cv::getNumThreads(); // 获取当前系统可用的线程数
const cv::BlockedRange range(0, RoiMat.rows, RoiMat.rows / num_threads);
cv::parallel_for_(range, [&](const cv::BlockedRange& block_range) {
for (int r = block_range.begin(); r < block_range.end(); ++r) {
Mat RoiMat_part = RoiMat.row(r);
warpAffine(RoiMat_part, RoiMat_part, RotateMat, m_mInputMat.size(), WARP_INVERSE_MAP);
}
});
```
在这个代码中,我们使用cv::BlockedRange来表示图像的行范围,并使用cv::parallel_for_函数来实现图像的并行处理。由于cv::parallel_for_函数会根据cv::BlockedRange的大小自动分割图像,并使用多个线程分别处理每个部分,因此可以得到更加均匀的性能。