我正在研究一个c ++程序,它使用OpenCv来分析来自WebCam的视频并进行一些运动跟踪(最终目标试图为学校项目建立一个自动化的airsoft senty炮塔!)
我正在尝试对我的处理进行一些优化,以便在分析视频时获得最高的帧速率。我尝试使用OpenMp进行并行处理,但我很难用我的代码将它放到位。这里有一个循环,我想使用Openmp。
Mat differenceImage(frame1.size(), CV_8UC1);
long long* pf1 = reinterpret_cast<long long*>(grayImage1.ptr());
long long* pf2 = reinterpret_cast<long long*>(grayImage2.ptr());
long long* pf3 = reinterpret_cast<long long*>(differenceImage.ptr());
long long* pfe = pf1 + grayImage1.size().width*grayImage1.size().height * sizeof(uchar) / 8;
long long a, b, r1, r2, r3, r4, r5, r6, r7, r8, s1, s2, s3, s4, s5, s6, s7, s8, t1, t2, t3, t4, t5, t6, t7, t8;
while (pf1 < pfe) {
a = *pf1;
b = *pf2;
s1 = a & 0xFF00000000000000 >> 56;
s2 = a & 0x00FF000000000000 >> 48;
s3 = a & 0x0000FF0000000000 >> 40;
s4 = a & 0x000000FF00000000 >> 32;
s5 = a & 0x00000000FF000000 >> 24;
s6 = a & 0x0000000000FF0000 >> 16;
s7 = a & 0x000000000000FF00 >> 8;
s8 = a & 0x00000000000000FF;
t1 = b & 0xFF00000000000000 >> 56;
t2 = b & 0x00FF000000000000 >> 48;
t3 = b & 0x0000FF0000000000 >> 40;
t4 = b & 0x000000FF00000000 >> 32;
t5 = b & 0x00000000FF000000 >> 24;
t6 = b & 0x0000000000FF0000 >> 16;
t7 = b & 0x000000000000FF00 >> 8;
t8 = b & 0x00000000000000FF;
r1 = s1 - t1;
r2 = s2 - t2;
r3 = s3 - t3;
r4 = s4 - t4;
r5 = s5 - t5;
r6 = s6 - t6;
r7 = s7 - t7;
r8 = s8 - t8;
if (r1 < 0) r1 = -r1;
if (r2 < 0) r2 = -r2;
if (r3 < 0) r3 = -r3;
if (r4 < 0) r4 = -r4;
if (r5 < 0) r5 = -r5;
if (r6 < 0) r6 = -r6;
if (r7 < 0) r7 = -r7;
if (r8 < 0) r8 = -r8;
*pf3 = (r1 << 56) | (r2 << 48) | (r3 << 40) | (r4 << 32) | (r5 << 24) | (r6 << 16) | (r7 << 8) | r8;
++pf1;
++pf2;
++pf3;
}
基本上,我将2帧拍摄到Mat图像中,并且我得到了这2张图像之间的差异。 我尝试在该循环中使用OpenCv,但没有成功,我试图改变我的同时为#34; for&#34;循环使用&#34; #pragma omp parallel for&#34;在那个循环中,但它根本不起作用。
在这种情况下,有人可以给我一些关于使用Openmp的建议吗?你认为它有助于提高绩效吗?
谢谢你, 菲尔
答案 0 :(得分:1)
对于看起来很简单的问题,这一切看起来都过于复杂了......为什么不回归一个既简单又可以很容易并行化和矢量化的简单方法呢?
我不太确定您的数据类型,但我会选择以下内容:
long long nbElem = grayImage1.size().width * grayImage1.size().height;
unsigned char *pf1 = grayImage1.ptr();
unsigned char *pf2 = grayImage2.ptr();
unsigned char *pf3 = differenceImage.ptr();
#pragma omp parallel for simd
for ( long long i = 0; i < nbElem; i++ ) {
pf3[i] = pf1[i] > pf2[i] ? pf1[i] - pf2[i] : pf2[i] - pf1[i];
}
通常(未经测试)这种方式,编译器应生成初始代码的矢量化版本的并行化版本,并且它具有很多可读性和可维护性。