跳转到内容
新建笔记

多线程&并行

#include <iostream>
#include <thread>
#include <opencv2/opencv.hpp>
void processImage(cv::Mat image)
{
// 图像处理代码
// ...
std::cout << "Processed image." << std::endl;
}
int main()
{
// 加载图像
cv::Mat image1 = cv::imread("image1.jpg");
cv::Mat image2 = cv::imread("image2.jpg");
// 创建两个线程来处理图像
std::thread thread1(processImage, image1);
std::thread thread2(processImage, image2);
// 等待线程结束
thread1.join();
thread2.join();
return 0;
}

在上面的示例中,我们通过std::thread类创建了两个线程,每个线程都调用processImage函数来处理一个图像。join函数用于等待线程结束。通过使用多线程,我们可以同时处理两个图像,从而减少了处理时间。

需要注意的是,在使用多线程处理图像时,应避免对同一个图像进行并发访问,以免引发数据竞争和不一致的结果。可以使用互斥锁(std::mutex)等同步机制来保护共享资源的访问。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/parallel/parallel.hpp>
void processImage(cv::Mat image, int start, int end)
{
// 图像处理代码,只处理[start, end)范围内的像素
// ...
std::cout << "Processed image part from " << start << " to " << end << std::endl;
}
int main()
{
// 加载图像
cv::Mat image = cv::imread("image.jpg");
// 定义并行处理任务
cv::Size imageSize = image.size();
int numTasks = 4; // 并行处理任务数量
int taskSize = imageSize.height / numTasks; // 每个任务处理的行数
// 并行处理图像
cv::parallel_for_(cv::Range(0, numTasks), [&](const cv::Range& range)
{
int start = range.start * taskSize;
int end = range.end * taskSize;
// 最后一个任务处理剩余的行
if (range.end == numTasks - 1)
end = imageSize.height;
processImage(image, start, end);
});
return 0;
}

在上面的示例中,我们将图像的处理工作分成了多个任务,每个任务处理一行或多行像素。使用cv::parallel_for_函数可以并行执行这些任务,从而加快处理速度。

需要注意的是,并行处理时需要避免对共享资源(如图像的像素)进行并发访问,以免引发数据竞争。可以使用线程局部存储(cv::parallel_for_的cv::SimpleParallelLoopBody派生类中的成员)等机制来避免这种情况的发生。