Change deprecated function ippicviMulC_32f_C1IR to ippicviMulC_32f_C1R. Check results of ipp function, if error was return run opencv branch of code

This commit is contained in:
vbystricky
2014-03-26 16:30:48 +04:00
parent 3b03044047
commit 06434bedfd

View File

@@ -190,223 +190,231 @@ namespace cv
static bool IPPDerivScharr(const Mat& src, Mat& dst, int ddepth, int dx, int dy, double scale) static bool IPPDerivScharr(const Mat& src, Mat& dst, int ddepth, int dx, int dy, double scale)
{ {
int bufSize = 0; int bufSize = 0;
cv::AutoBuffer<char> buffer; cv::AutoBuffer<char> buffer;
IppiSize roi = ippiSize(src.cols, src.rows); IppiSize roi = ippiSize(src.cols, src.rows);
if( ddepth < 0 ) if( ddepth < 0 )
ddepth = src.depth(); ddepth = src.depth();
dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) ); dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) );
switch(src.type()) switch(src.type())
{ {
case CV_8U: case CV_8U:
{ {
if(scale != 1) if(scale != 1)
return false; return false;
switch(dst.type()) switch(dst.type())
{ {
case CV_16S: case CV_16S:
{ {
if((dx == 1) && (dy == 0)) if ((dx == 1) && (dy == 0))
{ {
ippicviFilterScharrVertGetBufferSize_8u16s_C1R(roi,&bufSize); if (ippStsNoErr != ippicviFilterScharrVertGetBufferSize_8u16s_C1R(roi,&bufSize))
buffer.allocate(bufSize); return false;
buffer.allocate(bufSize);
ippicviFilterScharrVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, return (ippStsNoErr == ippicviFilterScharrVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step,
(Ipp16s*)dst.data, (int)dst.step, roi, ippBorderRepl, 0, (Ipp8u*)(char*)buffer); (Ipp16s*)dst.data, (int)dst.step, roi, ippBorderRepl, 0, (Ipp8u*)(char*)buffer));
}
return true; if ((dx == 0) && (dy == 1))
} {
if (ippStsNoErr != ippicviFilterScharrHorizGetBufferSize_8u16s_C1R(roi,&bufSize))
if((dx == 0) && (dy == 1)) return false;
{ buffer.allocate(bufSize);
ippicviFilterScharrHorizGetBufferSize_8u16s_C1R(roi,&bufSize); return (ippStsNoErr == ippicviFilterScharrHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step,
buffer.allocate(bufSize); (Ipp16s*)dst.data, (int)dst.step, roi, ippBorderRepl, 0, (Ipp8u*)(char*)buffer));
}
ippicviFilterScharrHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, return false;
(Ipp16s*)dst.data, (int)dst.step, roi, ippBorderRepl, 0, (Ipp8u*)(char*)buffer); }
default:
return true; return false;
}
}
default:
return false;
} }
} }
case CV_32F:
case CV_32F: {
{
switch(dst.type()) switch(dst.type())
{ {
case CV_32F: case CV_32F:
if((dx == 1) && (dy == 0)) {
{ if ((dx == 1) && (dy == 0))
ippicviFilterScharrVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows),&bufSize); {
buffer.allocate(bufSize); if (ippStsNoErr != ippicviFilterScharrVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows),&bufSize))
return false;
buffer.allocate(bufSize);
ippicviFilterScharrVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, if (ippStsNoErr != ippicviFilterScharrVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
(Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows),
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); ippBorderRepl, 0, (Ipp8u*)(char*)buffer))
if(scale != 1) {
/* IPP is fast, so MulC produce very little perf degradation */ return false;
ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f*)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); }
return true; if (scale != 1)
} /* IPP is fast, so MulC produce very little perf degradation.*/
//ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f*)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
ippicviMulC_32f_C1R((Ipp32f*)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f*)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
return true;
}
if ((dx == 0) && (dy == 1))
{
if (ippStsNoErr != ippicviFilterScharrHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows),&bufSize))
return false;
buffer.allocate(bufSize);
if((dx == 0) && (dy == 1)) if (ippStsNoErr != ippicviFilterScharrHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
{ (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows),
ippicviFilterScharrHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows),&bufSize); ippBorderRepl, 0, (Ipp8u*)(char*)buffer))
buffer.allocate(bufSize); return false;
ippicviFilterScharrHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, if (scale != 1)
(Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), ippicviMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); return true;
if(scale != 1) }
ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); }
default:
return true; return false;
}
default:
return false;
} }
} }
default:
default: return false;
return false; }
}
} }
static bool IPPDeriv(const Mat& src, Mat& dst, int ddepth, int dx, int dy, int ksize, double scale) static bool IPPDeriv(const Mat& src, Mat& dst, int ddepth, int dx, int dy, int ksize, double scale)
{ {
int bufSize = 0; int bufSize = 0;
cv::AutoBuffer<char> buffer; cv::AutoBuffer<char> buffer;
if (ksize == 3 || ksize == 5)
{
if ( ddepth < 0 )
ddepth = src.depth();
if(ksize == 3 || ksize == 5) if (src.type() == CV_8U && dst.type() == CV_16S && scale == 1)
{ {
if( ddepth < 0 ) if ((dx == 1) && (dy == 0))
ddepth = src.depth(); {
if (ippStsNoErr != ippicviFilterSobelNegVertGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
return false;
buffer.allocate(bufSize);
if(src.type() == CV_8U && dst.type() == CV_16S && scale == 1) return (ippStsNoErr == ippicviFilterSobelNegVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step,
{ (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
if((dx == 1) && (dy == 0)) ippBorderRepl, 0, (Ipp8u*)(char*)buffer));
{ }
ippicviFilterSobelNegVertGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize);
buffer.allocate(bufSize);
ippicviFilterSobelNegVertBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, if ((dx == 0) && (dy == 1))
(Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), {
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); if (ippStsNoErr != ippicviFilterSobelHorizGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
return true; return false;
} buffer.allocate(bufSize);
if((dx == 0) && (dy == 1)) return (ippStsNoErr == ippicviFilterSobelHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step,
{ (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippicviFilterSobelHorizGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize); ippBorderRepl, 0, (Ipp8u*)(char*)buffer));
buffer.allocate(bufSize); }
ippicviFilterSobelHorizBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, if ((dx == 2) && (dy == 0))
(Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), {
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); if (ippStsNoErr != ippicviFilterSobelVertSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
return false;
buffer.allocate(bufSize);
return true; return (ippStsNoErr == ippicviFilterSobelVertSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step,
} (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippBorderRepl, 0, (Ipp8u*)(char*)buffer));
}
if((dx == 2) && (dy == 0)) if ((dx == 0) && (dy == 2))
{ {
ippicviFilterSobelVertSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize); if (ippStsNoErr != ippicviFilterSobelHorizSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
buffer.allocate(bufSize); return false;
buffer.allocate(bufSize);
ippicviFilterSobelVertSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, return (ippStsNoErr == ippicviFilterSobelHorizSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step,
(Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), (Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); ippBorderRepl, 0, (Ipp8u*)(char*)buffer));
}
}
return true; if (src.type() == CV_32F && dst.type() == CV_32F)
} {
if ((dx == 1) && (dy == 0))
{
if (ippStsNoErr != ippicviFilterSobelNegVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), &bufSize))
return false;
buffer.allocate(bufSize);
if((dx == 0) && (dy == 2)) if (ippStsNoErr != ippicviFilterSobelNegVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
{ (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippicviFilterSobelHorizSecondGetBufferSize_8u16s_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize); ippBorderRepl, 0, (Ipp8u*)(char*)buffer))
buffer.allocate(bufSize); {
return false;
}
if(scale != 1)
ippicviMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
return true;
}
ippicviFilterSobelHorizSecondBorder_8u16s_C1R((const Ipp8u*)src.data, (int)src.step, if ((dx == 0) && (dy == 1))
(Ipp16s*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), {
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); if (ippStsNoErr != ippicviFilterSobelHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
return false;
buffer.allocate(bufSize);
return true; if (ippStsNoErr != ippicviFilterSobelHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
} (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
} ippBorderRepl, 0, (Ipp8u*)(char*)buffer))
{
return false;
}
if(scale != 1)
ippicviMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
return true;
}
if(src.type() == CV_32F && dst.type() == CV_32F) if((dx == 2) && (dy == 0))
{ {
if((dx == 1) && (dy == 0)) if (ippStsNoErr != ippicviFilterSobelVertSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
{ return false;
ippicviFilterSobelNegVertGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), &bufSize); buffer.allocate(bufSize);
buffer.allocate(bufSize);
ippicviFilterSobelNegVertBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, if (ippStsNoErr != ippicviFilterSobelVertSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
(Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); ippBorderRepl, 0, (Ipp8u*)(char*)buffer))
if(scale != 1) {
ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); return false;
}
if(scale != 1)
ippicviMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
return true;
}
return true; if((dx == 0) && (dy == 2))
} {
if (ippStsNoErr != ippicviFilterSobelHorizSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize))
return false;
buffer.allocate(bufSize);
if((dx == 0) && (dy == 1)) if (ippStsNoErr != ippicviFilterSobelHorizSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
{ (Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippicviFilterSobelHorizGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize); ippBorderRepl, 0, (Ipp8u*)(char*)buffer))
buffer.allocate(bufSize); {
return false;
}
ippicviFilterSobelHorizBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step, if(scale != 1)
(Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize), ippicviMulC_32f_C1R((Ipp32f *)dst.data, (int)dst.step, (Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
ippBorderRepl, 0, (Ipp8u*)(char*)buffer); return true;
if(scale != 1) }
ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows)); }
}
return true; if(ksize <= 0)
} return IPPDerivScharr(src, dst, ddepth, dx, dy, scale);
return false;
if((dx == 2) && (dy == 0))
{
ippicviFilterSobelVertSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize);
buffer.allocate(bufSize);
ippicviFilterSobelVertSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
(Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippBorderRepl, 0, (Ipp8u*)(char*)buffer);
if(scale != 1)
ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
return true;
}
if((dx == 0) && (dy == 2))
{
ippicviFilterSobelHorizSecondGetBufferSize_32f_C1R(ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),&bufSize);
buffer.allocate(bufSize);
ippicviFilterSobelHorizSecondBorder_32f_C1R((const Ipp32f*)src.data, (int)src.step,
(Ipp32f*)dst.data, (int)dst.step, ippiSize(src.cols, src.rows), (IppiMaskSize)(ksize*10+ksize),
ippBorderRepl, 0, (Ipp8u*)(char*)buffer);
if(scale != 1)
ippicviMulC_32f_C1IR((Ipp32f)scale, (Ipp32f *)dst.data, (int)dst.step, ippiSize(dst.cols*dst.channels(), dst.rows));
return true;
}
}
}
if(ksize <= 0)
return IPPDerivScharr(src, dst, ddepth, dx, dy, scale);
return false;
} }
} }
@@ -436,7 +444,7 @@ void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy,
if(dx < 3 && dy < 3 && cn == 1 && borderType == BORDER_REPLICATE) if(dx < 3 && dy < 3 && cn == 1 && borderType == BORDER_REPLICATE)
{ {
Mat src = _src.getMat(), dst = _dst.getMat(); Mat src = _src.getMat(), dst = _dst.getMat();
if(IPPDeriv(src, dst, ddepth, dx, dy, ksize,scale)) if (IPPDeriv(src, dst, ddepth, dx, dy, ksize,scale))
return; return;
} }
#endif #endif