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.yget_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; 
}