united cv::Mat and cv::MatND
This commit is contained in:
@@ -399,11 +399,57 @@ bitwiseSOp_( const Mat& srcmat, Mat& dstmat, const Scalar& _scalar )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
binaryOp( const Mat& src1, const Mat& src2, Mat& dst, BinaryFunc func, int dsttype=-1 )
|
||||
{
|
||||
if( dsttype == -1 )
|
||||
dsttype = src1.type();
|
||||
CV_Assert( src1.type() == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, dsttype);
|
||||
const Mat* arrays[] = { &src1, &src2, &dst, 0 };
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func(it.planes[0], it.planes[1], it.planes[2]);
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( src1.size() == src2.size() );
|
||||
dst.create( src1.size(), dsttype );
|
||||
func( src1, src2, dst );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
binaryMaskOp( const Mat& src1, const Mat& src2, Mat& dst,
|
||||
const Mat& mask, BinaryFunc func )
|
||||
{
|
||||
CV_Assert( src1.size() == src2.size() && src1.type() == src2.type() && func != 0 );
|
||||
CV_Assert( src1.type() == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = { &src1, &src2, &dst, &mask, 0 };
|
||||
Mat planes[4];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
if( !mask.data )
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func(it.planes[0], it.planes[1], it.planes[2]);
|
||||
else
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
binaryMaskOp(it.planes[0], it.planes[1],
|
||||
it.planes[2], it.planes[3],
|
||||
func);
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( src1.size() == src2.size() );
|
||||
dst.create( src1.size(), src1.type() );
|
||||
|
||||
if( !mask.data )
|
||||
@@ -436,6 +482,24 @@ binarySMaskOp( const Mat& src1, const Scalar& s, Mat& dst,
|
||||
const Mat& mask, BinarySFuncCn func )
|
||||
{
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
if( src1.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = { &src1, &dst, &mask, 0 };
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
if( !mask.data )
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func(it.planes[0], it.planes[1], s);
|
||||
else
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
binarySMaskOp(it.planes[0], s, it.planes[1],
|
||||
it.planes[2], func);
|
||||
return;
|
||||
}
|
||||
|
||||
dst.create( src1.size(), src1.type() );
|
||||
|
||||
if( !mask.data )
|
||||
@@ -499,6 +563,18 @@ void bitwise_xor(const Mat& a, const Scalar& s, Mat& c, const Mat& mask)
|
||||
|
||||
void bitwise_not(const Mat& src, Mat& dst)
|
||||
{
|
||||
if( src.dims > 2 )
|
||||
{
|
||||
dst.create(src.dims, src.size, src.type());
|
||||
const Mat* arrays[] = { &src, &dst, 0 };
|
||||
Mat planes[4];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
bitwise_not(it.planes[0], it.planes[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
const uchar* sptr = src.data;
|
||||
dst.create( src.size(), src.type() );
|
||||
uchar* dptr = dst.data;
|
||||
@@ -564,21 +640,50 @@ static BinaryFunc subTab[] =
|
||||
binaryOpC1_<OpSub<double>,NoVec>, 0
|
||||
};
|
||||
|
||||
|
||||
void add( const Mat& src1, const Mat& src2, Mat& dst )
|
||||
{
|
||||
Size size = src1.size(); int type = src1.type();
|
||||
int type = src1.type();
|
||||
BinaryFunc func = addTab[CV_MAT_DEPTH(type)];
|
||||
CV_Assert( size == src2.size() && type == src2.type() && func != 0 );
|
||||
CV_Assert( type == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &src2, &dst, 0};
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], it.planes[2] );
|
||||
return;
|
||||
}
|
||||
|
||||
Size size = src1.size();
|
||||
CV_Assert( size == src2.size() );
|
||||
dst.create( size, type );
|
||||
func(src1, src2, dst);
|
||||
}
|
||||
|
||||
void subtract( const Mat& src1, const Mat& src2, Mat& dst )
|
||||
{
|
||||
Size size = src1.size(); int type = src1.type();
|
||||
int type = src1.type();
|
||||
BinaryFunc func = subTab[CV_MAT_DEPTH(type)];
|
||||
CV_Assert( size == src2.size() && type == src2.type() && func != 0 );
|
||||
CV_Assert( type == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &src2, &dst, 0};
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], it.planes[2] );
|
||||
return;
|
||||
}
|
||||
|
||||
Size size = src1.size();
|
||||
CV_Assert( size == src2.size() );
|
||||
dst.create( size, type );
|
||||
func(src1, src2, dst);
|
||||
}
|
||||
@@ -698,7 +803,21 @@ void multiply(const Mat& src1, const Mat& src2, Mat& dst, double scale)
|
||||
};
|
||||
|
||||
MulDivFunc func = tab[src1.depth()];
|
||||
CV_Assert( src1.size() == src2.size() && src1.type() == src2.type() && func != 0 );
|
||||
CV_Assert( src1.type() == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &src2, &dst, 0};
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], it.planes[2], scale );
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( src1.size() == src2.size() );
|
||||
dst.create( src1.size(), src1.type() );
|
||||
func( src1, src2, dst, scale );
|
||||
}
|
||||
@@ -764,6 +883,20 @@ void divide(const Mat& src1, const Mat& src2, Mat& dst, double scale)
|
||||
|
||||
MulDivFunc func = tab[src1.depth()];
|
||||
CV_Assert( src1.size() == src2.size() && src1.type() == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &src2, &dst, 0};
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], it.planes[2], scale );
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( src1.size() == src2.size() );
|
||||
dst.create( src1.size(), src1.type() );
|
||||
func( src1, src2, dst, scale );
|
||||
}
|
||||
@@ -827,6 +960,19 @@ void divide(double scale, const Mat& src, Mat& dst)
|
||||
|
||||
RecipFunc func = tab[src.depth()];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
if( src.dims > 2 )
|
||||
{
|
||||
dst.create(src.dims, src.size, src.type());
|
||||
const Mat* arrays[] = {&src, &dst, 0};
|
||||
Mat planes[2];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( scale, it.planes[0], it.planes[1] );
|
||||
return;
|
||||
}
|
||||
|
||||
dst.create( src.size(), src.type() );
|
||||
func( scale, src, dst );
|
||||
}
|
||||
@@ -983,7 +1129,21 @@ void addWeighted( const Mat& src1, double alpha, const Mat& src2,
|
||||
};
|
||||
|
||||
AddWeightedFunc func = tab[src1.depth()];
|
||||
CV_Assert( src1.size() == src2.size() && src1.type() == src2.type() && func != 0 );
|
||||
CV_Assert( src1.type() == src2.type() && func != 0 );
|
||||
|
||||
if( src1.dims > 2 || src2.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &src2, &dst, 0};
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], alpha, it.planes[1], beta, gamma, it.planes[2] );
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( src1.size() == src2.size() );
|
||||
dst.create( src1.size(), src1.type() );
|
||||
func( src1, alpha, src2, beta, gamma, dst );
|
||||
}
|
||||
@@ -1024,10 +1184,7 @@ void absdiff( const Mat& src1, const Mat& src2, Mat& dst )
|
||||
binaryOpC1_<OpAbsDiff<double>,NoVec>, 0
|
||||
};
|
||||
|
||||
dst.create(src1.size(), src1.type());
|
||||
BinaryFunc func = tab[src1.depth()];
|
||||
CV_Assert(src1.size() == src2.size() && src1.type() == src2.type() && func != 0);
|
||||
func( src1, src2, dst );
|
||||
binaryOp(src1, src2, dst, tab[src1.depth()]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1043,9 +1200,22 @@ void absdiff( const Mat& src1, const Scalar& s, Mat& dst )
|
||||
binarySOpCn_<OpAbsDiffS<double> >, 0
|
||||
};
|
||||
|
||||
dst.create(src1.size(), src1.type());
|
||||
BinarySFuncCn func = tab[src1.depth()];
|
||||
CV_Assert(src1.channels() <= 4 && func != 0);
|
||||
|
||||
if( src1.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &dst, 0};
|
||||
Mat planes[3];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], s );
|
||||
return;
|
||||
}
|
||||
|
||||
dst.create(src1.size(), src1.type());
|
||||
func( src1, dst, s );
|
||||
}
|
||||
|
||||
@@ -1174,13 +1344,24 @@ void inRange(const Mat& src, const Mat& lowerb,
|
||||
inRange_<InRangeC4<double, double> >, 0
|
||||
};
|
||||
|
||||
CV_Assert( src.size() == lowerb.size() && src.size() == upperb.size() &&
|
||||
src.type() == lowerb.type() && src.type() == upperb.type() &&
|
||||
src.channels() <= 4 );
|
||||
CV_Assert( src.type() == lowerb.type() && src.type() == upperb.type() && src.channels() <= 4 );
|
||||
|
||||
InRangeFunc func = tab[src.type()];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
if( src.dims > 2 || lowerb.dims > 2 || upperb.dims > 2 )
|
||||
{
|
||||
dst.create(src.dims, src.size, CV_8U);
|
||||
const Mat* arrays[] = {&src, &lowerb, &upperb, &dst, 0};
|
||||
Mat planes[4];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], it.planes[2], it.planes[3] );
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( src.size() == lowerb.size() && src.size() == upperb.size() );
|
||||
dst.create(src.size(), CV_8U);
|
||||
func( src, lowerb, upperb, dst );
|
||||
}
|
||||
@@ -1223,6 +1404,18 @@ void inRange(const Mat& src, const Scalar& lowerb,
|
||||
|
||||
InRangeSFunc func = tab[src.type()];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
if( src.dims > 2 )
|
||||
{
|
||||
dst.create(src.dims, src.size, CV_8U);
|
||||
const Mat* arrays[] = {&src, &dst, 0};
|
||||
Mat planes[2];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], lowerb, upperb, it.planes[1] );
|
||||
return;
|
||||
}
|
||||
|
||||
dst.create(src.size(), CV_8U);
|
||||
func( src, lowerb, upperb, dst );
|
||||
@@ -1275,8 +1468,7 @@ void compare( const Mat& src1, const Mat& src2, Mat& dst, int cmpOp )
|
||||
binaryOpC1_<CmpEQ<double>,NoVec>, 0},
|
||||
};
|
||||
|
||||
dst.create(src1.rows, src1.cols, CV_8U);
|
||||
CV_Assert(src1.size() == src2.size() && src1.type() == src2.type() && src1.channels() == 1);
|
||||
CV_Assert(src1.channels() == 1);
|
||||
|
||||
int depth = src1.depth();
|
||||
const Mat *psrc1 = &src1, *psrc2 = &src2;
|
||||
@@ -1306,8 +1498,7 @@ void compare( const Mat& src1, const Mat& src2, Mat& dst, int cmpOp )
|
||||
}
|
||||
|
||||
BinaryFunc func = tab[cmpOp == CMP_EQ][depth];
|
||||
CV_Assert( func != 0 );
|
||||
func( *psrc1, *psrc2, dst );
|
||||
binaryOp(*psrc1, *psrc2, dst, func, CV_8U);
|
||||
if( invflag )
|
||||
bitwise_not(dst, dst);
|
||||
}
|
||||
@@ -1368,6 +1559,23 @@ void compare( const Mat& src1, double value, Mat& dst, int cmpOp )
|
||||
|
||||
BinarySFuncC1 func = tab[cmpOp == CMP_EQ ? 0 : cmpOp == CMP_GT ? 1 : 2][depth];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
if( src1.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, CV_8U);
|
||||
const Mat* arrays[] = {&src1, &dst, 0};
|
||||
Mat planes[2];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
func( it.planes[0], it.planes[1], value );
|
||||
if( invflag )
|
||||
bitwise_not(it.planes[2], it.planes[2]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
func( src1, dst, value );
|
||||
if( invflag )
|
||||
bitwise_not(dst, dst);
|
||||
@@ -1405,11 +1613,7 @@ void min( const Mat& src1, const Mat& src2, Mat& dst )
|
||||
binaryOpC1_<MinOp<float>,VMin32f>, binaryOpC1_<MinOp<double>,NoVec>, 0
|
||||
};
|
||||
|
||||
BinaryFunc func = tab[src1.depth()];
|
||||
CV_Assert(src1.size() == src2.size() && src1.type() == src2.type() && func != 0);
|
||||
dst.create(src1.size(), src1.type());
|
||||
|
||||
return func( src1, src2, dst );
|
||||
binaryOp(src1, src2, dst, tab[src1.depth()]);
|
||||
}
|
||||
|
||||
void max( const Mat& src1, const Mat& src2, Mat& dst )
|
||||
@@ -1421,11 +1625,7 @@ void max( const Mat& src1, const Mat& src2, Mat& dst )
|
||||
binaryOpC1_<MaxOp<float>,VMax32f>, binaryOpC1_<MaxOp<double>,NoVec>, 0
|
||||
};
|
||||
|
||||
BinaryFunc func = tab[src1.depth()];
|
||||
CV_Assert(src1.size() == src2.size() && src1.type() == src2.type() && func != 0);
|
||||
dst.create(src1.size(), src1.type());
|
||||
|
||||
return func( src1, src2, dst );
|
||||
binaryOp(src1, src2, dst, tab[src1.depth()]);
|
||||
}
|
||||
|
||||
void min( const Mat& src1, double value, Mat& dst )
|
||||
@@ -1442,6 +1642,19 @@ void min( const Mat& src1, double value, Mat& dst )
|
||||
|
||||
BinarySFuncC1 func = tab[src1.depth()];
|
||||
CV_Assert(func != 0);
|
||||
|
||||
if( src1.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &dst, 0};
|
||||
Mat planes[2];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], value );
|
||||
return;
|
||||
}
|
||||
|
||||
dst.create(src1.size(), src1.type());
|
||||
return func( src1, dst, value );
|
||||
}
|
||||
@@ -1460,6 +1673,19 @@ void max( const Mat& src1, double value, Mat& dst )
|
||||
|
||||
BinarySFuncC1 func = tab[src1.depth()];
|
||||
CV_Assert(func != 0);
|
||||
|
||||
if( src1.dims > 2 )
|
||||
{
|
||||
dst.create(src1.dims, src1.size, src1.type());
|
||||
const Mat* arrays[] = {&src1, &dst, 0};
|
||||
Mat planes[2];
|
||||
NAryMatIterator it(arrays, planes);
|
||||
|
||||
for( int i = 0; i < it.nplanes; i++, ++it )
|
||||
func( it.planes[0], it.planes[1], value );
|
||||
return;
|
||||
}
|
||||
|
||||
dst.create(src1.size(), src1.type());
|
||||
return func( src1, dst, value );
|
||||
}
|
||||
|
Reference in New Issue
Block a user