diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 556498353..3493beca9 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -2102,6 +2102,9 @@ CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst, CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src); //! computes the number of nonzero array elements CV_EXPORTS_W int countNonZero( InputArray src ); +//! returns the list of locations of non-zero pixels +CV_EXPORTS_W void findNonZero( InputArray src, OutputArray idx ); + //! computes mean value of selected array elements CV_EXPORTS_W Scalar mean(InputArray src, InputArray mask=noArray()); //! computes mean value and standard deviation of all or selected array elements diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index 6744b1781..09f1d4833 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -1904,6 +1904,28 @@ void cv::batchDistance( InputArray _src1, InputArray _src2, } +void cv::findNonZero( InputArray _src, OutputArray _idx ) +{ + Mat src = _src.getMat(); + CV_Assert( src.type() == CV_8UC1 ); + int n = countNonZero(src); + if( _idx.kind() == _InputArray::MAT && !_idx.getMatRef().isContinuous() ) + _idx.release(); + _idx.create(n, 1, CV_32SC2); + Mat idx = _idx.getMat(); + CV_Assert(idx.isContinuous()); + Point* idx_ptr = (Point*)idx.data; + + for( int i = 0; i < src.rows; i++ ) + { + const uchar* bin_ptr = src.ptr(i); + for( int j = 0; j < src.cols; j++ ) + if( bin_ptr[j] ) + *idx_ptr++ = Point(j, i); + } +} + + CV_IMPL CvScalar cvSum( const CvArr* srcarr ) { cv::Scalar sum = cv::sum(cv::cvarrToMat(srcarr, false, true, 1));