int cv::countNonZero( InputArray _src )
{
- CV_Assert( _src.channels() == 1 );
+ int type = _src.type(), cn = CV_MAT_CN(type);
+ CV_Assert( cn == 1 );
#ifdef HAVE_OPENCL
int res = -1;
#endif
Mat src = _src.getMat();
- CountNonZeroFunc func = getCountNonZeroTab(src.depth());
+#if defined HAVE_IPP && !defined HAVE_IPP_ICV_ONLY
+ if (src.dims <= 2 || src.isContinuous())
+ {
+ IppiSize roiSize = { src.cols, src.rows };
+ Ipp32s count, srcstep = (Ipp32s)src.step;
+ IppStatus status = (IppStatus)-1;
+
+ if (src.isContinuous())
+ {
+ roiSize.width = (Ipp32s)src.total();
+ roiSize.height = 1;
+ srcstep = (Ipp32s)src.total() * CV_ELEM_SIZE(type);
+ }
+
+ int depth = CV_MAT_DEPTH(type);
+ if (depth == CV_8U)
+ status = ippiCountInRange_8u_C1R((const Ipp8u *)src.data, srcstep, roiSize, &count, 0, 0);
+ else if (depth == CV_32F)
+ status = ippiCountInRange_32f_C1R((const Ipp32f *)src.data, srcstep, roiSize, &count, 0, 0);
+
+ if (status >= 0)
+ return (Ipp32s)src.total() - count;
+ }
+#endif
+
+ CountNonZeroFunc func = getCountNonZeroTab(src.depth());
CV_Assert( func != 0 );
const Mat* arrays[] = {&src, 0};