Why the derivate is extended in the dst function of seamlessClone source code?

asked 2017-11-23 02:15:03 -0600

Ken_du gravatar image

In the function seamlessClone the poisson equation is solved by FFT method. image description image description

My question is why the Mat temp is extended to [0, X1j,..., Xnj, 0, -Xnj, ..., -X1j] before dft? Could everyone explain this? Thanks.

void Cloning::dst(const Mat& src, Mat& dest, bool invert)
{
Mat temp = Mat::zeros(src.rows, 2 * src.cols + 2, CV_32F);

int flag = invert ? DFT_ROWS + DFT_SCALE + DFT_INVERSE: DFT_ROWS;

src.copyTo(temp(Rect(1,0, src.cols, src.rows)));

for(int j = 0 ; j < src.rows ; ++j)
{
    float * tempLinePtr = temp.ptr<float>(j);
    const float * srcLinePtr = src.ptr<float>(j);
    for(int i = 0 ; i < src.cols ; ++i)
    {
        tempLinePtr[src.cols + 2 + i] = - srcLinePtr[src.cols - 1 - i];
    }
}

Mat planes[] = {temp, Mat::zeros(temp.size(), CV_32F)};
Mat complex;

merge(planes, 2, complex);
dft(complex, complex, flag);
split(complex, planes);
temp = Mat::zeros(src.cols, 2 * src.rows + 2, CV_32F);

for(int j = 0 ; j < src.cols ; ++j)
{
    float * tempLinePtr = temp.ptr<float>(j);
    for(int i = 0 ; i < src.rows ; ++i)
    {
        float val = planes[1].ptr<float>(i)[j + 1];
        tempLinePtr[i + 1] = val;
        tempLinePtr[temp.cols - 1 - i] = - val;
    }
}

Mat planes2[] = {temp, Mat::zeros(temp.size(), CV_32F)};

merge(planes2, 2, complex);
dft(complex, complex, flag);
split(complex, planes2);

temp = planes2[1].t();
dest = Mat::zeros(src.size(), CV_32F);
temp(Rect( 0, 1, src.cols, src.rows)).copyTo(dest);
}
edit retag flag offensive close merge delete