static int actualScalarDepth(const double* data, int len)
{
- double minval = data[0];
- double maxval = data[0];
- for(int i = 1; i < len; ++i)
- {
- minval = MIN(minval, data[i]);
- maxval = MAX(maxval, data[i]);
- }
-
- int depth = CV_64F;
- if(minval >= 0 && maxval <= UCHAR_MAX)
- depth = CV_8U;
- else if(minval >= SCHAR_MIN && maxval <= SCHAR_MAX)
- depth = CV_8S;
- else if(minval >= 0 && maxval <= USHRT_MAX)
- depth = CV_16U;
- else if(minval >= SHRT_MIN && maxval <= SHRT_MAX)
- depth = CV_16S;
- else if(minval >= INT_MIN && maxval <= INT_MAX)
- depth = CV_32S;
- else if(minval >= -FLT_MAX && maxval <= FLT_MAX)
- depth = CV_32F;
- return depth;
+ int i = 0, minval = INT_MAX, maxval = INT_MIN;
+ for(; i < len; ++i)
+ {
+ int ival = cvRound(data[i]);
+ if( ival != data[i] )
+ break;
+ minval = MIN(minval, ival);
+ maxval = MAX(maxval, ival);
+ }
+ return i < len ? CV_64F :
+ minval >= 0 && maxval <= UCHAR_MAX ? CV_8U :
+ minval >= SCHAR_MIN && maxval <= SCHAR_MAX ? CV_8S :
+ minval >= 0 && maxval <= USHRT_MAX ? CV_16U :
+ minval >= SHRT_MIN && maxval <= SHRT_MAX ? CV_16S :
+ CV_32S;
}
static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
bool haveScalar = false, swapped12 = false;
int depth2 = src2.depth();
- if( src1.size != src2.size || src1.channels() != src2.channels() )
+ if( src1.size != src2.size || src1.channels() != src2.channels() ||
+ ((kind1 == _InputArray::MATX || kind2 == _InputArray::MATX) &&
+ src1.cols == 1 && src2.rows == 4) )
{
if( checkScalar(src1, src2.type(), kind1, kind2) )
{
haveScalar = true;
CV_Assert(src2.type() == CV_64F && (src2.rows == 4 || src2.rows == 1));
- if (usrdata == 0) // hack to filter out multiply and divide
+ if (!muldiv)
+ {
depth2 = actualScalarDepth(src2.ptr<double>(), src1.channels());
+ if( depth2 == CV_64F && (src1.depth() < CV_32S || src1.depth() == CV_32F) )
+ depth2 = CV_32F;
+ }
else
- depth2 = CV_64F;
+ depth2 = src1.depth() < CV_32S || src1.depth() == CV_32F ? CV_32F : CV_64F;
}
int cn = src1.channels(), depth1 = src1.depth(), wtype;