opencv之并行计算多线程parallel_for_

复制代码
 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3 #include <numeric> // std::iota 
 4 
 5 const int g_num = 1000;
 6 
 7 void my_test1(double* p_arr)
 8 {
 9     for (size_t i = 0; i < g_num; i++)
10     {
11         int p_arr_i = p_arr[i];
12         for (size_t j = 0; j < g_num; j++)
13         {
14              double num1 = p_arr_i * (j > 10 ? 10 : j);
15              double num2 = std::pow(num1, 2);
16              double num3 = std::sqrt(num2);
17              p_arr[i] = num3;
18              p_arr[i] = p_arr_i * num3;
19              p_arr[i] = p_arr[i] / num3;
20         }
21     }
22 }
23 
24 void my_test2(double* p_arr)
25 {
26     
27     parallel_for_(Range(0, g_num), [&](const Range& r)
28         {
29             for (int oc = r.start; oc < r.end; oc++)
30             {
31                 // 类似于核函数部分
32                 int p_arr_i = p_arr[oc];
33                 for (size_t j = 0; j < g_num; j++)
34                 {
35                     double num1 = p_arr_i * (j > 10 ? 10 : j);
36                     double num2 = std::pow(num1, 2);
37                     double num3 = std::sqrt(num2);
38                     p_arr[oc] = num3;
39                     p_arr[oc] = p_arr_i * num3;
40                     p_arr[oc] = p_arr[oc] / num3;
41                 }
42             }
43         });
44 }
45 
46 int main()
47 {
48     double numbers[g_num];
49     int st = 0;
50     std::iota(numbers, numbers + g_num, st); // 100 101 102 103 
51 
52 
53 
54 
55     double t = (double)getTickCount();
56     my_test1(numbers);
57     t = (double)getTickCount() - t;
58 
59     double t2 = (double)getTickCount();
60     my_test2(numbers);
61     t2 = (double)getTickCount() - t2;
62 
63     printf("conv3x3 time = %.1fms\n", t * 1000 / getTickFrequency());
64     printf("conv3x3_parallel time = %.1fms\n", t2 * 1000 / getTickFrequency());
65 
66 
67     
68     system("pause");
69     return 0;
70 }

任务必须足够复杂再有加速效果,例如:每个像素+1这种简单的任务,还不如for循环单线程快

使用简单,无非就是把适合并行的"核函数"部分写到合适位置,例如:

复制代码
parallel_for_(Range(0, g_num), [&](const Range& r)
        {
            for (int oc = r.start; oc < r.end; oc++)
            {
                // 类似于核函数部分
                int p_arr_i = p_arr[oc];
                for (size_t j = 0; j < g_num; j++)
                {
                    double num1 = p_arr_i * (j > 10 ? 10 : j);
                    double num2 = std::pow(num1, 2);
                    double num3 = std::sqrt(num2);
                    p_arr[oc] = num3;
                    p_arr[oc] = p_arr_i * num3;
                    p_arr[oc] = p_arr[oc] / num3;
                }
            }
        });

文心一言回答

opencv多线程

是的,OpenCV提供了多线程处理的API。从OpenCV 4.5版本开始,它引入了对C++11标准的并行算法的支持。这意味着你可以使用多线程来加速你的OpenCV代码。

在OpenCV中,你可以使用parallel::ThreadPool类来创建和管理线程池。这个类提供了一种简单的方法来分配任务并在线程池中并行执行它们。

下面是一个简单的示例代码,演示了如何使用OpenCV的线程池:

cpp复制代码

复制代码
 1 #include <opencv2/opencv.hpp>  
 2 #include <opencv2/core.hpp>  
 3 #include <opencv2/highgui.hpp>  
 4 #include <opencv2/imgproc.hpp>  
 5 #include <opencv2/parallel/thread_pool.hpp>  
 6   
 7 using namespace cv;  
 8 using namespace cv::parallel;  
 9   
10 int main()  
11 {  
12     // 创建一个线程池,包含4个线程  
13     ThreadPool pool(4);  
14   
15     // 加载图像  
16     Mat image = imread("example.jpg");  
17   
18     if (image.empty()) {  
19         std::cerr << "Could not load image file." << std::endl;  
20         return -1;  
21     }  
22   
23     // 将图像传递给线程池中的任务进行并行处理  
24     pool.enqueueJob([&](int) {  
25         // 在这里对图像进行处理,例如进行灰度转换  
26         cvtColor(image, image, COLOR_BGR2GRAY);  
27     });  
28   
29     // 等待所有任务完成  
30     pool.waitAll();  
31   
32     // 显示处理后的图像  
33     imshow("Processed Image", image);  
34     waitKey(0);  
35   
36     return 0;  
37 }

在上面的示例中,我们创建了一个包含4个线程的线程池,并将图像传递给线程池中的任务进行并行处理。每个任务对图像进行灰度转换操作。然后我们等待所有任务完成,并显示处理后的图像。

需要注意的是,多线程处理可能会引入一些额外的开销,包括线程创建和管理、数据同步等。因此,在使用多线程之前,你需要仔细评估你的应用场景和代码性能,并根据实际情况进行调整和优化。

相关推荐
学术小八32 分钟前
2025年人工智能、虚拟现实与交互设计国际学术会议
人工智能·交互·vr
仗剑_走天涯2 小时前
基于pytorch.nn模块实现线性模型
人工智能·pytorch·python·深度学习
cnbestec3 小时前
协作机器人UR7e与UR12e:轻量化设计与高负载能力助力“小而美”智造升级
人工智能·机器人·协作机器人·ur协作机器人·ur7e·ur12e
zskj_zhyl3 小时前
毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线
人工智能·安全·重构
gaosushexiangji4 小时前
利用sCMOS科学相机测量激光散射强度
大数据·人工智能·数码相机·计算机视觉
ai小鬼头5 小时前
AIStarter新版重磅来袭!永久订阅限时福利抢先看
人工智能·开源·github
说私域5 小时前
从品牌附庸到自我表达:定制开发开源AI智能名片S2B2C商城小程序赋能下的营销变革
人工智能·小程序
飞哥数智坊6 小时前
新版定价不够用,Cursor如何退回旧版定价
人工智能·cursor
12点一刻6 小时前
搭建自动化工作流:探寻解放双手的有效方案(2)
运维·人工智能·自动化·deepseek
未来之窗软件服务6 小时前
东方仙盟AI数据中间件使用教程:开启数据交互与自动化应用新时代——仙盟创梦IDE
运维·人工智能·自动化·仙盟创梦ide·东方仙盟·阿雪技术观