mirror of
https://github.com/opencv/opencv.git
synced 2025-07-31 18:07:08 +08:00
Merge pull request #25583 from mshabunin:fix-emd-32bit
imgproc: fix allocation issue in EMD
This commit is contained in:
commit
58e007e183
@ -98,7 +98,7 @@ struct EMDSolver
|
|||||||
int ssize, dsize;
|
int ssize, dsize;
|
||||||
|
|
||||||
float* cost_buf;
|
float* cost_buf;
|
||||||
Node2D* data_x;
|
AutoBuffer<Node2D, 0> data_x;
|
||||||
Node2D* end_x;
|
Node2D* end_x;
|
||||||
Node2D* enter_x;
|
Node2D* enter_x;
|
||||||
char* is_x;
|
char* is_x;
|
||||||
@ -149,7 +149,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
EMDSolver() :
|
EMDSolver() :
|
||||||
ssize(0), dsize(0), cost_buf(0), data_x(0), end_x(0), enter_x(0), is_x(0), rows_x(0),
|
ssize(0), dsize(0), cost_buf(0), end_x(0), enter_x(0), is_x(0), rows_x(0),
|
||||||
cols_x(0), u(0), v(0), idx1(0), idx2(0), loop(0), is_used(0), s(0), d(0), delta(0),
|
cols_x(0), u(0), v(0), idx1(0), idx2(0), loop(0), is_used(0), s(0), d(0), delta(0),
|
||||||
weight(0), max_cost(0)
|
weight(0), max_cost(0)
|
||||||
{
|
{
|
||||||
@ -217,14 +217,15 @@ bool EMDSolver::init(const Mat& sign1,
|
|||||||
area2.allocate(this->delta, ssize * dsize);
|
area2.allocate(this->delta, ssize * dsize);
|
||||||
area2.allocate(this->cost_buf, ssize * dsize);
|
area2.allocate(this->cost_buf, ssize * dsize);
|
||||||
area2.allocate(this->is_x, ssize * dsize);
|
area2.allocate(this->is_x, ssize * dsize);
|
||||||
area2.allocate(this->data_x, ssize + dsize, 64);
|
|
||||||
area2.allocate(this->rows_x, ssize, 64);
|
area2.allocate(this->rows_x, ssize, 64);
|
||||||
area2.allocate(this->cols_x, dsize, 64);
|
area2.allocate(this->cols_x, dsize, 64);
|
||||||
area2.allocate(this->loop, ssize + dsize + 1, 64);
|
area2.allocate(this->loop, ssize + dsize + 1, 64);
|
||||||
area2.commit();
|
area2.commit();
|
||||||
area2.zeroFill();
|
area2.zeroFill();
|
||||||
|
|
||||||
this->end_x = this->data_x;
|
this->data_x.allocate(ssize + dsize);
|
||||||
|
|
||||||
|
this->end_x = this->data_x.data();
|
||||||
this->max_cost = calcCost(sign1, sign2, dims, dfunc, cost);
|
this->max_cost = calcCost(sign1, sign2, dims, dfunc, cost);
|
||||||
callRussel();
|
callRussel();
|
||||||
this->enter_x = (this->end_x)++;
|
this->enter_x = (this->end_x)++;
|
||||||
@ -413,8 +414,8 @@ void EMDSolver::solve()
|
|||||||
double EMDSolver::calcFlow(Mat* flow_) const
|
double EMDSolver::calcFlow(Mat* flow_) const
|
||||||
{
|
{
|
||||||
double result = 0.;
|
double result = 0.;
|
||||||
Node2D* xp = 0;
|
const Node2D* xp = 0;
|
||||||
for (xp = data_x; xp < end_x; xp++)
|
for (xp = data_x.data(); xp < end_x; xp++)
|
||||||
{
|
{
|
||||||
float val = xp->val;
|
float val = xp->val;
|
||||||
const int i = xp->i;
|
const int i = xp->i;
|
||||||
@ -673,7 +674,7 @@ int EMDSolver::findLoop() const
|
|||||||
memset(is_used, 0, this->ssize + this->dsize);
|
memset(is_used, 0, this->ssize + this->dsize);
|
||||||
|
|
||||||
Node2D* new_x = loop[0] = enter_x;
|
Node2D* new_x = loop[0] = enter_x;
|
||||||
is_used[enter_x - data_x] = 1;
|
is_used[enter_x - data_x.data()] = 1;
|
||||||
int steps = 1;
|
int steps = 1;
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -682,14 +683,14 @@ int EMDSolver::findLoop() const
|
|||||||
{
|
{
|
||||||
/* find an unused x in the row */
|
/* find an unused x in the row */
|
||||||
new_x = this->rows_x[new_x->i];
|
new_x = this->rows_x[new_x->i];
|
||||||
while (new_x != 0 && is_used[new_x - data_x])
|
while (new_x != 0 && is_used[new_x - data_x.data()])
|
||||||
new_x = new_x->next[0];
|
new_x = new_x->next[0];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* find an unused x in the column, or the entering x */
|
/* find an unused x in the column, or the entering x */
|
||||||
new_x = this->cols_x[new_x->j];
|
new_x = this->cols_x[new_x->j];
|
||||||
while (new_x != 0 && is_used[new_x - data_x] && new_x != enter_x)
|
while (new_x != 0 && is_used[new_x - data_x.data()] && new_x != enter_x)
|
||||||
new_x = new_x->next[1];
|
new_x = new_x->next[1];
|
||||||
if (new_x == enter_x)
|
if (new_x == enter_x)
|
||||||
break;
|
break;
|
||||||
@ -699,7 +700,7 @@ int EMDSolver::findLoop() const
|
|||||||
{
|
{
|
||||||
/* add x to the loop */
|
/* add x to the loop */
|
||||||
loop[steps++] = new_x;
|
loop[steps++] = new_x;
|
||||||
is_used[new_x - data_x] = 1;
|
is_used[new_x - data_x.data()] = 1;
|
||||||
}
|
}
|
||||||
else /* didn't find the next x */
|
else /* didn't find the next x */
|
||||||
{
|
{
|
||||||
@ -712,18 +713,18 @@ int EMDSolver::findLoop() const
|
|||||||
{
|
{
|
||||||
new_x = new_x->next[i];
|
new_x = new_x->next[i];
|
||||||
}
|
}
|
||||||
while (new_x != 0 && is_used[new_x - data_x]);
|
while (new_x != 0 && is_used[new_x - data_x.data()]);
|
||||||
|
|
||||||
if (new_x == 0)
|
if (new_x == 0)
|
||||||
{
|
{
|
||||||
is_used[loop[--steps] - data_x] = 0;
|
is_used[loop[--steps] - data_x.data()] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (new_x == 0 && steps > 0);
|
while (new_x == 0 && steps > 0);
|
||||||
|
|
||||||
is_used[loop[steps - 1] - data_x] = 0;
|
is_used[loop[steps - 1] - data_x.data()] = 0;
|
||||||
loop[steps - 1] = new_x;
|
loop[steps - 1] = new_x;
|
||||||
is_used[new_x - data_x] = 1;
|
is_used[new_x - data_x.data()] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (steps > 0);
|
while (steps > 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user