| 694 | |
| 695 | |
| 696 | void cv::meanStdDev( InputArray _src, OutputArray _mean, OutputArray _sdv, InputArray _mask ) |
| 697 | { |
| 698 | Mat src = _src.getMat(), mask = _mask.getMat(); |
| 699 | CV_Assert( mask.empty() || mask.type() == CV_8U ); |
| 700 | |
| 701 | int k, cn = src.channels(), depth = src.depth(); |
| 702 | |
| 703 | #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) |
| 704 | size_t total_size = src.total(); |
| 705 | int rows = src.size[0], cols = (int)(total_size/rows); |
| 706 | if( src.dims == 2 || (src.isContinuous() && mask.isContinuous() && cols > 0 && (size_t)rows*cols == total_size) ) |
| 707 | { |
| 708 | Ipp64f mean_temp[3]; |
| 709 | Ipp64f stddev_temp[3]; |
| 710 | Ipp64f *pmean = &mean_temp[0]; |
| 711 | Ipp64f *pstddev = &stddev_temp[0]; |
| 712 | Mat mean, stddev; |
| 713 | int dcn_mean = -1; |
| 714 | if( _mean.needed() ) |
| 715 | { |
| 716 | if( !_mean.fixedSize() ) |
| 717 | _mean.create(cn, 1, CV_64F, -1, true); |
| 718 | mean = _mean.getMat(); |
| 719 | dcn_mean = (int)mean.total(); |
| 720 | pmean = (Ipp64f *)mean.data; |
| 721 | } |
| 722 | int dcn_stddev = -1; |
| 723 | if( _sdv.needed() ) |
| 724 | { |
| 725 | if( !_sdv.fixedSize() ) |
| 726 | _sdv.create(cn, 1, CV_64F, -1, true); |
| 727 | stddev = _sdv.getMat(); |
| 728 | dcn_stddev = (int)stddev.total(); |
| 729 | pstddev = (Ipp64f *)stddev.data; |
| 730 | } |
| 731 | for( int c = cn; c < dcn_mean; c++ ) |
| 732 | pmean[c] = 0; |
| 733 | for( int c = cn; c < dcn_stddev; c++ ) |
| 734 | pstddev[c] = 0; |
| 735 | IppiSize sz = { cols, rows }; |
| 736 | int type = src.type(); |
| 737 | if( !mask.empty() ) |
| 738 | { |
| 739 | typedef IppStatus (CV_STDCALL* ippiMaskMeanStdDevFuncC1)(const void *, int, void *, int, IppiSize, Ipp64f *, Ipp64f *); |
| 740 | ippiMaskMeanStdDevFuncC1 ippFuncC1 = |
| 741 | type == CV_8UC1 ? (ippiMaskMeanStdDevFuncC1)ippiMean_StdDev_8u_C1MR : |
| 742 | type == CV_16UC1 ? (ippiMaskMeanStdDevFuncC1)ippiMean_StdDev_16u_C1MR : |
| 743 | type == CV_32FC1 ? (ippiMaskMeanStdDevFuncC1)ippiMean_StdDev_32f_C1MR : |
| 744 | 0; |
| 745 | if( ippFuncC1 ) |
| 746 | { |
| 747 | if( ippFuncC1(src.data, (int)src.step[0], mask.data, (int)mask.step[0], sz, pmean, pstddev) >= 0 ) |
| 748 | return; |
| 749 | } |
| 750 | typedef IppStatus (CV_STDCALL* ippiMaskMeanStdDevFuncC3)(const void *, int, void *, int, IppiSize, int, Ipp64f *, Ipp64f *); |
| 751 | ippiMaskMeanStdDevFuncC3 ippFuncC3 = |
| 752 | type == CV_8UC3 ? (ippiMaskMeanStdDevFuncC3)ippiMean_StdDev_8u_C3CMR : |
| 753 | type == CV_16UC3 ? (ippiMaskMeanStdDevFuncC3)ippiMean_StdDev_16u_C3CMR : |
nothing calls this directly
no test coverage detected