Maybe by doing calculations in the same order ?
This commit is contained in:
parent
7c2f9b36d7
commit
3bd422ab9f
@ -107,21 +107,23 @@ std::vector<int> optimal_vertical_seam(std::vector<float> energy, int width, int
|
||||
//* Backtracking to find the path
|
||||
for (auto i=height-1; i > 0; i--) {
|
||||
// We want to find either (bot_l, bot_c, bot_r) with dyn_energy[.] = min_val - energy[cur]
|
||||
float objective_energy = min_val - energy[width*i + min_idx];
|
||||
|
||||
//! With float, we don't always have x + y - y = x
|
||||
if (nearly_equal(dyn_energy[width*(i-1) + min_idx], objective_energy)) {
|
||||
//Idea : float next_energy = min_val - energy[width*i + min_idx];
|
||||
//! With floats, we don't always have x + y - y == x, so we check is x+y == x+y
|
||||
auto is_next_idx = [=](int idx) {
|
||||
return nearly_equal(dyn_energy[(i-1)*width + idx]+energy[width*i + min_idx], min_val);
|
||||
};
|
||||
|
||||
if (is_next_idx(min_idx)) {
|
||||
// min_idx does not change
|
||||
min_val = dyn_energy[(i-1)*width + min_idx];
|
||||
} else if (min_idx > 0 && nearly_equal(dyn_energy[(i-1)*width + (min_idx-1)], objective_energy)) {
|
||||
} else if (min_idx > 0 && is_next_idx(min_idx-1)) {
|
||||
min_val = dyn_energy[(i-1)*width + (min_idx-1)];
|
||||
min_idx = min_idx - 1;
|
||||
} else if (min_idx+1 < width && nearly_equal(dyn_energy[(i-1)*width + (min_idx+1)], objective_energy)) {
|
||||
} else if (min_idx+1 < width && is_next_idx(min_idx+1)) {
|
||||
min_val = dyn_energy[(i-1)*width + (min_idx+1)];
|
||||
min_idx = min_idx + 1;
|
||||
} else {
|
||||
std::cerr << dyn_energy[(i-1)*width + min_idx] <<", "<< dyn_energy[(i-1)*width + (min_idx-1)]
|
||||
<<", "<< dyn_energy[(i-1)*width + (min_idx+1)] <<" != "<< objective_energy << std::endl;
|
||||
std::cerr << "Unable to backtrack path !" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user