www.pudn.com > match-v3.3.src.rar > bvz.cpp
/* bvz.cpp */ /* Vladimir Kolmogorov (vnk@cs.cornell.edu), 2001-2003. */ #include#include "match.h" #include "energy.h" /************************************************************/ /************************************************************/ /************************************************************/ inline int Match::BVZ_data_penalty(Coord p, Coord d) { register Coord pd; if (d.x == OCCLUDED) return params.denominator*params.occlusion_penalty; pd = p + d; if (!(pd>=Coord(0,0) && pd *data_penalty_func)(p, pd); } inline int Match::BVZ_smoothness_penalty(Coord p, Coord np, Coord d, Coord nd) { return (this->*smoothness_penalty_left_func)(p, np, d, nd); } /************************************************************/ /************************************************************/ /************************************************************/ /* computes current energy */ int Match::BVZ_ComputeEnergy() { int k; Coord p, d, q, dq; E = 0; for (p.y=0; p.y =Coord(0,0) && q add_constant(BVZ_data_penalty(p, d)); } else { IMREF(node_vars, p) = var = e -> add_variable(); e -> ADD_TERM1(var, BVZ_data_penalty(p, d), BVZ_data_penalty(p, a)); } } for (p.y=0; p.y =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 {} } } } 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; } } } delete e; }