checkDeviceMaxMemoryAllocSize(srcSize, type);
- UMat src(srcSize, type), dst(srcSize, type), kernel(ksize, ksize, CV_32SC1);
+ UMat src(srcSize, type), dst(srcSize, type);
+ Mat kernel(ksize, ksize, CV_32SC1);
declare.in(src, WARMUP_RNG).in(kernel).out(dst);
randu(kernel, -3.0, 3.0);
if (cn <= 2 && ksize.width <= 4 && ksize.height <= 4)
{
pxPerWorkItemX = sz.width % 8 ? sz.width % 4 ? sz.width % 2 ? 1 : 2 : 4 : 8;
- pxPerWorkItemY = sz.width % 2 ? 1 : 2;
+ pxPerWorkItemY = sz.height % 2 ? 1 : 2;
}
else if (cn < 4 || (ksize.width <= 4 && ksize.height <= 4))
{
pxPerWorkItemX = sz.width % 2 ? 1 : 2;
- pxPerWorkItemY = sz.width % 2 ? 1 : 2;
+ pxPerWorkItemY = sz.height % 2 ? 1 : 2;
}
globalsize[0] = sz.width / pxPerWorkItemX;
globalsize[1] = sz.height / pxPerWorkItemY;
if( kernel.cols*kernel.rows >= dft_filter_size )
{
Mat temp;
- if( src.data != dst.data )
- temp = dst;
- else
- temp.create(dst.size(), dst.type());
// crossCorr doesn't accept non-zero delta with multiple channels
if( src.channels() != 1 && delta != 0 )
{
+ // The semantics of filter2D require that the delta be applied
+ // as floating-point math. So wee need an intermediate Mat
+ // with a float datatype. If the dest is already floats,
+ // we just use that.
+ int corrDepth = dst.depth();
+ if( (dst.depth() == CV_32F || dst.depth() == CV_64F) &&
+ src.data != dst.data )
+ {
+ temp = dst;
+ }
+ else
+ {
+ corrDepth = dst.depth() == CV_64F ? CV_64F : CV_32F;
+ temp.create( dst.size(), CV_MAKETYPE(corrDepth, dst.channels()) );
+ }
crossCorr( src, kernel, temp, src.size(),
- CV_MAKETYPE(ddepth, src.channels()),
+ CV_MAKETYPE(corrDepth, src.channels()),
anchor, 0, borderType );
add( temp, delta, temp );
+ if ( temp.data != dst.data )
+ {
+ temp.convertTo( dst, dst.type() );
+ }
}
else
{
+ if( src.data != dst.data )
+ temp = dst;
+ else
+ temp.create(dst.size(), dst.type());
crossCorr( src, kernel, temp, src.size(),
CV_MAKETYPE(ddepth, src.channels()),
anchor, delta, borderType );
+ if( temp.data != dst.data )
+ temp.copyTo(dst);
}
- if( temp.data != dst.data )
- temp.copyTo(dst);
return;
}
static const int kernelMaxSize = 10;
int type;
- Size dsize;
+ Size size;
Point anchor;
int borderType;
int widthMultiple;
void random_roi()
{
- dsize = randomSize(1, MAX_VALUE);
+ size = randomSize(1, MAX_VALUE);
// Make sure the width is a multiple of the requested value, and no more.
- dsize.width &= ~((widthMultiple * 2) - 1);
- dsize.width += widthMultiple;
+ size.width &= ~((widthMultiple * 2) - 1);
+ size.width += widthMultiple;
- Size roiSize = randomSize(kernel.size[0], MAX_VALUE, kernel.size[1], MAX_VALUE);
Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
- randomSubMat(src, src_roi, roiSize, srcBorder, type, -MAX_VALUE, MAX_VALUE);
+ randomSubMat(src, src_roi, size, srcBorder, type, -MAX_VALUE, MAX_VALUE);
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
- randomSubMat(dst, dst_roi, dsize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
+ randomSubMat(dst, dst_roi, size, dstBorder, type, -MAX_VALUE, MAX_VALUE);
anchor.x = randomInt(-1, kernel.size[0]);
anchor.y = randomInt(-1, kernel.size[1]);