Commit fd63e177 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge remote-tracking branch 'upstream/3.4' into merge-3.4

parents 9110ccb2 6bd26d33
......@@ -119,9 +119,9 @@ struct MACEImpl CV_FINAL : MACE {
int IMGSIZE_2X = IMGSIZE * 2;
int TOTALPIXEL = IMGSIZE_2X * IMGSIZE_2X;
Mat_<Vec2d> D(TOTALPIXEL, 1, 0.0);
Mat_<Vec2d> S(TOTALPIXEL, size, 0.0);
Mat_<Vec2d> SPLUS(size, TOTALPIXEL, 0.0);
Mat_<double> D(TOTALPIXEL, 1, 0.0);
Mat_<Vec2d> S(TOTALPIXEL, size, Vec2d(0,0));
Mat_<Vec2d> SPLUS(size, TOTALPIXEL, Vec2d(0,0));
for (int i=0; i<size; i++) {
Mat_<Vec2d> dftImg = isdft ? images[i] : dftImage(images[i]);
for (int l=0; l<IMGSIZE_2X; l++) {
......@@ -130,35 +130,24 @@ struct MACEImpl CV_FINAL : MACE {
Vec2d s = dftImg(l, m);
S(j, i) = s;
SPLUS(i, j) = Vec2d(s[0], -s[1]);
D(j, 0)[0] += (s[0]*s[0]) + (s[1]*s[1]);
D(j, 0) += (s[0]*s[0]) + (s[1]*s[1]);
}
}
}
Mat_<double> DSQ; cv::sqrt(D, DSQ);
Mat_<double> DINV = TOTALPIXEL * size / DSQ;
#if 0 // https://github.com/opencv/opencv_contrib/issues/1848
// FIXIT What is expected here? complex numbers math?
// D(,)[1] is 0 (always)
Mat sq; cv::sqrt(D, sq); // Per-element sqrt(): sq(,)[1] is 0 (always)
Mat_<Vec2d> DINV = TOTALPIXEL * size / sq; // "per-element" division which provides "Inf"
#else
Mat sq; cv::sqrt(D.reshape(1).col(0), sq);
Mat_<Vec2d> DINV(TOTALPIXEL, 1, Vec2d(0, 0));
DINV.reshape(1).col(0) = TOTALPIXEL * size / sq;
#endif
Mat_<Vec2d> DINV_S(TOTALPIXEL, size, 0.0);
Mat_<Vec2d> SPLUS_DINV(size, TOTALPIXEL, 0.0);
Mat_<Vec2d> DINV_S(TOTALPIXEL, size);
Mat_<Vec2d> SPLUS_DINV(size, TOTALPIXEL);
for (int l=0; l<size; l++) {
for (int m=0; m<TOTALPIXEL; m++) {
SPLUS_DINV(l, m)[0] = SPLUS(l,m)[0] * DINV(m,0)[0];
SPLUS_DINV(l, m)[1] = SPLUS(l,m)[1] * DINV(m,0)[1]; // FIXIT: DINV(,)[1] is 0 (always)
DINV_S(m, l)[0] = S(m,l)[0] * DINV(m,0)[0];
DINV_S(m, l)[1] = S(m,l)[1] * DINV(m,0)[1];
DINV_S(m, l) = S(m,l) * DINV(m,0);
SPLUS_DINV(l, m) = SPLUS(l,m) * DINV(m,0);
}
}
Mat_<Vec2d> SPLUS_DINV_S = SPLUS_DINV * S;
Mat_<Vec2d> SPLUS_DINV_S_INV(size, size);
Mat_<double> SPLUS_DINV_S_INV_1(2*size, 2*size);
Mat_<double> SPLUS_DINV_S_INV_1(2*size, 2*size, 0.0);
for (int l=0; l<size; l++) {
for (int m=0; m<size; m++) {
Vec2d s = SPLUS_DINV_S(l, m);
......@@ -170,6 +159,7 @@ struct MACEImpl CV_FINAL : MACE {
}
invert(SPLUS_DINV_S_INV_1, SPLUS_DINV_S_INV_1);
Mat_<Vec2d> SPLUS_DINV_S_INV(size, size);
for (int l=0; l<size; l++) {
for (int m=0; m<size; m++) {
SPLUS_DINV_S_INV(l, m) = Vec2d(SPLUS_DINV_S_INV_1(l,m), SPLUS_DINV_S_INV_1(l,m+size));
......@@ -177,7 +167,7 @@ struct MACEImpl CV_FINAL : MACE {
}
Mat_<Vec2d> Hmace = DINV_S * SPLUS_DINV_S_INV;
Mat_<Vec2d> C(size,1, Vec2d(1,0));
Mat_<Vec2d> C(size, 1, Vec2d(1,0));
maceFilter = Mat(Hmace * C).reshape(2,IMGSIZE_2X);
}
......
......@@ -675,6 +675,10 @@ namespace cv{
if(region.width>img.cols)region.width=img.cols;
if(region.height>img.rows)region.height=img.rows;
// return false if region is empty
if (region.empty())
return false;
patch=img(region).clone();
// add some padding to compensate when the patch is outside image border
......
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