【问题标题】:Using OpenCV Mat images with Intel IPP?将 OpenCV Mat 图像与英特尔 IPP 一起使用?
【发布时间】:2012-11-08 02:09:29
【问题描述】:

我最近开始使用Intel Performance Primitives (IPP) 进行图像处理。对于那些没有听说过 IPP 的人,可以将 IPP 视为图像处理的 MKL 的类似物,而不是线性代数。

我已经在 OpenCV 中实现了一个有点复杂的视觉系统,我想将一些 OpenCV 例程(例如卷积和 FFT)换成更快的 IPP 例程。我的 OpenCV 代码始终使用 cv::Mat 图像数据结构。但是,根据 IPP 代码示例,似乎 IPP 更喜欢 CIppiImage 数据结构。

我的系统在 OpenCV 中进行了几次图像转换,然后我想在 IPP 中做一些事情,然后在 OpenCV 中做更多的工作。这是让 OpenCV 和 IPP 很好地结合在一起的一种天真的方法:

 cv::Mat = load original image
 use OpenCV to do some work on cv::Mat
 write cv::Mat to file

 CIppiImage = read cv::Mat from file //for IPP
 use IPP to do some work on CIppiImage
 write CIppiImage to file

 cv::Mat = read CIppiImage from file
 use OpenCV to do more work on cv::Mat
 write final image to file

但是,这有点乏味,而且读/写文件可能会增加整体执行时间。


我试图让图像处理程序中的 OpenCV 和 IPP 之间的交替更加无缝。以下是一些可以解决问题的方法:

  1. 是否有一种可以将cv::Mat 转换为CIppiImage 或反之亦然的单行代码?
  2. 我对@9​​87654329@ 的实现细节非常熟悉,但我对CIppiImage 了解不多。 cv::MatCIppiImage 是否具有相同的数据布局?如果是这样,我可以做类似于以下演员的事情吗? CIppiImage cimg = (CIppiImage)(&myMat.data[0])?

【问题讨论】:

    标签: c image-processing opencv computer-vision intel-ipp


    【解决方案1】:

    有一种将 OpenCV 数据传递到 IPP 函数的简洁方法。

    如果我们有一个 OpenCV Mat,我们可以将 *Mat.data[0] 转换为 const Ipp<type>*。例如,如果我们正在处理 8 位无符号字符 (8u) 数据,我们可以将 (const Ipp8u*)&img.data[0] 插入 IPP 函数。这是一个使用ippiFilter 函数和典型Lena 图像的示例:

    Mat img = imread("./Lena.pgm"); //OpenCV 8U_C1 image
    Mat outImg = img.clone(); //allocate space for convolution results
    
    int step = img.cols; //pitch
    const Ipp32s kernel[9] = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
    IppiSize kernelSize = {3,3};
    IppiSize dstRoiSize = {img.cols - kernelSize.width + 1, img.rows - kernelSize.height + 1};
    IppiPoint anchor = {2,2};
    int divisor = 1;
    
    IppStatus status = ippiFilter_8u_C1R((const Ipp8u*)&img.data[0], step,
                                         (Ipp8u*)&outImg.data[0], step, dstRoiSize,
                                         kernel, kernelSize, anchor, divisor);
    

    当我将outImg(来自上面的代码)写入文件时,它给出了预期的结果:

    这与我使用相同参数运行 Nvidia 版本 nppiFilter 时得到的结果相匹配:


    我在原始问题中提到了一个名为 CIppiImage 的结构。 CIppiImage 只是一个简单的数组包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多