Ask Your Question

Revision history [back]

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

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);
}