if( cn > 1 )
CV_Error( CV_StsBadArg, "Invalid image type (must be single-channel)" );
+#if defined HAVE_IPP && (IPP_VERSION_MAJOR >= 8) && (IPP_VERSION_MINOR >= 1)
+ if (!binary)
+ {
+ IppiSize roi = {mat.cols, mat.rows};
+ IppiMomentState_64f *moment;
+ // ippiMomentInitAlloc_64f, ippiMomentFree_64f are deprecate in 8.1, but there are not another way
+ // to initialize IppiMomentState_64f. When GetStateSize and Init functions will appears we have to
+ // change our code.
+ if (0 <= ippiMomentInitAlloc_64f(&moment, ippAlgHintAccurate))
+ {
+ IppStatus sts = (IppStatus)(-1);
+ if (depth == CV_8U)
+ sts = ippiMoments64f_8u_C1R((const Ipp8u *)mat.data, (int)mat.step, roi, moment);
+ else if( depth == CV_16U )
+ sts = ippiMoments64f_16u_C1R((const Ipp16u *)mat.data, (int)mat.step, roi, moment);
+ else if( depth == CV_32F )
+ sts = ippiMoments64f_32f_C1R((const Ipp32f *)mat.data, (int)mat.step, roi, moment);
+ if (0 <= sts)
+ {
+ IppiPoint point = {0, 0};
+ ippiGetSpatialMoment_64f(moment, 0, 0, 0, point, &m.m00);
+ ippiGetSpatialMoment_64f(moment, 1, 0, 0, point, &m.m10);
+ ippiGetSpatialMoment_64f(moment, 0, 1, 0, point, &m.m01);
+
+ ippiGetSpatialMoment_64f(moment, 2, 0, 0, point, &m.m20);
+ ippiGetSpatialMoment_64f(moment, 1, 1, 0, point, &m.m11);
+ ippiGetSpatialMoment_64f(moment, 0, 2, 0, point, &m.m02);
+
+ ippiGetSpatialMoment_64f(moment, 3, 0, 0, point, &m.m30);
+ ippiGetSpatialMoment_64f(moment, 2, 1, 0, point, &m.m21);
+ ippiGetSpatialMoment_64f(moment, 1, 2, 0, point, &m.m12);
+ ippiGetSpatialMoment_64f(moment, 0, 3, 0, point, &m.m03);
+ ippiGetCentralMoment_64f(moment, 2, 0, 0, &m.mu20);
+ ippiGetCentralMoment_64f(moment, 1, 1, 0, &m.mu11);
+ ippiGetCentralMoment_64f(moment, 0, 2, 0, &m.mu02);
+ ippiGetCentralMoment_64f(moment, 3, 0, 0, &m.mu30);
+ ippiGetCentralMoment_64f(moment, 2, 1, 0, &m.mu21);
+ ippiGetCentralMoment_64f(moment, 1, 2, 0, &m.mu12);
+ ippiGetCentralMoment_64f(moment, 0, 3, 0, &m.mu03);
+ ippiGetNormalizedCentralMoment_64f(moment, 2, 0, 0, &m.nu20);
+ ippiGetNormalizedCentralMoment_64f(moment, 1, 1, 0, &m.nu11);
+ ippiGetNormalizedCentralMoment_64f(moment, 0, 2, 0, &m.nu02);
+ ippiGetNormalizedCentralMoment_64f(moment, 3, 0, 0, &m.nu30);
+ ippiGetNormalizedCentralMoment_64f(moment, 2, 1, 0, &m.nu21);
+ ippiGetNormalizedCentralMoment_64f(moment, 1, 2, 0, &m.nu12);
+ ippiGetNormalizedCentralMoment_64f(moment, 0, 3, 0, &m.nu03);
+
+ ippiMomentFree_64f(moment);
+ return m;
+ }
+ ippiMomentFree_64f(moment);
+ }
+ }
+#endif
+
if( binary || depth == CV_8U )
func = momentsInTile<uchar, int, int>;
else if( depth == CV_16U )