template<typename _Tp, typename _AccTp> static inline _AccTp normL1(const _Tp* a, int n) { _AccTp s = 0; int i = 0; #if CV_ENABLE_UNROLLED for(; i <= n - 4; i += 4 ) { s += (_AccTp)cv_abs(a[i]) + (_AccTp)cv_abs(a[i+1]) + (_AccTp)cv_abs(a[i+2]) + (_AccTp)cv_abs(a[i+3]); } #endif for( ; i < n; i++ ) s += cv_abs(a[i]); return s; }
template<typename _Tp, typename _AccTp> static inline _AccTp normInf(const _Tp* a, int n) { _AccTp s = 0; for( int i = 0; i < n; i++ ) s = std::max(s, (_AccTp)cv_abs(a[i])); return s; }
template<typename T, typename ST> int normL1_(const T* src, const uchar* mask, ST* _result, int len, int cn) { ST result = *_result; if( !mask ) { result += normL1<T, ST>(src, len*cn); } else { for( int i = 0; i < len; i++, src += cn ) if( mask[i] ) { for( int k = 0; k < cn; k++ ) result += cv_abs(src[k]); } } *_result = result; return 0; }