c++ - 带有 OpenCv 和指针的 OpenMp

标签 c++ opencv pointers openmp

我正在开发一个 C++ 程序,该程序使用 OpenCv 分析来自网络摄像头的视频并进行一些运动跟踪(最终目标是为学校项目构建一个自动气枪炮塔!)

我正在尝试对我的处理做一些优化,以便在分析视频时获得尽可能高的帧速率。我尝试使用 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 但没有成功,我尝试将我的 while 更改为“for”循环以在该循环上使用“#pragma omp parallel for”,但它根本不起作用。

谁能给我一些关于在这种情况下使用 Openmp 的建议?您认为这有助于提高性能吗?

谢谢, 菲尔

最佳答案

对于一个看起来很简单的问题来说,这一切似乎都过于复杂了……为什么不回到可以轻松并行化和向量化的直接方法呢?

我不太确定你的数据类型,但我会选择这样的东西:

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];
}

通常(未测试)这种方式,编译器应该生成初始代码的矢量化版本的并行化版本,并且它获得了很多可读性和可维护性。

关于c++ - 带有 OpenCv 和指针的 OpenMp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711799/

相关文章:

c++ - 配置 Netbeans 以调试包含非标准库的 C++ 程序

opencv - OpenCV中的定向边缘检测

c++ - 在 C++ 中将函数指针中的 const 参数转换为非 const

c++ - 从 xlC 的模板函数问题中查找静态函数

c++ - 速度和动量 - 我无法走远

将 RGB 数组转换为 Mat (OpenCv)

python - 使用opencv阈值图像以获得与imagemagick相同的结果

c++ - 在 C++ 中使用 const 的指针和符号位置

c - 为什么在 C 中打印出变量会改变它们的值?

c++ - 在 Windows 中控制由 C++ std::fstream 创建的文件句柄的继承性