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.yget_var(var)==VALUE1) 
			{ 
				IMREF(x_left, p) = a.x; IMREF(y_left, p) = a.y; 
			} 
		} 
	} 
 
	delete e; 
}