precalculate indices

This commit is contained in:
Adrien BAK 2014-10-14 12:31:56 +09:00
parent 419450689b
commit cb76d00f5f

View File

@ -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
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
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*channel+c] - patchYLinePtr[j*channel+c]) >
abs(destinationXLinePtr[j*channel+c] - destinationYLinePtr[j*channel+c]))
{
patchXLinePtr[j*channel+c] *= binaryMaskLinePtr[j]; if(abs(patchXLinePtr[j] - patchYLinePtr[j]) >
patchYLinePtr[j*channel+c] *= binaryMaskLinePtr[j]; abs(destinationXLinePtr[j] - destinationYLinePtr[j]))
} {
else patchXLinePtr[j] *= binaryMaskLinePtr[maskIndex];
{ patchYLinePtr[j] *= binaryMaskLinePtr[maskIndex];
patchXLinePtr[j*channel+c] = destinationXLinePtr[j*channel+c] }
* binaryMaskLinePtr[j]; else
patchGradientY.ptr<float>(i)[j*channel+c] = destinationYLinePtr[j*channel+c] {
* binaryMaskLinePtr[j]; patchXLinePtr[j] = destinationXLinePtr[j]
} * binaryMaskLinePtr[maskIndex];
patchYLinePtr[j] = destinationYLinePtr[j]
* binaryMaskLinePtr[maskIndex];
} }
} }
} }
break; }
break;
case MONOCHROME_TRANSFER: case MONOCHROME_TRANSFER:
Mat gray = Mat(patch.size(),CV_8UC1); Mat gray = Mat(patch.size(),CV_8UC1);