- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, I am attempting to replace the ippiResize_8u_C1R function as shown at https://software.intel.com/en-us/articles/resize-changes-in-intel-ipp-71, but I am running into some problems. The sample code does not mention the parameters wratio and hratio in the original function. How are these parameters replaced? I have used another example from this site (also missing hratio and wratio) and my destination image is obviously unscaled. I have rebuilt my entire application using ipp8, but I am pretty much dead in the water without the ability to resize my images.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi George,
Right, the x_factor( wratio) and y_factor (hratio) can be defined by srcRoi size and dstRoi size. for example
srcSize.width = org_image->columns;
srcSize.height = org_image->rows;
dstSize.width = dst_image->columns;
dstSize.height = dst_image-> rows;
srcRoi.width = srcSize.width;
srcRoi.height = srcSize.height;
dstRoi.x = 0;
dstRoi.y = 0;
dstRoi.width = dstSize.width;
dstRoi.height = dstSize.height;
srcWidthStep = srcSize.width * 3;
dstWidthStep = dstSize.width * 3;
double x_factor;
double y_factor;
x_factor = (double)dstSize.width/srcSize.width;
y_factor = (double)dstSize.height/srcSize.height;
If you have x_factor and y_factor , then you can get dst image, width and height. Or if you have dst image size, then you can get x_factor, y_factor, which will don't need in new resize functions.
Best Regards,
Ying
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm assuming hratio and vratio are used to modify destination size. In any case that seems to work for me.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi George,
Right, the x_factor( wratio) and y_factor (hratio) can be defined by srcRoi size and dstRoi size. for example
srcSize.width = org_image->columns;
srcSize.height = org_image->rows;
dstSize.width = dst_image->columns;
dstSize.height = dst_image-> rows;
srcRoi.width = srcSize.width;
srcRoi.height = srcSize.height;
dstRoi.x = 0;
dstRoi.y = 0;
dstRoi.width = dstSize.width;
dstRoi.height = dstSize.height;
srcWidthStep = srcSize.width * 3;
dstWidthStep = dstSize.width * 3;
double x_factor;
double y_factor;
x_factor = (double)dstSize.width/srcSize.width;
y_factor = (double)dstSize.height/srcSize.height;
If you have x_factor and y_factor , then you can get dst image, width and height. Or if you have dst image size, then you can get x_factor, y_factor, which will don't need in new resize functions.
Best Regards,
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi George,
I had met this same problem as you and it took me a lot of time to figure out. I would like to give you the code sample:
This is substitute function for ippiResize_32f_C1R. you can change datatype to match your ippiResize_8u_C1R needs:
IppStatus Resize_32f_C1R(const Ipp32f* pSrc, IppiSize srcSize, int srcStep, IppiRect srcROI, Ipp32f* pDst, int dstStep, IppiSize dstRoiSize, double xFactor, double yFactor, int interpolation) { IppStatus status = ippStsNoErr; // status flag IppiResizeSpec_32f* pSpec = NULL; // specification structure buffer int specSize = 0; // size of specification structure buffer int initSize = 0; // size of initialization buffer (only cubic and lanzcos interpolation type use this) int bufSize = 0; // size of working buffer Ipp8u* pBuffer = NULL; // working buffer Ipp8u* pInit = NULL; // initialization buffer IppiPoint dstOffset = { 0, 0 }; // offset to destination image, default is {0,0} IppiBorderType borderType = ippBorderRepl; // borderType, default is ippBorderRepl Ipp32f borderValue = 0; // border value, default is zero Ipp32u antialiasing = 0; // not use antialiasing Ipp32u numChannels = 1; // this function works with 1 channel Ipp32f valueB = 0.0f; // default value for cubic interpolation type Ipp32f valueC = 0.0f; // default value for cubic interpolation type Ipp32u numLobes = 2; // default value for lanczos interpolation type IppiInterpolationType interpolateType; // interpolation type IppiSize srcRoiSize; // size of source ROI IppiSize resizeSrcRoiSize; // size of resize source ROI // Check pSrc and pDst not NULL if ((pSrc == NULL) || (pDst == NULL)) { return ippStsNullPtrErr; } // Check srcSize and dstRoiSize not have field with zero or negative number if ((srcSize.width <= 0) || (srcSize.height <= 0) || (dstRoiSize.width <= 0) || (dstRoiSize.height <= 0)) { return ippStsSizeErr; } // Check srcRoi has no intersection with the source image IppiPoint topLeft = { srcROI.x , srcROI.y }; IppiPoint topRight = { srcROI.x + srcROI.width, srcROI.y }; IppiPoint bottomLeft = { srcROI.x , srcROI.y + srcROI.height }; IppiPoint bottomRight = { srcROI.x + srcROI.width, srcROI.y + srcROI.height }; if (((topLeft.x < 0 || topLeft.x > srcSize.width) || (topLeft.y < 0 || topLeft.y > srcSize.height)) && ((topRight.x < 0 || topRight.x > srcSize.width) || (topRight.y < 0 || topRight.y > srcSize.height)) && ((bottomLeft.x < 0 || bottomLeft.x > srcSize.width) || (bottomLeft.y < 0 || bottomLeft.y > srcSize.height)) && ((bottomRight.x< 0 || bottomRight.x > srcSize.width) || (bottomRight.y < 0 || bottomRight.y > srcSize.height))) { return ippStsWrongIntersectROI; } // Check xFactor or yFactor is not less than or equal to zero if ((xFactor <= 0) || (yFactor <= 0)) { return ippStsResizeFactorErr; } // Get interpolation filter type switch (interpolation) { case IPPI_INTER_NN: interpolateType = ippNearest; break; case IPPI_INTER_LINEAR: interpolateType = ippLinear; break; case IPPI_INTER_CUBIC: interpolateType = ippCubic; break; case IPPI_INTER_SUPER: interpolateType = ippSuper; break; case IPPI_INTER_LANCZOS: interpolateType = ippLanczos; break; default: return ippStsInterpolationErr; } // Set pSrcRoi to top-left corner of source ROI Ipp32f* pSrcRoi = (Ipp32f*)((Ipp8u*)pSrc + srcROI.y * srcStep) + srcROI.x * numChannels; // Set size of source ROI srcRoiSize.width = srcROI.width; srcRoiSize.height = srcROI.height; // Calculate size of resize source ROI resizeSrcRoiSize.width = (int) ceil(srcRoiSize.width * xFactor); resizeSrcRoiSize.height = (int) ceil(srcRoiSize.height * yFactor); // Get size of specification structure buffer and initialization buffer. status = ippiResizeGetSize_8u(srcRoiSize, resizeSrcRoiSize, interpolateType, antialiasing , &specSize, &initSize); if (status != ippStsNoErr) { return status; } //Allocate memory for specification structure buffer. pSpec = (IppiResizeSpec_32f*)ippsMalloc_8u(specSize); if (pSpec == NULL) { return ippStsNoMemErr; } //Initialize specification structure buffer correspond to interpolation type switch (interpolation) { case IPPI_INTER_NN: status = ippiResizeNearestInit_32f(srcRoiSize, resizeSrcRoiSize, pSpec); break; case IPPI_INTER_LINEAR: status = ippiResizeLinearInit_32f(srcRoiSize, resizeSrcRoiSize, pSpec); break; case IPPI_INTER_CUBIC: pInit = ippsMalloc_8u(initSize); status = ippiResizeCubicInit_32f(srcRoiSize, resizeSrcRoiSize, valueB, valueC, pSpec, pInit); ippsFree(pInit); break; case IPPI_INTER_SUPER: status = ippiResizeSuperInit_32f(srcRoiSize, resizeSrcRoiSize, pSpec); break; case IPPI_INTER_LANCZOS: pInit = ippsMalloc_8u(initSize); status = ippiResizeLanczosInit_32f(srcRoiSize, resizeSrcRoiSize, numLobes, pSpec, pInit); ippsFree(pInit); break; } if (status != ippStsNoErr) { ippsFree(pSpec); return status; } // Get work buffer size status = ippiResizeGetBufferSize_8u(pSpec, resizeSrcRoiSize, numChannels, &bufSize); if (status != ippStsNoErr) { ippsFree(pSpec); return status; } // Allocate memory for work buffer. pBuffer = ippsMalloc_8u(bufSize); if (pBuffer == NULL) { ippsFree(pSpec); return ippStsNoMemErr; } //Execute resize processing correspond to interpolation type switch (interpolation) { case IPPI_INTER_NN: status = ippiResizeNearest_32f_C1R(pSrcRoi, srcStep, pDst, dstStep, dstOffset, dstRoiSize, pSpec, pBuffer); break; case IPPI_INTER_LINEAR: status = ippiResizeLinear_32f_C1R(pSrcRoi, srcStep, pDst, dstStep, dstOffset, dstRoiSize, borderType, &borderValue, pSpec, pBuffer); break; case IPPI_INTER_CUBIC: status = ippiResizeCubic_32f_C1R(pSrcRoi, srcStep, pDst, dstStep, dstOffset, dstRoiSize, borderType, &borderValue, pSpec, pBuffer); break; case IPPI_INTER_SUPER: status = ippiResizeSuper_32f_C1R(pSrcRoi, srcStep, pDst, dstStep, dstOffset, dstRoiSize, pSpec, pBuffer); break; case IPPI_INTER_LANCZOS: status = ippiResizeLanczos_32f_C1R(pSrcRoi, srcStep, pDst, dstStep, dstOffset, dstRoiSize, borderType, &borderValue, pSpec, pBuffer); break; } // Free memory ippsFree(pSpec); ippsFree(pBuffer); return status; }
Hope it can help you.
Regards,
Tam.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Tam,
I tried your implementation to replace ippiResize_32f_C1R. However, at line 143 I get the following status error under IPP 9.0:
ippStsNotSupportedModeErr ( -9999 )
Why do you think this is happening?
Thanks,Zeki
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Zeki,
ippiResize* functions do not support the border type ippBorderConst. You should try to use the border type ippBorderRepl at the line 13.
Best regards,
Valentin

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page