#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派生类中的成员)等机制来避免这种情况的发生。