@@ -1473,6 +1473,47 @@ typedef IppStatus (CV_STDCALL* IppDFTGetSizeFunc)(int, int, IppHintAlgorithm, in
1473
1473
typedef IppStatus (CV_STDCALL* IppDFTInitFunc)(int , int , IppHintAlgorithm, void *, uchar*);
1474
1474
#endif
1475
1475
1476
+ namespace cv
1477
+ {
1478
+ static void complementComplexOutput (Mat& dst, int len, int dft_dims)
1479
+ {
1480
+ int i, n = dst.cols ;
1481
+ size_t elem_size = dst.elemSize1 ();
1482
+ if (elem_size == sizeof (float ))
1483
+ {
1484
+ float * p0 = dst.ptr <float >();
1485
+ size_t dstep = dst.step / sizeof (p0[0 ]);
1486
+ for (i = 0 ; i < len; i++)
1487
+ {
1488
+ float * p = p0 + dstep*i;
1489
+ float * q = dft_dims == 1 || i == 0 || i * 2 == len ? p : p0 + dstep*(len - i);
1490
+
1491
+ for (int j = 1 ; j < (n + 1 ) / 2 ; j++)
1492
+ {
1493
+ p[(n - j) * 2 ] = q[j * 2 ];
1494
+ p[(n - j) * 2 + 1 ] = -q[j * 2 + 1 ];
1495
+ }
1496
+ }
1497
+ }
1498
+ else
1499
+ {
1500
+ double * p0 = dst.ptr <double >();
1501
+ size_t dstep = dst.step / sizeof (p0[0 ]);
1502
+ for (i = 0 ; i < len; i++)
1503
+ {
1504
+ double * p = p0 + dstep*i;
1505
+ double * q = dft_dims == 1 || i == 0 || i * 2 == len ? p : p0 + dstep*(len - i);
1506
+
1507
+ for (int j = 1 ; j < (n + 1 ) / 2 ; j++)
1508
+ {
1509
+ p[(n - j) * 2 ] = q[j * 2 ];
1510
+ p[(n - j) * 2 + 1 ] = -q[j * 2 + 1 ];
1511
+ }
1512
+ }
1513
+ }
1514
+ }
1515
+ }
1516
+
1476
1517
void cv::dft ( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
1477
1518
{
1478
1519
static DFTFunc dft_tbl[6 ] =
@@ -1688,8 +1729,12 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
1688
1729
memset ( dptr0, 0 , dst_full_len );
1689
1730
}
1690
1731
1691
- if ( stage != 1 )
1732
+ if (stage != 1 )
1733
+ {
1734
+ if (!inv && real_transform && dst.channels () == 2 )
1735
+ complementComplexOutput (dst, nonzero_rows, 1 );
1692
1736
break ;
1737
+ }
1693
1738
src = dst;
1694
1739
}
1695
1740
else
@@ -1831,41 +1876,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
1831
1876
if ( stage != 0 )
1832
1877
{
1833
1878
if ( !inv && real_transform && dst.channels () == 2 && len > 1 )
1834
- {
1835
- int n = dst.cols ;
1836
- if ( elem_size == (int )sizeof (float ) )
1837
- {
1838
- float * p0 = (float *)dst.data ;
1839
- size_t dstep = dst.step /sizeof (p0[0 ]);
1840
- for ( i = 0 ; i < len; i++ )
1841
- {
1842
- float * p = p0 + dstep*i;
1843
- float * q = i == 0 || i*2 == len ? p : p0 + dstep*(len-i);
1844
-
1845
- for ( int j = 1 ; j < (n+1 )/2 ; j++ )
1846
- {
1847
- p[(n-j)*2 ] = q[j*2 ];
1848
- p[(n-j)*2 +1 ] = -q[j*2 +1 ];
1849
- }
1850
- }
1851
- }
1852
- else
1853
- {
1854
- double * p0 = (double *)dst.data ;
1855
- size_t dstep = dst.step /sizeof (p0[0 ]);
1856
- for ( i = 0 ; i < len; i++ )
1857
- {
1858
- double * p = p0 + dstep*i;
1859
- double * q = i == 0 || i*2 == len ? p : p0 + dstep*(len-i);
1860
-
1861
- for ( int j = 1 ; j < (n+1 )/2 ; j++ )
1862
- {
1863
- p[(n-j)*2 ] = q[j*2 ];
1864
- p[(n-j)*2 +1 ] = -q[j*2 +1 ];
1865
- }
1866
- }
1867
- }
1868
- }
1879
+ complementComplexOutput (dst, len, 2 );
1869
1880
break ;
1870
1881
}
1871
1882
src = dst;
0 commit comments