2014-11-04 4 views
-1

Я пытаюсь заменить функцию opensv resize() на API интегрированных характеристик производительности (IPP).
Я использую версию IPP 7.1.
Но после выполнения следующей замены я не получаю измененную ширину и высоту.Проблема с заменой функции OpenCV с помощью API ipp

Вот функция 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); 

ответ

-1

Почему вы это делаете? Функции OpenCV уже включают функции IPP, когда включен CMake. Цель OpenCV - сохранить окончательный код в чистоте, но вы идете в обратном направлении.

Избегайте использования IPP, если целью является изменение размера изображения. Просто придерживайтесь версии OpenCV. Простые, чистые, эффективные (благодаря IPP тоже)

+0

Спасибо blackibiza за ваш ответ. Можете ли вы сказать мне, что реализация IPP для функции openCV resize() верна? Если да, то почему я не получаю требуемый выход? – Ashwin

+0

Привет, Blackibiza, я не нашел вызов ipp внутри вызова opensv resize()! – Ashwin

+0

см. В этом другом потоке Stackoverflow: http://stackoverflow.com/questions/13465914/using-opencv-mat-images-with-intel-ipp – madduci

0

я заменил вызов OpenCV с вызовом IPP и получили хороший результат с точки зрения сроков: Ниже изменения, которые я сделал в моем коде для достижения этой цели:

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);