我在OpenCV中阅读了一些关于多线程的文章和帖子:
但我无法得到一致的答案,哪种多线程方法是正确的方法.
关于TBB,2012年的答案有5个赞成票:
使用WITH_TBB = ON时,OpenCV会尝试使用多个线程来执行某些功能.问题是目前只有一个功能强大的TBB(可能是十几个).所以,很难看到任何加速.这里的OpenCV理念是应用程序应该是多线程的,而不是OpenCV函数.[...]
关于应用程序级别的多线程,主持人对answers.opencv.org的评论:
请避免在opencv中使用自己的多线程.很多函数显然不是线程安全的.而是使用TBB或openmp支持重建opencv库.
但有3个赞成票的另一个答案是:
库本身是线程安全的,因为您可以同时多次调用库,但数据并不总是线程安全的.
所以我认为在应用程序级别上使用(多)线程至少是可以的.但是,当我的程序运行较长时间时,我遇到了奇怪的性能问题.
在研究了这些性能问题之后,我创建了这个最小,完整且可验证的示例代码:
#include "opencv2\opencv.hpp"
#include <vector>
#include <chrono>
#include <thread>
using namespace cv;
using namespace std;
using namespace std::chrono;
void blurSlowdown(void*) {
Mat m1(360, 640, CV_8UC3);
Mat m2(360, 640, CV_8UC3);
medianBlur(m1, m2, 3);
}
int main()
{
for (;;) {
high_resolution_clock::time_point start = high_resolution_clock::now();
for (int k = 0; k < 100; k++) {
thread t(blurSlowdown, nullptr);
t.join(); …Run Code Online (Sandbox Code Playgroud) 我正在制作一个操纵不同尺寸图像的程序.这些操作中的许多操作从输入读取像素数据并写入单独的输出(例如模糊).这是基于每个像素完成的.
这种图像映射在CPU上非常紧张.我想用多线程来加快速度.我该怎么做?我想要为每行像素创建一个线程.
我有几个要求:
谢谢.
有关这个主题的更多信息:C++并行化库:OpenMP与线程构建块
c++ parallel-processing optimization multithreading image-processing