www.pudn.com > match-v3.3.src.rar > main.cpp


/* main.cpp */ 
/* Vladimir Kolmogorov (vnk@cs.cornell.edu), 2001-2003. */ 
 
#include  
#include  
#include  
#ifdef WIN32 
#include  
#else 
#include  
#endif 
#include  
#include  
#include  
 
#include "match.h" 
 
/************************************************************/ 
/************************************************************/ 
/************************************************************/ 
 
/* global interface variables */ 
char *g_config;				/* data from the configuration file */ 
char *g_current;			/* pointer to the current location within g_conf */ 
char *g_next_line;			/* pointer to the next line */ 
int g_line_num;				/* number of current line */ 
#ifdef WIN32 
struct _timeb g_tstruct;	/* time */ 
#else 
struct timeb g_tstruct;		/* time */ 
#endif 
 
/* global interface functions */ 
void LoadConfigFile(char *name); 
char * NextLine(); 
char * GetWord(); 
char * GetWord(bool flag); 
int GetNumber(); 
int GetNonnegativeNumber(); 
int cmp(char *s1, char *s2); 
void Error(char *msg); 
void StartTimer(); 
void StopTimer(); 
 
/************************************************************/ 
/************************************************************/ 
/************************************************************/ 
 
void LoadConfigFile(char *name) 
{ 
	int fp; 
	int size; 
 
#ifdef WIN32 
	if ( (fp = _open(name, _O_RDONLY)) == -1 ) { fprintf(stderr, "Can't open %s\n", name); exit(1); } 
	if ( (size = _lseek(fp, 0, SEEK_END)) == -1 ) { fprintf(stderr, "Can't read %s\n", name); exit(1); } 
	if ( _lseek(fp, 0, SEEK_SET) == -1 ) { fprintf(stderr, "Can't read %s\n", name); exit(1); } 
 
	if ( (g_config = new char[size+1]) == NULL ) { fprintf(stderr, "Not enough memory to load config file\n"); exit(1); } 
	if ( (size = _read(fp, g_config, size)) == -1 ) { fprintf(stderr, "Can't read %s\n", name); exit(1); } 
	_close(fp); 
#else 
	if ( (fp = open(name, O_RDONLY)) == -1 ) { fprintf(stderr, "Can't open %s\n", name); exit(1); } 
	if ( (size = lseek(fp, 0, SEEK_END)) == -1 ) { fprintf(stderr, "Can't read %s\n", name); exit(1); } 
	if ( lseek(fp, 0, SEEK_SET) == -1 ) { fprintf(stderr, "Can't read %s\n", name); exit(1); } 
 
	if ( (g_config = new char[size+1]) == NULL ) { fprintf(stderr, "Not enough memory to load config file\n"); exit(1); } 
	if ( (size = read(fp, g_config, size)) == -1 ) { fprintf(stderr, "Can't read %s\n", name); exit(1); } 
	close(fp); 
#endif 
 
	g_config[size] = 0; 
 
	g_current = NULL; 
	g_next_line = g_config; 
	g_line_num = 0; 
} 
 
char * NextLine() 
{ 
	g_current = g_next_line; 
	char c; 
 
	if (g_next_line) 
	{ 
		for ( ; ; g_next_line++) 
		{ 
			c = *g_next_line; 
			if (!c) { g_next_line = NULL; break; } 
			if (c==(char)10) { *g_next_line++ = 0; break; } 
		} 
	} 
 
	g_line_num ++; 
	return g_current; 
} 
 
char * GetWord() 
{ 
	char *ptr; 
	char c; 
 
	if (!g_current) return NULL; 
 
	for (; ; g_current++) 
	{ 
		c = *g_current; 
		if (!c || c==(char)10 || c=='#') return NULL; 
		if (c!=' ' && c!='\t' && c!=(char)13) break; 
	} 
 
	ptr = g_current; 
 
	for (; ; g_current++) 
	{ 
		c = *g_current; 
		if (!c || c=='#') { *g_current = 0; g_current = NULL; return ptr; } 
		if (c==' ' || c=='\t' || c==(char)13) { *g_current++ = 0; return ptr; } 
	} 
} 
 
char * GetWord(bool flag) 
{ 
	char *ptr = GetWord(); 
 
	if (flag && !ptr) Error("too few parameters!\n"); 
	if (!flag && ptr) Error("too many parameters!\n"); 
	return ptr; 
} 
 
int GetNumber() 
{ 
	char *ptr; 
	int n; 
 
	ptr = GetWord(true); 
	if (!cmp(ptr, "INFINITY")) return INFINITY; 
	if (sscanf(ptr, "%d", &n) != 1) Error("wrong parameter\n"); 
	return n; 
} 
 
void GetFraction(int *nominator, int *denominator) 
{ 
	char *ptr; 
 
	ptr = GetWord(true); 
	if (!cmp(ptr, "INFINITY")) { *nominator = INFINITY; *denominator = 1; return; } 
	if (!cmp(ptr, "AUTO")) { *nominator = -1; *denominator = 1; return; } 
	if (sscanf(ptr, "%d/%d", nominator, denominator) != 2) 
	{ 
		if (sscanf(ptr, "%d", nominator) != 1) Error("wrong parameter\n"); 
		*denominator = 1; 
	} 
	if (*nominator < 0 || *denominator < 1) Error("wrong parameter\n"); 
} 
 
int GetNonnegativeNumber() 
{ 
	int n = GetNumber(); 
	if (n < 0) Error("wrong parameter\n"); 
	return n; 
} 
 
void GetNonnegativeFraction(int *nominator, int *denominator) 
{ 
	char *ptr; 
 
	ptr = GetWord(true); 
	if (!cmp(ptr, "INFINITY")) { *nominator = INFINITY; *denominator = 1; return; } 
	if (sscanf(ptr, "%d/%d", nominator, denominator) != 2) 
	{ 
		if (sscanf(ptr, "%d", nominator) != 1) Error("wrong parameter\n"); 
		*denominator = 1; 
	} 
	if (*nominator < 0 || *denominator < 1) Error("wrong parameter\n"); 
} 
 
int cmp(char *s1, char *s2) 
{ 
	char c1, c2; 
 
	do 
	{ 
		c1 = *s1 ++; 
		c2 = *s2 ++; 
		if (c1>='a' && c1<='z') c1 += 'A' - 'a'; 
		if (c2>='a' && c2<='z') c2 += 'A' - 'a'; 
		if (c1 != c2) return 1; 
	} while (c1); 
 
	return 0; 
} 
 
void Error(char *msg) 
{ 
	fprintf(stderr, "Error in line %d: %s\n", g_line_num, msg); 
	exit(1); 
} 
 
#ifdef WIN32 
void StartTimer() 
{ 
	_ftime(&g_tstruct); 
} 
 
void StopTimer() 
{ 
	struct _timeb tstruct_new; 
	time_t t; 
 
	_ftime(&tstruct_new); 
	t = 1000*(tstruct_new.time - g_tstruct.time) + (tstruct_new.millitm - g_tstruct.millitm); 
	printf("%.2f secs\n\n", (float)t/1000); 
} 
#else 
void StartTimer() 
{ 
	ftime(&g_tstruct); 
} 
 
void StopTimer() 
{ 
	struct timeb tstruct_new; 
	time_t t; 
 
	ftime(&tstruct_new); 
	t = 1000*(tstruct_new.time - g_tstruct.time) + (tstruct_new.millitm - g_tstruct.millitm); 
	printf("%.2f secs\n\n", (float)t/1000); 
} 
#endif 
 
/************************************************************/ 
/************************************************************/ 
/************************************************************/ 
 
int gcd(int a, int b) 
{ 
	if (a < b) return gcd(b, a); 
	if (b == 0) return a; 
	int r = a % b; 
	if (r == 0) return b; 
	return gcd(b, r); 
} 
 
/************************************************************/ 
/************************************************************/ 
/************************************************************/ 
 
int main(int argc, char *argv[]) 
{ 
	/* default parameters */ 
	Match *m = NULL; 
	Coord disp_base = Coord(0, 0), disp_max = Coord(0, 0); 
	struct Match::Parameters params = { 
		true, Match::Parameters::L2, 1, /* subpixel, data_cost, denominator */ 
		5, 8, 1, -1, -1,       /* I_threshold, I_threshold2, interaction_radius, lambda1, lambda2 */ 
		-1,                 /* K */ 
		INFINITY,           /* occlusion_penalty */ 
		INFINITY, false,    /* iter_max, randomize_every_iteration */ 
		5                   /* w_size */ 
	}; 
	int lambda = -1, denom = 1; 
 
	char *ptr, *ptr1, *ptr2; 
	bool flag; 
	int tmp_denom; 
 
	if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(1); } 
	LoadConfigFile(argv[1]); 
 
	/* main loop */ 
	while (NextLine()) 
	{ 
		ptr = GetWord(); 
		if (!ptr) continue; 
 
		if (!cmp(ptr, "LOAD")) 
		{ 
			ptr1 = GetWord(true); 
			ptr2 = GetWord(true); 
			GetWord(false); 
			if (m) delete m; 
			m = new Match(ptr1, ptr2, false); 
			m -> SetDispRange(disp_base, disp_max); 
			continue; 
		} 
 
		if (!cmp(ptr, "LOAD_COLOR")) 
		{ 
			ptr1 = GetWord(true); 
			ptr2 = GetWord(true); 
			GetWord(false); 
			if (m) delete m; 
			m = new Match(ptr1, ptr2, true); 
			m -> SetDispRange(disp_base, disp_max); 
			continue; 
		} 
 
		if (!cmp(ptr, "LOAD_SEGM")) 
		{ 
			ptr1 = GetWord(true); 
			ptr2 = GetWord(true); 
			GetWord(false); 
			if (!m) Error("load images first!"); 
			m -> LoadSegm(ptr1, ptr2, false); 
			continue; 
		} 
 
		if (!cmp(ptr, "LOAD_SEGM_COLOR")) 
		{ 
			ptr1 = GetWord(true); 
			ptr2 = GetWord(true); 
			GetWord(false); 
			if (!m) Error("load images first!"); 
			m -> LoadSegm(ptr1, ptr2, true); 
			continue; 
		} 
 
		if (!cmp(ptr, "SAVE_X")) 
		{ 
			ptr = GetWord(true); 
			if (ptr1=GetWord()) 
			{ 
				if (!(cmp(ptr1, "LARGER_DISPARITIES_BRIGHTER"))) flag = true; 
				else Error("unknown parameter!"); 
				GetWord(false); 
			} 
			else flag = false; 
			if (!m) Error("load images before calling the function!"); 
			m -> SaveXLeft(ptr, flag); 
			continue; 
		} 
 
		if (!cmp(ptr, "SAVE_Y")) 
		{ 
			ptr = GetWord(true); 
			if (ptr1=GetWord()) 
			{ 
				if (!(cmp(ptr1, "LARGER_DISPARITIES_BRIGHTER"))) flag = true; 
				else Error("unknown parameter!"); 
				GetWord(false); 
			} 
			else flag = false; 
			if (!m) Error("load images before calling the function!"); 
			m -> SaveYLeft(ptr, flag); 
			continue; 
		} 
 
		if (!cmp(ptr, "SAVE_X_SCALED")) 
		{ 
			ptr = GetWord(true); 
			if (ptr1=GetWord()) 
			{ 
				if (!(cmp(ptr1, "LARGER_DISPARITIES_BRIGHTER"))) flag = true; 
				else Error("unknown parameter!"); 
				GetWord(false); 
			} 
			else flag = false; 
			if (!m) Error("load images before calling the function!"); 
			m -> SaveScaledXLeft(ptr, flag); 
			continue; 
		} 
 
		if (!cmp(ptr, "SAVE_Y_SCALED")) 
		{ 
			ptr = GetWord(true); 
			if (ptr1=GetWord()) 
			{ 
				if (!(cmp(ptr1, "LARGER_DISPARITIES_BRIGHTER"))) flag = true; 
				else Error("unknown parameter!"); 
				GetWord(false); 
			} 
			else flag = false; 
			if (!m) Error("load images before calling the function!"); 
			m -> SaveScaledYLeft(ptr, flag); 
			continue; 
		} 
 
		if (!cmp(ptr, "LOAD_X")) 
		{ 
			ptr = GetWord(true); 
			if (ptr1=GetWord()) 
			{ 
				if (!(cmp(ptr1, "LARGER_DISPARITIES_BRIGHTER"))) flag = true; 
				else Error("unknown parameter!"); 
				GetWord(false); 
			} 
			else flag = false; 
			if (!m) Error("load images before calling the function!"); 
			m -> LoadXLeft(ptr, flag); 
			continue; 
		} 
 
		if (!cmp(ptr, "LOAD_Y")) 
		{ 
			ptr = GetWord(true); 
			if (ptr1=GetWord()) 
			{ 
				if (!(cmp(ptr1, "LARGER_DISPARITIES_BRIGHTER"))) flag = true; 
				else Error("unknown parameter!"); 
				GetWord(false); 
			} 
			else flag = false; 
			if (!m) Error("load images before calling the function!"); 
			m -> LoadYLeft(ptr, flag); 
			continue; 
		} 
 
		if (!cmp(ptr, "UNSET")) 
		{ 
			ptr = GetWord(true); 
			if (!cmp(ptr, "randomize_every_iteration")) 
			{ 
				GetWord(false); 
				params.randomize_every_iteration = false; 
				continue; 
			} 
			if (!cmp(ptr, "sub_pixel")) 
			{ 
				GetWord(false); 
				params.sub_pixel = false; 
				continue; 
			} 
			Error("unknown parameter!"); 
		} 
 
		if (!cmp(ptr, "SET")) 
		{ 
			ptr = GetWord(true); 
			if (!cmp(ptr, "disp_range")) 
			{ 
				disp_base.x = GetNumber(); 
				disp_base.y = GetNumber(); 
				disp_max.x = GetNumber(); 
				disp_max.y = GetNumber(); 
				GetWord(false); 
				if (m) m -> SetDispRange(disp_base, disp_max); 
				printf("Disparity range: x_min = %d, y_min = %d, x_max = %d, y_max = %d\n\n", disp_base.x, disp_base.y, disp_max.x, disp_max.y); 
				continue; 
			} 
			if (!cmp(ptr, "iter_max")) 
			{ 
				params.iter_max = GetNonnegativeNumber(); 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "randomize_every_iteration")) 
			{ 
				GetWord(false); 
				params.randomize_every_iteration = true; 
				continue; 
			} 
			if (!cmp(ptr, "sub_pixel")) 
			{ 
				GetWord(false); 
				params.sub_pixel = true; 
				continue; 
			} 
			if (!cmp(ptr, "data_cost")) 
			{ 
				ptr = GetWord(true); 
				if      (!cmp(ptr, "L1")) params.data_cost = Match::Parameters::L1; 
				else if (!cmp(ptr, "L2")) params.data_cost = Match::Parameters::L2; 
				else Error("unknown parameter!"); 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "corr_size")) 
			{ 
				params.corr_size = GetNonnegativeNumber(); 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "I_threshold")) 
			{ 
				params.I_threshold = GetNonnegativeNumber(); 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "I_threshold2")) 
			{ 
				params.I_threshold2 = GetNonnegativeNumber(); 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "interaction_radius")) 
			{ 
				params.interaction_radius = GetNonnegativeNumber(); 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "lambda")) 
			{ 
				GetFraction(&lambda, &tmp_denom); 
				lambda *= params.denominator; 
				params.lambda1 *= tmp_denom; 
				params.lambda2 *= tmp_denom; 
				params.K *= tmp_denom; 
				params.denominator *= tmp_denom; 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "lambda1")) 
			{ 
				GetFraction(¶ms.lambda1, &tmp_denom); 
				lambda *= tmp_denom; 
				params.lambda1 *= params.denominator; 
				params.lambda2 *= tmp_denom; 
				params.K *= tmp_denom; 
				params.denominator *= tmp_denom; 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "lambda2")) 
			{ 
				GetFraction(¶ms.lambda2, &tmp_denom); 
				lambda *= tmp_denom; 
				params.lambda1 *= tmp_denom; 
				params.lambda2 *= params.denominator; 
				params.K *= tmp_denom; 
				params.denominator *= tmp_denom; 
				GetWord(false); 
				continue; 
			} 
			if (!cmp(ptr, "K")) 
			{ 
				GetFraction(¶ms.K, &tmp_denom); 
				lambda *= tmp_denom; 
				params.lambda1 *= tmp_denom; 
				params.lambda2 *= tmp_denom; 
				params.K *= params.denominator; 
				params.denominator *= tmp_denom; 
				GetWord(false); 
				continue; 
			} 
			Error("unknown parameter!"); 
		} 
 
		if (!cmp(ptr, "CLEAR")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			m -> CLEAR(); 
			continue; 
		} 
 
		if (!cmp(ptr, "SWAP_IMAGES")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			m -> SWAP_IMAGES(); 
			continue; 
		} 
 
		if (!cmp(ptr, "MAKE_UNIQUE")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			m -> MAKE_UNIQUE(); 
			continue; 
		} 
 
		if (!cmp(ptr, "CROSS_CHECK")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			m -> CROSS_CHECK(); 
			continue; 
		} 
 
		if (!cmp(ptr, "FILL_OCCLUSIONS")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			m -> FILL_OCCLUSIONS(); 
			continue; 
		} 
 
		if (!cmp(ptr, "CORR")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			StartTimer(); 
			m -> SetParameters(¶ms); 
			m -> CORR(); 
			StopTimer(); 
			continue; 
		} 
 
		if (!cmp(ptr, "KZ1") || !cmp(ptr, "KZ2")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			StartTimer(); 
			if (lambda<0 && (params.K<0 || params.lambda1 || params.lambda2<0)) 
			{ 
				m -> SetParameters(¶ms); 
				float v = m->GetK()/5; tmp_denom = 1; 
				while (v < 3) { v *= 2; tmp_denom *= 2; } 
				lambda = int(v + (float)0.5); 
				lambda *= params.denominator; 
				params.lambda1 *= tmp_denom; 
				params.lambda2 *= tmp_denom; 
				params.K *= tmp_denom; 
				params.denominator *= tmp_denom; 
			} 
			if (params.K<0) params.K = 5*lambda; 
			if (params.lambda1<0) params.lambda1 = 3*lambda; 
			if (params.lambda2<0) params.lambda2 = lambda; 
			tmp_denom = gcd(params.K, gcd(params.lambda1, gcd(params.lambda2, params.denominator))); 
			if (tmp_denom) 
			{ 
				params.K /= tmp_denom; 
				params.lambda1 /= tmp_denom; 
				params.lambda2 /= tmp_denom; 
				params.denominator /= tmp_denom; 
			} 
			m -> SetParameters(¶ms); 
			if (!cmp(ptr, "KZ1")) m -> KZ1(); 
			else                  m -> KZ2(); 
			StopTimer(); 
			continue; 
		} 
 
		if (!cmp(ptr, "BVZ")) 
		{ 
			GetWord(false); 
			if (!m) Error("load images before calling the function!"); 
			StartTimer(); 
			if (params.lambda1<0) params.lambda1 = 2*lambda; 
			if (params.lambda2<0) params.lambda2 = lambda; 
			tmp_denom = gcd(params.lambda1, gcd(params.lambda2, params.denominator)); 
			if (tmp_denom) 
			{ 
				params.lambda1 /= tmp_denom; 
				params.lambda2 /= tmp_denom; 
				params.denominator /= tmp_denom; 
			} 
			m -> SetParameters(¶ms); 
			m -> BVZ(); 
			StopTimer(); 
			continue; 
		} 
 
		Error("unknown parameter!"); 
	} 
 
	printf("done\n"); 
 
	return 0; 
}