| 1890 | |
| 1891 | |
| 1892 | void pow( InputArray _src, double power, OutputArray _dst ) |
| 1893 | { |
| 1894 | Mat src = _src.getMat(); |
| 1895 | int type = src.type(), depth = src.depth(), cn = src.channels(); |
| 1896 | |
| 1897 | _dst.create( src.dims, src.size, type ); |
| 1898 | Mat dst = _dst.getMat(); |
| 1899 | |
| 1900 | int ipower = cvRound(power); |
| 1901 | bool is_ipower = false; |
| 1902 | |
| 1903 | if( fabs(ipower - power) < DBL_EPSILON ) |
| 1904 | { |
| 1905 | if( ipower < 0 ) |
| 1906 | { |
| 1907 | divide( 1., src, dst ); |
| 1908 | if( ipower == -1 ) |
| 1909 | return; |
| 1910 | ipower = -ipower; |
| 1911 | src = dst; |
| 1912 | } |
| 1913 | |
| 1914 | switch( ipower ) |
| 1915 | { |
| 1916 | case 0: |
| 1917 | dst = Scalar::all(1); |
| 1918 | return; |
| 1919 | case 1: |
| 1920 | src.copyTo(dst); |
| 1921 | return; |
| 1922 | case 2: |
| 1923 | multiply(src, src, dst); |
| 1924 | return; |
| 1925 | default: |
| 1926 | is_ipower = true; |
| 1927 | } |
| 1928 | } |
| 1929 | else |
| 1930 | CV_Assert( depth == CV_32F || depth == CV_64F ); |
| 1931 | |
| 1932 | const Mat* arrays[] = {&src, &dst, 0}; |
| 1933 | uchar* ptrs[2]; |
| 1934 | NAryMatIterator it(arrays, ptrs); |
| 1935 | int len = (int)(it.size*cn); |
| 1936 | |
| 1937 | if( is_ipower ) |
| 1938 | { |
| 1939 | IPowFunc func = ipowTab[depth]; |
| 1940 | CV_Assert( func != 0 ); |
| 1941 | |
| 1942 | for( size_t i = 0; i < it.nplanes; i++, ++it ) |
| 1943 | func( ptrs[0], ptrs[1], len, ipower ); |
| 1944 | } |
| 1945 | else if( fabs(fabs(power) - 0.5) < DBL_EPSILON ) |
| 1946 | { |
| 1947 | MathFunc func = power < 0 ? |
| 1948 | (depth == CV_32F ? (MathFunc)InvSqrt_32f : (MathFunc)InvSqrt_64f) : |
| 1949 | (depth == CV_32F ? (MathFunc)Sqrt_32f : (MathFunc)Sqrt_64f); |
no test coverage detected