www.pudn.com > match-v3.3.src.rar > kz1.cpp
/* kz1.cpp */ /* Vladimir Kolmogorov (vnk@cs.cornell.edu), 2001-2003. */ #include#include "match.h" #include "energy.h" /* if d1 and d2 are two disparities for a pixel p in the left image, then is_blocked(d1, d2) is true if (p,d2) is closer to the camera than (p,d1) */ #define is_blocked(d1, d2) (KZ1_visibility && ((d1).x > (d2).x)) /* true only for stereo */ /************************************************************/ /************************************************************/ /************************************************************/ inline int Match::KZ1_data_penalty(Coord l, Coord r) { register int v = params.denominator*(this->*data_penalty_func)(l, r); v -= params.K; if (v>0) v = 0; return v; } inline int Match::KZ1_smoothness_penalty_left(Coord p, Coord np, Coord d, Coord nd) { return (this->*smoothness_penalty_left_func)(p, np, d, nd); } inline int Match::KZ1_smoothness_penalty_right(Coord p, Coord np, Coord d, Coord nd) { return (this->*smoothness_penalty_right_func)(p, np, d, nd); } #define KZ1_OCCLUSION_PENALTY 1000 /************************************************************/ /************************************************************/ /************************************************************/ /* computes current energy */ int Match::KZ1_ComputeEnergy() { int k; Coord p, d, q, dq; E = 0; for (p.y=0; p.y =Coord(0,0) && q =Coord(0,0) && q =Coord(0,0) && q =Coord(0,0) && q add_variable(); if (d.x == OCCLUDED) e -> ADD_TERM1(var, KZ1_OCCLUSION_PENALTY, 0); } d = Coord(IMREF(x_right, p), IMREF(y_right, p)); if (a == -d) IMREF(node_vars_right, p) = VAR_ACTIVE; else { IMREF(node_vars_right, p) = var = e -> add_variable(); if (d.x == OCCLUDED) e -> ADD_TERM1(var, KZ1_OCCLUSION_PENALTY, 0); } } for (p.y=0; p.y =Coord(0,0) && q ADD_TERM2(var, qvar, KZ1_data_penalty(p, q), delta, delta, 0); } else if (is_blocked(a, d)) { e -> ADD_TERM2(var, qvar, 0, INFINITY, 0, 0); } } } q = p + a; if (q>=Coord(0,0) && q ADD_TERM2(var, qvar, 0, E0a, Ea0, Eaa); else e -> ADD_TERM1(var, E0a, Eaa); } else { if (qvar != VAR_ACTIVE) e -> ADD_TERM1(qvar, Ea0, Eaa); else e -> add_constant(Eaa); } } /* left smoothness term */ for (k=0; k =Coord(0,0) && q ADD_TERM2(var, qvar, E00, E0a, Ea0, 0); else e -> ADD_TERM1(var, E0a, 0); } else { if (qvar != VAR_ACTIVE) e -> ADD_TERM1(qvar, Ea0, 0); else {} } } /* right smoothness term */ d = Coord(IMREF(x_right, p), IMREF(y_right, p)); var = (Energy::Var) IMREF(node_vars_right, p); for (k=0; k =Coord(0,0) && q ADD_TERM2(var, qvar, E00, E0a, Ea0, 0); else e -> ADD_TERM1(var, E0a, 0); } else { if (qvar != VAR_ACTIVE) e -> ADD_TERM1(qvar, Ea0, 0); else {} } } /* visibility term */ if (d.x != OCCLUDED && is_blocked(a, -d)) { q = p + d; if (q>=Coord(0,0) && q ADD_TERM2(var, (Energy::Var) IMREF(node_vars_left, q), 0, INFINITY, 0, 0); } } } E_old = E; E = e -> minimize(); if (E < E_old) { for (p.y=0; p.y get_var(var)==VALUE1) { IMREF(x_left, p) = a.x; IMREF(y_left, p) = a.y; } var = (Energy::Var) IMREF(node_vars_right, p); if (var != VAR_ACTIVE && e->get_var(var)==VALUE1) { IMREF(x_right, p) = -a.x; IMREF(y_right, p) = -a.y; } } } delete e; }