【问题标题】:Issue in replacement of OpenCV function with ipp API用 ipp API 替换 OpenCV 函数的问题
【发布时间】:2014-11-05 18:57:54
【问题描述】:

我正在尝试用集成性能基元 (IPP) API 替换我的 opencv resize() 函数。
我使用的是 IPP 7.1 版本。
但是在进行以下替换后,我没有调整宽度和高度。

这里是 OpenCV 函数:

   Mat src,dest;    
   resize(src, dest, Size(cvRound(8.0 * src.cols/ width), cvRound(8.0 * src.rows / height)), INTER_LINEAR );
   //dest rows and cols are getting updated

这是IPP功能:

    IppiSize srcsize,dstsize;
    IppiPoint zoomedOffset = {0, 0};
    Ipp32s zoomOpSpecSize = 0, zoomOpInitSize = 0, zoomOpBufSize = 0;
    Ipp8u * zoomOpBuf = NULL;
    IppiResizeSpec_32f * zoomOpSpec = NULL;

    srcsize.height = src.rows;
    srcsize.width = src.cols;

    dstsize.height = dest.rows;
    dstsize.width = dest.cols;

    ippiResizeGetSize_8u(srcsize,dstsize,ippLinear, 0, &zoomOpSpecSize, &zoomOpInitSize);
    zoomOpSpec = (IppiResizeSpec_32f *)ippsMalloc_8u(zoomOpSpecSize);

    ippiResizeLinearInit_8u(srcsize, dstsize,zoomOpSpec);

    ippiResizeGetBufferSize_8u(zoomOpSpec, dstsize, 1, &zoomOpBufSize);
    zoomOpBuf = ippsMalloc_8u(zoomOpBufSize);

    ippiResizeLinear_8u_C1R(src.data,
                            src.cols,
                            dest.data,
                            dest.cols,
                            zoomedOffset,
                            dstsize,
                            ippBorderRepl,
                            0,
                            zoomOpSpec,
                            zoomOpBuf
                            );

   ippsFree(zoomOpSpec);
   ippsFree(zoomOpBuf);

【问题讨论】:

    标签: opencv intel-ipp


    【解决方案1】:

    我已经用 ipp 调用替换了 opencv 调用,并且在时间方面得到了很好的结果: 以下是我在代码中为实现此目的所做的更改:

    IppiSize srcsize,dstsize;
        Ipp32s zoomOpSpecSize = 0, zoomOpInitSize = 0, zoomOpBufSize = 0;
        Ipp8u * zoomOpBuf = NULL;
        IppiResizeSpec_32f * zoomOpSpec = NULL;
        IppStatus status = ippStsNoErr;
        Ipp8u *pSrcT, *pDstT;
    
        IppiPoint srcOffset = {0, 0};
        IppiPoint dstOffset = {0, 0};
    
        srcsize.height = src.rows;
        srcsize.width = src.cols;
        dstsize = (IppiSize&)Size(cvRound(8.0 * iw / width), cvRound(8.0 * ih / height));
    
        dest.rows = dstsize.height;
        dest.cols = dstsize.width;
    
        /* Spec and init buffer sizes */
        status = ippiResizeGetSize_8u(srcsize,dstsize,ippLinear, 0, &zoomOpSpecSize, &zoomOpInitSize);
    
        /* Memory allocation */
        zoomOpSpec = (IppiResizeSpec_32f *)ippsMalloc_8u(zoomOpSpecSize);
    
    
        /* Filter initialization */
        status =ippiResizeLinearInit_8u(srcsize, dstsize,zoomOpSpec);
    
    
        ippiResizeGetBufferSize_8u(zoomOpSpec, dstsize, 3, &zoomOpBufSize);
        zoomOpBuf = ippsMalloc_8u(zoomOpBufSize);
        dest.data = ippsMalloc_8u(dest.rows * dest.cols * 3);
        //dstOffset.y  = dstOffset.y + dstsize.height;
        pSrcT = (Ipp8u*)((char*)src.data + srcOffset.y * src.step);
        pDstT = (Ipp8u*)((char*)dest.data + dstOffset.y * dest.step);
    
        dest.datastart = pDstT;
        dest.dataend = pDstT + (dest.rows *dest.cols*3);
        dest.datalimit = dest.dataend;
    
        status = ippiResizeLinear_8u_C3R(pSrcT,
                                src.step,
                                pDstT,
                                dest.cols * 3,
                                dstOffset,                          
                                dstsize,
                                ippBorderRepl,
                                0,
                                zoomOpSpec,
                                zoomOpBuf
                                );
       ippsFree(zoomOpSpec);
       ippsFree(zoomOpBuf); 
    

    【讨论】:

      【解决方案2】:

      你为什么要这样做? 当使用 CMake 启用时,OpenCV 函数已经包含 IPP 函数。 OpenCV 的目标是保持最终代码的整洁,但您的做法恰恰相反。

      如果目标是调整图像大小,请避免使用 IPP。坚持使用 OpenCV 的版本。简单、干净、高效(也感谢 IPP)

      【讨论】:

      • 感谢 blackibiza 的回答。你能告诉我提到的 openCV resize() 函数的 IPP 实现是正确的吗??如果是,那么为什么我没有得到所需的输出??
      • 嗨Blackibiza,我没有在opencv resize()函数调用中找到ipp调用!!
      • 请参考另一个 Stackoverflow 线程:stackoverflow.com/questions/13465914/…
      • ,我现在正在我的代码中进行第三级优化。与其他函数相比,我已经看到这个 resize() opencv 函数是热点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多