void fftShift(cv::InputOutputArray _out) { cv::Mat out = _out.getMat(); if(out.rows == 1 && out.cols == 1) { // trivially shifted. return; } std::vector<cv::Mat> planes; planes.push_back(out); int xMid = out.cols >> 1; int yMid = out.rows >> 1; bool is_1d = xMid == 0 || yMid == 0; if(is_1d) { xMid = xMid + yMid; for(size_t i = 0; i < planes.size(); i++) { Mat tmp; Mat half0(planes[i], Rect(0, 0, xMid, 1)); Mat half1(planes[i], Rect(xMid, 0, xMid, 1)); half0.copyTo(tmp); half1.copyTo(half0); tmp.copyTo(half1); } } else { for(size_t i = 0; i < planes.size(); i++) { // perform quadrant swaps... Mat tmp; Mat q0(planes[i], Rect(0, 0, xMid, yMid)); Mat q1(planes[i], Rect(xMid, 0, xMid, yMid)); Mat q2(planes[i], Rect(0, yMid, xMid, yMid)); Mat q3(planes[i], Rect(xMid, yMid, xMid, yMid)); q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2); } } merge(planes, out); }
//from phasecorr.cpp within opencv library code void fftShift(cv::Mat& out) { if(out.rows == 1 && out.cols == 1) { // trivially shifted. return; } std::vector<cv::Mat> planes; cv::split(out, planes); int xMid = out.cols >> 1; int yMid = out.rows >> 1; bool is_1d = xMid == 0 || yMid == 0; if(is_1d) { xMid = xMid + yMid; for(size_t i = 0; i < planes.size(); i++) { cv::Mat tmp; cv::Mat half0(planes[i], cv::Rect(0, 0, xMid, 1)); cv::Mat half1(planes[i], cv::Rect(xMid, 0, xMid, 1)); half0.copyTo(tmp); half1.copyTo(half0); tmp.copyTo(half1); } } else { for(size_t i = 0; i < planes.size(); i++) { // perform quadrant swaps... cv::Mat tmp; cv::Mat q0(planes[i], cv::Rect(0, 0, xMid, yMid)); cv::Mat q1(planes[i], cv::Rect(xMid, 0, xMid, yMid)); cv::Mat q2(planes[i], cv::Rect(0, yMid, xMid, yMid)); cv::Mat q3(planes[i], cv::Rect(xMid, yMid, xMid, yMid)); q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2); } } cv::merge(planes, out); }