|
|
|
@ -1059,6 +1059,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 ) |
|
|
|
|
{ |
|
|
|
@ -1076,7 +1077,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) |
|
|
|
@ -1088,6 +1089,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(), |
|
|
|
|