@@ -372,37 +372,57 @@ static void fftShift(InputOutputArray _out)
372
372
373
373
if (is_1d)
374
374
{
375
+ int is_odd = (xMid > 0 && out.cols % 2 == 1 ) || (yMid > 0 && out.rows % 2 == 1 );
375
376
xMid = xMid + yMid;
376
377
377
378
for (size_t i = 0 ; i < planes.size (); i++)
378
379
{
379
380
Mat tmp;
380
- Mat half0 (planes[i], Rect (0 , 0 , xMid, 1 ));
381
- Mat half1 (planes[i], Rect (xMid, 0 , xMid, 1 ));
381
+ Mat half0 (planes[i], Rect (0 , 0 , xMid + is_odd , 1 ));
382
+ Mat half1 (planes[i], Rect (xMid + is_odd , 0 , xMid, 1 ));
382
383
383
384
half0.copyTo (tmp);
384
- half1.copyTo (half0 );
385
- tmp.copyTo (half1 );
385
+ half1.copyTo (planes[i]( Rect ( 0 , 0 , xMid, 1 )) );
386
+ tmp.copyTo (planes[i]( Rect (xMid, 0 , xMid + is_odd, 1 )) );
386
387
}
387
388
}
388
389
else
389
390
{
391
+ int isXodd = out.cols % 2 == 1 ;
392
+ int isYodd = out.rows % 2 == 1 ;
390
393
for (size_t i = 0 ; i < planes.size (); i++)
391
394
{
392
395
// perform quadrant swaps...
393
- Mat tmp;
394
- Mat q0 (planes[i], Rect (0 , 0 , xMid, yMid));
395
- Mat q1 (planes[i], Rect (xMid, 0 , xMid, yMid));
396
- Mat q2 (planes[i], Rect (0 , yMid, xMid, yMid));
397
- Mat q3 (planes[i], Rect (xMid, yMid, xMid, yMid));
398
-
399
- q0.copyTo (tmp);
400
- q3.copyTo (q0);
401
- tmp.copyTo (q3);
402
-
403
- q1.copyTo (tmp);
404
- q2.copyTo (q1);
405
- tmp.copyTo (q2);
396
+ Mat q0 (planes[i], Rect (0 , 0 , xMid + isXodd, yMid + isYodd));
397
+ Mat q1 (planes[i], Rect (xMid + isXodd, 0 , xMid, yMid + isYodd));
398
+ Mat q2 (planes[i], Rect (0 , yMid + isYodd, xMid + isXodd, yMid));
399
+ Mat q3 (planes[i], Rect (xMid + isXodd, yMid + isYodd, xMid, yMid));
400
+
401
+ if (!(isXodd || isYodd))
402
+ {
403
+ Mat tmp;
404
+ q0.copyTo (tmp);
405
+ q3.copyTo (q0);
406
+ tmp.copyTo (q3);
407
+
408
+ q1.copyTo (tmp);
409
+ q2.copyTo (q1);
410
+ tmp.copyTo (q2);
411
+ }
412
+ else
413
+ {
414
+ Mat tmp0, tmp1, tmp2 ,tmp3;
415
+ q0.copyTo (tmp0);
416
+ q1.copyTo (tmp1);
417
+ q2.copyTo (tmp2);
418
+ q3.copyTo (tmp3);
419
+
420
+ tmp0.copyTo (planes[i](Rect (xMid, yMid, xMid + isXodd, yMid + isYodd)));
421
+ tmp3.copyTo (planes[i](Rect (0 , 0 , xMid, yMid)));
422
+
423
+ tmp1.copyTo (planes[i](Rect (0 , yMid, xMid, yMid + isYodd)));
424
+ tmp2.copyTo (planes[i](Rect (xMid, 0 , xMid + isXodd, yMid)));
425
+ }
406
426
}
407
427
}
408
428
0 commit comments