Commit cb76d00f authored by Adrien BAK's avatar Adrien BAK

precalculate indices

parent 41945068
...@@ -343,9 +343,10 @@ void Cloning::evaluate(const Mat &I, const Mat &wmask, const Mat &cloned) ...@@ -343,9 +343,10 @@ void Cloning::evaluate(const Mat &I, const Mat &wmask, const Mat &cloned)
void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &binaryMask, Mat &cloned, int flag) void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &binaryMask, Mat &cloned, int flag)
{ {
int w = destination.cols; const int w = destination.cols;
int h = destination.rows; const int h = destination.rows;
int channel = destination.channels(); const int channel = destination.channels();
const int n_elem_in_line = w * channel;
computeDerivatives(destination,patch,binaryMask); computeDerivatives(destination,patch,binaryMask);
...@@ -357,6 +358,10 @@ void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &b ...@@ -357,6 +358,10 @@ void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &b
break; break;
case MIXED_CLONE: case MIXED_CLONE:
{
AutoBuffer<int> maskIndices(n_elem_in_line);
for (int i = 0; i < n_elem_in_line; ++i)
maskIndices[i] = i / channel;
for(int i=0;i < h; i++) for(int i=0;i < h; i++)
{ {
...@@ -366,28 +371,27 @@ void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &b ...@@ -366,28 +371,27 @@ void Cloning::normalClone(const Mat &destination, const Mat &patch, const Mat &b
const float * destinationYLinePtr = destinationGradientY.ptr<float>(i); const float * destinationYLinePtr = destinationGradientY.ptr<float>(i);
const float * binaryMaskLinePtr = binaryMaskFloat.ptr<float>(i); const float * binaryMaskLinePtr = binaryMaskFloat.ptr<float>(i);
for(int j=0; j < w; j++) for(int j=0; j < n_elem_in_line; j++)
{ {
for(int c=0;c<channel;++c) int maskIndex = maskIndices[j];
if(abs(patchXLinePtr[j] - patchYLinePtr[j]) >
abs(destinationXLinePtr[j] - destinationYLinePtr[j]))
{
patchXLinePtr[j] *= binaryMaskLinePtr[maskIndex];
patchYLinePtr[j] *= binaryMaskLinePtr[maskIndex];
}
else
{ {
if(abs(patchXLinePtr[j*channel+c] - patchYLinePtr[j*channel+c]) > patchXLinePtr[j] = destinationXLinePtr[j]
abs(destinationXLinePtr[j*channel+c] - destinationYLinePtr[j*channel+c])) * binaryMaskLinePtr[maskIndex];
{ patchYLinePtr[j] = destinationYLinePtr[j]
* binaryMaskLinePtr[maskIndex];
patchXLinePtr[j*channel+c] *= binaryMaskLinePtr[j];
patchYLinePtr[j*channel+c] *= binaryMaskLinePtr[j];
}
else
{
patchXLinePtr[j*channel+c] = destinationXLinePtr[j*channel+c]
* binaryMaskLinePtr[j];
patchGradientY.ptr<float>(i)[j*channel+c] = destinationYLinePtr[j*channel+c]
* binaryMaskLinePtr[j];
}
} }
} }
} }
break; }
break;
case MONOCHROME_TRANSFER: case MONOCHROME_TRANSFER:
Mat gray = Mat(patch.size(),CV_8UC1); Mat gray = Mat(patch.size(),CV_8UC1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment