Commit abdb1390 authored by Vladimir Dudnik's avatar Vladimir Dudnik

add IPP Add operations to arithm.cpp for 8u, 16u, 16s, 32s, 32f, 64f data types.

Added print of IPP info in test log files
parent 204c5429
......@@ -48,6 +48,10 @@
#include "precomp.hpp"
#ifdef HAVE_IPP
#include "ippversion.h"
#endif
namespace cv
{
......@@ -262,6 +266,65 @@ typedef NoVec VXor8u;
#endif
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
struct ippAdd8u
{
int operator()(const Ipp8u* src1, const Ipp8u* src2, Ipp8u* dst, int len) const
{
ippsAdd_8u_Sfs(src1,src2,dst,len,0);
return len;
}
};
struct ippAdd16u
{
int operator()(const Ipp16u* src1, const Ipp16u* src2, Ipp16u* dst, int len) const
{
ippsAdd_16u_Sfs(src1,src2,dst,len,0);
return len;
}
};
struct ippAdd16s
{
int operator()(const Ipp16s* src1, const Ipp16s* src2, Ipp16s* dst, int len) const
{
ippsAdd_16s_Sfs(src1,src2,dst,len,0);
return len;
}
};
struct ippAdd32s
{
int operator()(const Ipp32s* src1, const Ipp32s* src2, Ipp32s* dst, int len) const
{
ippsAdd_32s_Sfs(src1,src2,dst,len,0);
return len;
}
};
struct ippAdd32f
{
int operator()(const Ipp32f* src1, const Ipp32f* src2, Ipp32f* dst, int len) const
{
ippsAdd_32f(src1,src2,dst,len);
return len;
}
};
struct ippAdd64f
{
int operator()(const Ipp64f* src1, const Ipp64f* src2, Ipp64f* dst, int len) const
{
ippsAdd_64f(src1,src2,dst,len);
return len;
}
};
#endif
/****************************************************************************************\
* logical operations *
\****************************************************************************************/
......@@ -622,22 +685,37 @@ template<> inline uchar OpSub<uchar>::operator ()(uchar a, uchar b) const
static BinaryFunc addTab[] =
{
binaryOpC1_<OpAdd<uchar>,VAdd8u>, 0,
binaryOpC1_<OpAdd<ushort>,VAdd16u>,
binaryOpC1_<OpAdd<short>,VAdd16s>,
binaryOpC1_<OpAdd<int>,NoVec>,
binaryOpC1_<OpAdd<float>,VAdd32f>,
binaryOpC1_<OpAdd<double>,NoVec>, 0
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
binaryOpC1_<OpAdd<uchar>, ippAdd8u>,
0,
binaryOpC1_<OpAdd<ushort>, ippAdd16u>,
binaryOpC1_<OpAdd<short>, ippAdd16s>,
binaryOpC1_<OpAdd<int>, ippAdd32s>,
binaryOpC1_<OpAdd<float>, ippAdd32f>,
binaryOpC1_<OpAdd<double>, ippAdd64f>,
0
#else
binaryOpC1_<OpAdd<uchar>, VAdd8u>,
0,
binaryOpC1_<OpAdd<ushort>, VAdd16u>,
binaryOpC1_<OpAdd<short>, VAdd16s>,
binaryOpC1_<OpAdd<int>, NoVec>,
binaryOpC1_<OpAdd<float>, VAdd32f>,
binaryOpC1_<OpAdd<double>, NoVec>,
0
#endif
};
static BinaryFunc subTab[] =
{
binaryOpC1_<OpSub<uchar>,VSub8u>, 0,
binaryOpC1_<OpSub<ushort>,VSub16u>,
binaryOpC1_<OpSub<short>,VSub16s>,
binaryOpC1_<OpSub<int>,NoVec>,
binaryOpC1_<OpSub<float>,VSub32f>,
binaryOpC1_<OpSub<double>,NoVec>, 0
binaryOpC1_<OpSub<uchar>, VSub8u>,
0,
binaryOpC1_<OpSub<ushort>, VSub16u>,
binaryOpC1_<OpSub<short>, VSub16s>,
binaryOpC1_<OpSub<int>, NoVec>,
binaryOpC1_<OpSub<float>, VSub32f>,
binaryOpC1_<OpSub<double>, NoVec>,
0
};
void add( const Mat& src1, const Mat& src2, Mat& dst )
......@@ -707,12 +785,14 @@ void add(const Mat& src1, const Scalar& s, Mat& dst, const Mat& mask)
{
static BinarySFuncCn addSTab[] =
{
binarySOpCn_<OpAdd<uchar, int, uchar> >, 0,
binarySOpCn_<OpAdd<uchar, int, uchar> >,
0,
binarySOpCn_<OpAdd<ushort, int, ushort> >,
binarySOpCn_<OpAdd<short, int, short> >,
binarySOpCn_<OpAdd<int> >,
binarySOpCn_<OpAdd<float> >,
binarySOpCn_<OpAdd<double> >, 0
binarySOpCn_<OpAdd<double> >,
0
};
int depth = src1.depth();
binarySMaskOp(src1, s, dst, mask, addSTab[depth]);
......@@ -722,12 +802,14 @@ void subtract(const Scalar& s, const Mat& src1, Mat& dst, const Mat& mask)
{
static BinarySFuncCn rsubSTab[] =
{
binarySOpCn_<OpRSub<uchar, int, uchar> >, 0,
binarySOpCn_<OpRSub<uchar, int, uchar> >,
0,
binarySOpCn_<OpRSub<ushort, int, ushort> >,
binarySOpCn_<OpRSub<short, int, short> >,
binarySOpCn_<OpRSub<int> >,
binarySOpCn_<OpRSub<float> >,
binarySOpCn_<OpRSub<double> >, 0
binarySOpCn_<OpRSub<double> >,
0
};
int depth = src1.depth();
binarySMaskOp(src1, s, dst, mask, rsubSTab[depth]);
......@@ -755,13 +837,17 @@ mul_( const Mat& srcmat1, const Mat& srcmat2, Mat& dstmat, double _scale )
int i;
for( i = 0; i <= size.width - 4; i += 4 )
{
T t0 = saturate_cast<T>(src1[i] * src2[i]);
T t1 = saturate_cast<T>(src1[i+1] * src2[i+1]);
dst[i] = t0; dst[i+1] = t1;
T t0;
T t1;
t0 = saturate_cast<T>(src1[i ] * src2[i ]);
t1 = saturate_cast<T>(src1[i+1] * src2[i+1]);
dst[i ] = t0;
dst[i+1] = t1;
t0 = saturate_cast<T>(src1[i+2] * src2[i+2]);
t1 = saturate_cast<T>(src1[i+3] * src2[i+3]);
dst[i+2] = t0; dst[i+3] = t1;
dst[i+2] = t0;
dst[i+3] = t1;
}
for( ; i < size.width; i++ )
......@@ -798,8 +884,14 @@ void multiply(const Mat& src1, const Mat& src2, Mat& dst, double scale)
{
static MulDivFunc tab[] =
{
mul_<uchar, float>, 0, mul_<ushort, float>, mul_<short, float>,
mul_<int, double>, mul_<float, float>, mul_<double, double>, 0
mul_<uchar, float>,
0,
mul_<ushort, float>,
mul_<short, float>,
mul_<int, double>,
mul_<float, float>,
mul_<double, double>,
0
};
MulDivFunc func = tab[src1.depth()];
......@@ -954,8 +1046,14 @@ void divide(double scale, const Mat& src, Mat& dst)
{
static RecipFunc tab[] =
{
recip_<uchar>, 0, recip_<ushort>, recip_<short>,
recip_<int>, recip_<float>, recip_<double>, 0
recip_<uchar>,
0,
recip_<ushort>,
recip_<short>,
recip_<int>,
recip_<float>,
recip_<double>,
0
};
RecipFunc func = tab[src.depth()];
......@@ -1122,10 +1220,16 @@ typedef void (*AddWeightedFunc)( const Mat& src1, double alpha, const Mat& src2,
void addWeighted( const Mat& src1, double alpha, const Mat& src2,
double beta, double gamma, Mat& dst )
{
static AddWeightedFunc tab[]=
static AddWeightedFunc tab[] =
{
addWeighted8u, 0, addWeighted_<ushort, float>, addWeighted_<short, float>,
addWeighted_<int, double>, addWeighted_<float, float>, addWeighted_<double, double>, 0
addWeighted8u,
0,
addWeighted_<ushort, float>,
addWeighted_<short, float>,
addWeighted_<int, double>,
addWeighted_<float, float>,
addWeighted_<double, double>,
0
};
AddWeightedFunc func = tab[src1.depth()];
......@@ -1176,12 +1280,14 @@ void absdiff( const Mat& src1, const Mat& src2, Mat& dst )
{
static BinaryFunc tab[] =
{
binaryOpC1_<OpAbsDiff<uchar>,VAbsDiff8u>, 0,
binaryOpC1_<OpAbsDiff<uchar>,VAbsDiff8u>,
0,
binaryOpC1_<OpAbsDiff<ushort>,VAbsDiff16u>,
binaryOpC1_<OpAbsDiff<short>,VAbsDiff16s>,
binaryOpC1_<OpAbsDiff<int>,NoVec>,
binaryOpC1_<OpAbsDiff<float>,VAbsDiff32f>,
binaryOpC1_<OpAbsDiff<double>,NoVec>, 0
binaryOpC1_<OpAbsDiff<double>,NoVec>,
0
};
binaryOp(src1, src2, dst, tab[src1.depth()]);
......@@ -1192,12 +1298,14 @@ void absdiff( const Mat& src1, const Scalar& s, Mat& dst )
{
static BinarySFuncCn tab[] =
{
binarySOpCn_<OpAbsDiffS<uchar, int> >, 0,
binarySOpCn_<OpAbsDiffS<uchar, int> >,
0,
binarySOpCn_<OpAbsDiffS<ushort, int> >,
binarySOpCn_<OpAbsDiffS<short, int> >,
binarySOpCn_<OpAbsDiffS<int> >,
binarySOpCn_<OpAbsDiffS<float> >,
binarySOpCn_<OpAbsDiffS<double> >, 0
binarySOpCn_<OpAbsDiffS<double> >,
0
};
BinarySFuncCn func = tab[src1.depth()];
......@@ -1315,33 +1423,41 @@ void inRange(const Mat& src, const Mat& lowerb,
{
static InRangeFunc tab[] =
{
inRange_<InRangeC1<uchar, uchar> >, 0,
inRange_<InRangeC1<uchar, uchar> >,
0,
inRange_<InRangeC1<ushort, ushort> >,
inRange_<InRangeC1<short, short> >,
inRange_<InRangeC1<int, int> >,
inRange_<InRangeC1<float, float> >,
inRange_<InRangeC1<double, double> >, 0,
inRange_<InRangeC1<double, double> >,
0,
inRange_<InRangeC2<uchar, uchar> >, 0,
inRange_<InRangeC2<uchar, uchar> >,
0,
inRange_<InRangeC2<ushort, ushort> >,
inRange_<InRangeC2<short, short> >,
inRange_<InRangeC2<int, int> >,
inRange_<InRangeC2<float, float> >,
inRange_<InRangeC2<double, double> >, 0,
inRange_<InRangeC2<double, double> >,
0,
inRange_<InRangeC3<uchar, uchar> >, 0,
inRange_<InRangeC3<uchar, uchar> >,
0,
inRange_<InRangeC3<ushort, ushort> >,
inRange_<InRangeC3<short, short> >,
inRange_<InRangeC3<int, int> >,
inRange_<InRangeC3<float, float> >,
inRange_<InRangeC3<double, double> >, 0,
inRange_<InRangeC3<double, double> >,
0,
inRange_<InRangeC4<uchar, uchar> >, 0,
inRange_<InRangeC4<uchar, uchar> >,
0,
inRange_<InRangeC4<ushort, ushort> >,
inRange_<InRangeC4<short, short> >,
inRange_<InRangeC4<int, int> >,
inRange_<InRangeC4<float, float> >,
inRange_<InRangeC4<double, double> >, 0
inRange_<InRangeC4<double, double> >,
0
};
CV_Assert( src.type() == lowerb.type() && src.type() == upperb.type() && src.channels() <= 4 );
......@@ -1371,33 +1487,41 @@ void inRange(const Mat& src, const Scalar& lowerb,
{
static InRangeSFunc tab[] =
{
inRangeS_<InRangeC1<uchar, int> >, 0,
inRangeS_<InRangeC1<uchar, int> >,
0,
inRangeS_<InRangeC1<ushort, int> >,
inRangeS_<InRangeC1<short, int> >,
inRangeS_<InRangeC1<int, int> >,
inRangeS_<InRangeC1<float, float> >,
inRangeS_<InRangeC1<double, double> >, 0,
inRangeS_<InRangeC1<double, double> >,
0,
inRangeS_<InRangeC2<uchar, int> >, 0,
inRangeS_<InRangeC2<uchar, int> >,
0,
inRangeS_<InRangeC2<ushort, int> >,
inRangeS_<InRangeC2<short, int> >,
inRangeS_<InRangeC2<int, int> >,
inRangeS_<InRangeC2<float, float> >,
inRangeS_<InRangeC2<double, double> >, 0,
inRangeS_<InRangeC2<double, double> >,
0,
inRangeS_<InRangeC3<uchar, int> >, 0,
inRangeS_<InRangeC3<uchar, int> >,
0,
inRangeS_<InRangeC3<ushort, int> >,
inRangeS_<InRangeC3<short, int> >,
inRangeS_<InRangeC3<int, int> >,
inRangeS_<InRangeC3<float, float> >,
inRangeS_<InRangeC3<double, double> >, 0,
inRangeS_<InRangeC3<double, double> >,
0,
inRangeS_<InRangeC4<uchar, int> >, 0,
inRangeS_<InRangeC4<uchar, int> >,
0,
inRangeS_<InRangeC4<ushort, int> >,
inRangeS_<InRangeC4<short, int> >,
inRangeS_<InRangeC4<int, int> >,
inRangeS_<InRangeC4<float, float> >,
inRangeS_<InRangeC4<double, double> >, 0
inRangeS_<InRangeC4<double, double> >,
0
};
CV_Assert( src.channels() <= 4 );
......@@ -1453,19 +1577,27 @@ void compare( const Mat& src1, const Mat& src2, Mat& dst, int cmpOp )
{
static BinaryFunc tab[][8] =
{
{binaryOpC1_<CmpGT<uchar>,VCmpGT8u>, 0,
{
binaryOpC1_<CmpGT<uchar>,VCmpGT8u>,
0,
binaryOpC1_<CmpGT<ushort>,NoVec>,
binaryOpC1_<CmpGT<short>,NoVec>,
binaryOpC1_<CmpGT<int>,NoVec>,
binaryOpC1_<CmpGT<float>,NoVec>,
binaryOpC1_<CmpGT<double>,NoVec>, 0},
binaryOpC1_<CmpGT<double>,NoVec>,
0
},
{binaryOpC1_<CmpEQ<uchar>,VCmpEQ8u>, 0,
{
binaryOpC1_<CmpEQ<uchar>,VCmpEQ8u>,
0,
binaryOpC1_<CmpEQ<ushort>,NoVec>,
binaryOpC1_<CmpEQ<ushort>,NoVec>, // same function as for ushort's
binaryOpC1_<CmpEQ<int>,NoVec>,
binaryOpC1_<CmpEQ<float>,NoVec>,
binaryOpC1_<CmpEQ<double>,NoVec>, 0},
binaryOpC1_<CmpEQ<double>,NoVec>,
0
},
};
CV_Assert(src1.channels() == 1);
......@@ -1479,20 +1611,25 @@ void compare( const Mat& src1, const Mat& src2, Mat& dst, int cmpOp )
case CMP_GT:
case CMP_EQ:
break;
case CMP_GE:
std::swap( psrc1, psrc2 );
invflag = true;
break;
case CMP_LT:
std::swap( psrc1, psrc2 );
break;
case CMP_LE:
invflag = true;
break;
case CMP_NE:
cmpOp = CMP_EQ;
invflag = true;
break;
default:
CV_Error(CV_StsBadArg, "Unknown comparison method");
}
......@@ -1508,26 +1645,38 @@ void compare( const Mat& src1, double value, Mat& dst, int cmpOp )
{
static BinarySFuncC1 tab[][8] =
{
{binarySOpC1_<CmpEQ<uchar, int> >, 0,
{
binarySOpC1_<CmpEQ<uchar, int> >,
0,
binarySOpC1_<CmpEQ<ushort, int> >,
binarySOpC1_<CmpEQ<short, int> >,
binarySOpC1_<CmpEQ<int> >,
binarySOpC1_<CmpEQ<float> >,
binarySOpC1_<CmpEQ<double> >, 0},
binarySOpC1_<CmpEQ<double> >,
0
},
{binarySOpC1_<CmpGT<uchar, int> >, 0,
{
binarySOpC1_<CmpGT<uchar, int> >,
0,
binarySOpC1_<CmpGT<ushort, int> >,
binarySOpC1_<CmpGT<short, int> >,
binarySOpC1_<CmpGT<int> >,
binarySOpC1_<CmpGT<float> >,
binarySOpC1_<CmpGT<double> >, 0},
binarySOpC1_<CmpGT<double> >,
0
},
{binarySOpC1_<CmpGE<uchar, int> >, 0,
{
binarySOpC1_<CmpGE<uchar, int> >,
0,
binarySOpC1_<CmpGE<ushort, int> >,
binarySOpC1_<CmpGE<short, int> >,
binarySOpC1_<CmpGE<int> >,
binarySOpC1_<CmpGE<float> >,
binarySOpC1_<CmpGE<double> >, 0},
binarySOpC1_<CmpGE<double> >,
0
},
};
int depth = src1.depth();
......@@ -1539,18 +1688,22 @@ void compare( const Mat& src1, double value, Mat& dst, int cmpOp )
case CMP_EQ:
case CMP_GE:
break;
case CMP_LT:
invflag = true;
cmpOp = CMP_GE;
break;
case CMP_LE:
invflag = true;
cmpOp = CMP_GT;
break;
case CMP_NE:
invflag = true;
cmpOp = CMP_EQ;
break;
default:
CV_Error(CV_StsBadArg, "Unknown comparison method");
}
......@@ -1607,9 +1760,14 @@ void min( const Mat& src1, const Mat& src2, Mat& dst )
{
static BinaryFunc tab[] =
{
binaryOpC1_<MinOp<uchar>,VMin8u>, 0, binaryOpC1_<MinOp<ushort>,VMin16u>,
binaryOpC1_<MinOp<short>,VMin16s>, binaryOpC1_<MinOp<int>,NoVec>,
binaryOpC1_<MinOp<float>,VMin32f>, binaryOpC1_<MinOp<double>,NoVec>, 0
binaryOpC1_<MinOp<uchar>,VMin8u>,
0,
binaryOpC1_<MinOp<ushort>,VMin16u>,
binaryOpC1_<MinOp<short>,VMin16s>,
binaryOpC1_<MinOp<int>,NoVec>,
binaryOpC1_<MinOp<float>,VMin32f>,
binaryOpC1_<MinOp<double>,NoVec>,
0
};
binaryOp(src1, src2, dst, tab[src1.depth()]);
......@@ -1619,9 +1777,14 @@ void max( const Mat& src1, const Mat& src2, Mat& dst )
{
static BinaryFunc tab[] =
{
binaryOpC1_<MaxOp<uchar>,VMax8u>, 0, binaryOpC1_<MaxOp<ushort>,VMax16u>,
binaryOpC1_<MaxOp<short>,VMax16s>, binaryOpC1_<MaxOp<int>,NoVec>,
binaryOpC1_<MaxOp<float>,VMax32f>, binaryOpC1_<MaxOp<double>,NoVec>, 0
binaryOpC1_<MaxOp<uchar>,VMax8u>,
0,
binaryOpC1_<MaxOp<ushort>,VMax16u>,
binaryOpC1_<MaxOp<short>,VMax16s>,
binaryOpC1_<MaxOp<int>,NoVec>,
binaryOpC1_<MaxOp<float>,VMax32f>,
binaryOpC1_<MaxOp<double>,NoVec>,
0
};
binaryOp(src1, src2, dst, tab[src1.depth()]);
......@@ -1631,12 +1794,14 @@ void min( const Mat& src1, double value, Mat& dst )
{
static BinarySFuncC1 tab[] =
{
binarySOpC1_<MinOp<uchar> >, 0,
binarySOpC1_<MinOp<uchar> >,
0,
binarySOpC1_<MinOp<ushort> >,
binarySOpC1_<MinOp<short> >,
binarySOpC1_<MinOp<int> >,
binarySOpC1_<MinOp<float> >,
binarySOpC1_<MinOp<double> >, 0
binarySOpC1_<MinOp<double> >,
0
};
BinarySFuncC1 func = tab[src1.depth()];
......@@ -1655,6 +1820,7 @@ void min( const Mat& src1, double value, Mat& dst )
}
dst.create(src1.size(), src1.type());
return func( src1, dst, value );
}
......@@ -1662,12 +1828,14 @@ void max( const Mat& src1, double value, Mat& dst )
{
static BinarySFuncC1 tab[] =
{
binarySOpC1_<MaxOp<uchar> >, 0,
binarySOpC1_<MaxOp<uchar> >,
0,
binarySOpC1_<MaxOp<ushort> >,
binarySOpC1_<MaxOp<short> >,
binarySOpC1_<MaxOp<int> >,
binarySOpC1_<MaxOp<float> >,
binarySOpC1_<MaxOp<double> >, 0
binarySOpC1_<MaxOp<double> >,
0
};
BinarySFuncC1 func = tab[src1.depth()];
......@@ -1686,10 +1854,11 @@ void max( const Mat& src1, double value, Mat& dst )
}
dst.create(src1.size(), src1.type());
return func( src1, dst, value );
}
}
} // namespace cv
/****************************************************************************************\
* Earlier API: cvAdd etc. *
......@@ -1715,6 +1884,7 @@ cvAnd( const CvArr* srcarr1, const CvArr* srcarr2, CvArr* dstarr, const CvArr* m
cv::bitwise_and( src1, src2, dst, mask );
}
CV_IMPL void
cvOr( const CvArr* srcarr1, const CvArr* srcarr2, CvArr* dstarr, const CvArr* maskarr )
{
......@@ -1771,6 +1941,7 @@ cvXorS( const CvArr* srcarr, CvScalar s, CvArr* dstarr, const CvArr* maskarr )
cv::bitwise_xor( src, s, dst, mask );
}
CV_IMPL void cvAdd( const CvArr* srcarr1, const CvArr* srcarr2, CvArr* dstarr, const CvArr* maskarr )
{
cv::Mat src1 = cv::cvarrToMat(srcarr1), src2 = cv::cvarrToMat(srcarr2),
......@@ -1781,6 +1952,7 @@ CV_IMPL void cvAdd( const CvArr* srcarr1, const CvArr* srcarr2, CvArr* dstarr, c
cv::add( src1, src2, dst, mask );
}
CV_IMPL void cvSub( const CvArr* srcarr1, const CvArr* srcarr2, CvArr* dstarr, const CvArr* maskarr )
{
cv::Mat src1 = cv::cvarrToMat(srcarr1), src2 = cv::cvarrToMat(srcarr2),
......@@ -1791,6 +1963,7 @@ CV_IMPL void cvSub( const CvArr* srcarr1, const CvArr* srcarr2, CvArr* dstarr, c
cv::subtract( src1, src2, dst, mask );
}
CV_IMPL void cvAddS( const CvArr* srcarr1, CvScalar value, CvArr* dstarr, const CvArr* maskarr )
{
cv::Mat src1 = cv::cvarrToMat(srcarr1),
......@@ -1801,6 +1974,7 @@ CV_IMPL void cvAddS( const CvArr* srcarr1, CvScalar value, CvArr* dstarr, const
cv::add( src1, value, dst, mask );
}
CV_IMPL void cvSubRS( const CvArr* srcarr1, CvScalar value, CvArr* dstarr, const CvArr* maskarr )
{
cv::Mat src1 = cv::cvarrToMat(srcarr1),
......@@ -1811,6 +1985,7 @@ CV_IMPL void cvSubRS( const CvArr* srcarr1, CvScalar value, CvArr* dstarr, const
cv::subtract( value, src1, dst, mask );
}
CV_IMPL void cvMul( const CvArr* srcarr1, const CvArr* srcarr2,
CvArr* dstarr, double scale )
{
......@@ -1820,6 +1995,7 @@ CV_IMPL void cvMul( const CvArr* srcarr1, const CvArr* srcarr2,
cv::multiply( src1, src2, dst, scale );
}
CV_IMPL void cvDiv( const CvArr* srcarr1, const CvArr* srcarr2,
CvArr* dstarr, double scale )
{
......@@ -1865,6 +2041,7 @@ cvAbsDiffS( const CvArr* srcarr1, CvArr* dstarr, CvScalar scalar )
cv::absdiff( src1, scalar, dst );
}
CV_IMPL void
cvInRange( const void* srcarr1, const void* srcarr2,
const void* srcarr3, void* dstarr )
......@@ -1875,6 +2052,7 @@ cvInRange( const void* srcarr1, const void* srcarr2,
cv::inRange( src1, cv::cvarrToMat(srcarr2), cv::cvarrToMat(srcarr3), dst );
}
CV_IMPL void
cvInRangeS( const void* srcarr1, CvScalar lowerb, CvScalar upperb, void* dstarr )
{
......@@ -1924,6 +2102,7 @@ cvMax( const void* srcarr1, const void* srcarr2, void* dstarr )
cv::max( src1, cv::cvarrToMat(srcarr2), dst );
}
CV_IMPL void
cvMinS( const void* srcarr1, double value, void* dstarr )
{
......
......@@ -1787,6 +1787,9 @@ void CvTS::print_summary_header( int streams )
{
char csv_header[256], *ptr = csv_header;
int i;
#ifdef HAVE_IPP
const IppLibraryVersion* ippver = ippGetLibVersion();
#endif
printf( streams, "Engine: %s\n", version );
time_t t1;
......@@ -1801,7 +1804,11 @@ void CvTS::print_summary_header( int streams )
printf( streams, "Tested Libraries: %s\n", lib_verinfo );
printf( streams, "Optimized Low-level Plugin\'s: %s\n", plugins );
printf( streams, "=================================================\n");
#ifdef HAVE_IPP
printf( streams, "Built with Intel(R) IPP\n" );
printf( streams, " %s {%d.%d.%d.%d %s}\n", ippver->Version, ippver->major, ippver->minor, ippver->majorBuild, ippver->build, ippver->BuildDate );
printf( streams, "=================================================\n");
#endif
sprintf( ptr, "funcName,dataType,channels,size," );
ptr += strlen(ptr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment