1、
二值化算法经过测试后基本可以,但是在运动中会出现无法检测特征图像的地方,另外执行的速度还是不快。因为代码中有两个双层嵌套的for循环,这是给遍历图像用的。为了优化for循环遍历像素占用的时间,我的实验过程如下:
2、
我在网上查询到可以用opencv 的LUT查表法来简化遍历像素的时间,这个可以比指针快,后来经过阅读了一定网上的资料,才发现利用LUT必须知道原图像与目标图像像素的对应才能实现。
3、
#pragma omp parallel for:这里用到了openMP:就是在对应的for循环前加上#pragma,同时开启openMP支持.
建议:把循环次数多的放在内存可以减少代码运行的时间。
4、
c:parallel_for:这里用到了intel TBB的并行开发原理,就是在使用这个函数来实现for循环的时候,它可以将for循环分给几个内核来处理,可以大大减少程序运行的时间。但是在我配置好的之后,我做了一下测试,发现不用parallel_for程序执行的时间反而更短,但是CPU的占用率确实100%,这是我百思不得其解.
5、
在查找了大量的文献之后,我发现了一个大问题,更具opencv的官方answer显示,parallel_for是serial loop,而parallel_for_才是真正的parallel loop。
6、
在编程的过程中,我为了检验parallel_for_的循环次数是否正确,我在循环中加入了count++;结果令我感到诧异的是,count的值竟然和我给的循环次数不一样。在这个难题上,我花费了大量的时间来查找原因。在经过一定的研究后,我发现了问题:在并行开发中,有多个内核来执行count++的语句,但由于速度过快,导致当count被放一个核到累加器A中的时候,另一个核也要用这个变量,这就出现了问题,问题的现象目前是count的累加次数减少,具体问题还待研究。
7、
验证:为了验证e的结论是否正确,你可以在你的count++的前后加一个进程锁将多核转变为单核,你会发现结果的正确性。
时间匆忙代码以后补上