系列文章目录
巧了,第一篇,目前什么都没有
前言
毕竟成为了高贵的算法工程师,还是要对代码稍微有点要求。其实目前很多东西还在复制粘贴阶段,这就是传说中的CV工程师吧,爱了爱了。
一、OPENMP并行加速
最近在做一个三维的检测项目,算法开发完发现速度还是有些慢。本来就是调用PCL和OPENCV做的,简单看起来没什么加速的内容了。
然后就发现了openMP这个还不错的东西,目前使用的功能很简单,就是在for循环之前加指令让for循环并行。步骤如下:
1.开启openMP
主要介绍在VS中和Cmake中开启
Visual Studio:
在项目上右键然后在c/c++中语言选项开启OpenMP支持即可
Cmake:
添加上述语句即可,测试以后发现还是在Cmake里加运行更快,无法证实且不明原因,就留下这个疑似谣言吧。
2.指令及注意事项
int number_Porcs = omp_get_num_procs();
cout << "procs:" << number_Porcs << endl;
#pragma omp parallel for num_threads(8)
for (int i = 0; i < Box_list.size(); i++) {
FasteningRes fasteningRes_temp;
//单个扣件检测算法
DetectionElasticBar(img_input, Box_list[i].box, Box_list[i].isleft, class_n_, image_path, fasteningRes_temp);
//添加单个扣件检测结果到结果队列
res[i] = fasteningRes_temp;
}
#progma那条就是并行指令了,可以指定线程数,omp_get_num_procs()可以获取你电脑有几个线程。
其实还是有蛮多指令的,但我感觉精髓就是这个。
然后使用起来需要保证for循环内的结构块互不干扰,比如我的FasteningRes就在for内声明,要是在外部声明就是被共用了,会有问题。
然后最后本来是要用push_back()加到vector里,但OpenMP不能用pushback,所以我在之前加了个循环,先pushback进去,在在这边当数组用就可以了。
二、PCL直通滤波与法向量加速
1.直通滤波
有个震惊的发现,通过passthrough进行直通滤波居然比直接for循环滤波还慢大约6倍以上。以下为简单的时间对比,希望对大家有帮助:
我都不想看了,嘛回事儿?
2.法向量计算
当然,实测没差这么多,就差一倍。懒得细写,就这样喽。