From 46e8d9d02dfae6a319e0e310fd3b402e4ffc273d Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Wed, 23 Apr 2014 14:18:20 +0400 Subject: [PATCH] cv::copyMakeBorder --- modules/core/src/copy.cpp | 112 +++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/modules/core/src/copy.cpp b/modules/core/src/copy.cpp index d21a39034..5b4a1d888 100644 --- a/modules/core/src/copy.cpp +++ b/modules/core/src/copy.cpp @@ -892,6 +892,7 @@ void cv::copyMakeBorder( InputArray _src, OutputArray _dst, int top, int bottom, ocl_copyMakeBorder(_src, _dst, top, bottom, left, right, borderType, value)) Mat src = _src.getMat(); + int type = src.type(); if( src.isSubmatrix() && (borderType & BORDER_ISOLATED) == 0 ) { @@ -909,7 +910,7 @@ void cv::copyMakeBorder( InputArray _src, OutputArray _dst, int top, int bottom, right -= dright; } - _dst.create( src.rows + top + bottom, src.cols + left + right, src.type() ); + _dst.create( src.rows + top + bottom, src.cols + left + right, type ); Mat dst = _dst.getMat(); if(top == 0 && left == 0 && bottom == 0 && right == 0) @@ -921,6 +922,115 @@ void cv::copyMakeBorder( InputArray _src, OutputArray _dst, int top, int bottom, borderType &= ~BORDER_ISOLATED; +#if defined HAVE_IPP && 0 + typedef IppStatus (CV_STDCALL * ippiCopyMakeBorder)(const void * pSrc, int srcStep, IppiSize srcRoiSize, void * pDst, + int dstStep, IppiSize dstRoiSize, int topBorderHeight, int leftBorderWidth); + typedef IppStatus (CV_STDCALL * ippiCopyMakeBorderI)(const void * pSrc, int srcDstStep, IppiSize srcRoiSize, IppiSize dstRoiSize, + int topBorderHeight, int leftborderwidth); + typedef IppStatus (CV_STDCALL * ippiCopyConstBorder)(const void * pSrc, int srcStep, IppiSize srcRoiSize, void * pDst, int dstStep, + IppiSize dstRoiSize, int topBorderHeight, int leftBorderWidth, void * value); + + IppiSize srcRoiSize = { src.cols, src.rows }, dstRoiSize = { dst.cols, dst.rows }; + ippiCopyMakeBorder ippFunc = 0; + ippiCopyMakeBorderI ippFuncI = 0; + ippiCopyConstBorder ippFuncConst = 0; + bool inplace = dst.datastart == src.datastart; + + if (borderType == BORDER_CONSTANT) + { + ippFuncConst = +// type == CV_8UC1 ? (ippiCopyConstBorder)ippiCopyConstBorder_8u_C1R : bug in IPP 8.1 + type == CV_16UC1 ? (ippiCopyConstBorder)ippiCopyConstBorder_16u_C1R : +// type == CV_16SC1 ? (ippiCopyConstBorder)ippiCopyConstBorder_16s_C1R : bug in IPP 8.1 +// type == CV_32SC1 ? (ippiCopyConstBorder)ippiCopyConstBorder_32s_C1R : bug in IPP 8.1 +// type == CV_32FC1 ? (ippiCopyConstBorder)ippiCopyConstBorder_32f_C1R : bug in IPP 8.1 + type == CV_8UC3 ? (ippiCopyConstBorder)ippiCopyConstBorder_8u_C3R : + type == CV_16UC3 ? (ippiCopyConstBorder)ippiCopyConstBorder_16u_C3R : + type == CV_16SC3 ? (ippiCopyConstBorder)ippiCopyConstBorder_16s_C3R : + type == CV_32SC3 ? (ippiCopyConstBorder)ippiCopyConstBorder_32s_C3R : + type == CV_32FC3 ? (ippiCopyConstBorder)ippiCopyConstBorder_32f_C3R : + type == CV_8UC4 ? (ippiCopyConstBorder)ippiCopyConstBorder_8u_C4R : + type == CV_16UC4 ? (ippiCopyConstBorder)ippiCopyConstBorder_16u_C4R : + type == CV_16SC4 ? (ippiCopyConstBorder)ippiCopyConstBorder_16s_C4R : + type == CV_32SC4 ? (ippiCopyConstBorder)ippiCopyConstBorder_32s_C4R : + type == CV_32FC4 ? (ippiCopyConstBorder)ippiCopyConstBorder_32f_C4R : 0; + } + else if (borderType == BORDER_WRAP) + { + if (inplace) + { + CV_SUPPRESS_DEPRECATED_START + ippFuncI = + type == CV_32SC1 ? (ippiCopyMakeBorderI)ippiCopyWrapBorder_32s_C1IR : + type == CV_32FC1 ? (ippiCopyMakeBorderI)ippiCopyWrapBorder_32s_C1IR : 0; + CV_SUPPRESS_DEPRECATED_END + } + else + { + ippFunc = + type == CV_32SC1 ? (ippiCopyMakeBorder)ippiCopyWrapBorder_32s_C1R : + type == CV_32FC1 ? (ippiCopyMakeBorder)ippiCopyWrapBorder_32s_C1R : 0; + } + } + else if (borderType == BORDER_REPLICATE) + { + if (inplace) + { + CV_SUPPRESS_DEPRECATED_START + ippFuncI = + type == CV_8UC1 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_8u_C1IR : + type == CV_16UC1 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_16u_C1IR : + type == CV_16SC1 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_16s_C1IR : + type == CV_32SC1 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_32s_C1IR : + type == CV_32FC1 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_32f_C1IR : + type == CV_8UC3 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_8u_C3IR : + type == CV_16UC3 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_16u_C3IR : + type == CV_16SC3 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_16s_C3IR : + type == CV_32SC3 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_32s_C3IR : + type == CV_32FC3 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_32f_C3IR : + type == CV_8UC4 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_8u_C4IR : + type == CV_16UC4 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_16u_C4IR : + type == CV_16SC4 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_16s_C4IR : + type == CV_32SC4 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_32s_C4IR : + type == CV_32FC4 ? (ippiCopyMakeBorderI)ippiCopyReplicateBorder_32f_C4IR : 0; + CV_SUPPRESS_DEPRECATED_END + } + else + { + ippFunc = + type == CV_8UC1 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_8u_C1R : + type == CV_16UC1 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_16u_C1R : + type == CV_16SC1 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_16s_C1R : + type == CV_32SC1 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_32s_C1R : + type == CV_32FC1 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_32f_C1R : + type == CV_8UC3 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_8u_C3R : + type == CV_16UC3 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_16u_C3R : + type == CV_16SC3 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_16s_C3R : + type == CV_32SC3 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_32s_C3R : + type == CV_32FC3 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_32f_C3R : + type == CV_8UC4 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_8u_C4R : + type == CV_16UC4 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_16u_C4R : + type == CV_16SC4 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_16s_C4R : + type == CV_32SC4 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_32s_C4R : + type == CV_32FC4 ? (ippiCopyMakeBorder)ippiCopyReplicateBorder_32f_C4R : 0; + } + } + + if (ippFunc || ippFuncI || ippFuncConst) + { + uchar scbuf[32]; + scalarToRawData(value, scbuf, type); + + if ( (ippFunc && ippFunc(src.data, (int)src.step, srcRoiSize, dst.data, (int)dst.step, dstRoiSize, top, left) >= 0) || + (ippFuncI && ippFuncI(src.data, (int)src.step, srcRoiSize, dstRoiSize, top, left) >= 0) || + (ippFuncConst && ippFuncConst(src.data, (int)src.step, srcRoiSize, dst.data, (int)dst.step, + dstRoiSize, top, left, scbuf) >= 0)) + return; + + setIppErrorStatus(); + } +#endif + if( borderType != BORDER_CONSTANT ) copyMakeBorder_8u( src.data, src.step, src.size(), dst.data, dst.step, dst.size(),