⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 完整的3D 模型检索程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#include <limits.h>
#include <float.h>#include <time.h>
#include "ds.h"

// ****************
// NNNNOOOOTTTTEEEE: the ModelNum should be the same as the number of all models
#define			ModelNum	4

// #1unsigned char	q8_table[256][256];unsigned char	src_ArtCoeff[SRC_ANGLE][CAMNUM][ART_COEF];unsigned char	dest_ArtCoeff[ModelNum][SRC_ANGLE][CAMNUM][ART_COEF];unsigned char	align10[60][CAMNUM_2];int				cost[SRC_ANGLE][ANGLE][CAMNUM][CAMNUM];
// for Fourier Descriptor matching
unsigned char	src_FdCoeff_q8[ANGLE][CAMNUM][FD_COEF];
unsigned char	dest_FdCoeff_q8[ModelNum][ANGLE][CAMNUM][FD_COEF];

// for Circularity
unsigned char	src_CirCoeff_q8[ANGLE][CAMNUM];
unsigned char	dest_CirCoeff_q8[ModelNum][ANGLE][CAMNUM];

// for Eccentricity
unsigned char	src_EccCoeff_q8[ANGLE][CAMNUM];
unsigned char	dest_EccCoeff_q8[ModelNum][ANGLE][CAMNUM];

// #2
//double	SHsrc_Coeff[SH_KEY_NUM];
//double	SHdest_Coeff[ModelNum][SH_KEY_NUM];

// #3
//double	S3Dsrc_Coeff[S3D_KEY_NUM];
//double	S3Ddest_Coeff[ModelNum][S3D_KEY_NUM];


#define abs(a) ((a)>0)?(a):(-(a))
#define			RESAM		1000

// #1
void ShowResults(char *filename, pMatRes pTop, int ClassNum)
{
	FILE	*fpt;
	int		i;
//	char	fn[200];

	fpt = fopen(filename, "w");
	fprintf(fpt, "<html>\n<head><title>Results</title></head>\n\n<body>");

	for(i=0; i<5*ClassNum; i++)
	{
		fprintf(fpt, "<img src=\"..\\..\\GroundTruthDatabase\\%s.jpg\"> %s %d<br>\n", pTop[i].name, pTop[i].name, pTop[i].sim);
		if( i == ClassNum )
			fprintf(fpt, "\n<hr>\n");
	}

	fprintf(fpt, "\n</body></html>\n");
	fclose(fpt);

//	sprintf(fn, "\"d:\\program files\\internet explorer\\iexplore.exe \"%s\"\"", filename);
//	system(fn);
}

//******************************************************************************************************
// match from 20 shapes, and match 36 coeff for each shape, and each coeff has 4 bits
int MatchART_q8(unsigned char dest_ArtCoeff[SRC_ANGLE][CAMNUM][ART_COEF])
{
	int						i, j, srcCam, destCam;
	register unsigned char	m;
	int						err, MinErr;
	int						distance;
	static int				cost_q8[ANGLE][ANGLE][CAMNUM][CAMNUM];

	// compare each coefficients pair from the two models first
	for(srcCam=0; srcCam<ANGLE; srcCam++)
		for(destCam=0; destCam<ANGLE; destCam++)
			for(i=0; i<CAMNUM; i++)
				for(j=0; j<CAMNUM; j++)
				{
					// un-loop to speed-up
					// un-loop to speed-up
					m=0;
					distance = q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					// 11	
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					// 21
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					// 31
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];

					cost_q8[srcCam][destCam][i][j] = distance;
				}

	// find minimum error of the two models from all camera pairs
	MinErr = INT_MAX;
	for(srcCam=0; srcCam<SRC_ANGLE; srcCam++)		// each src angle
		for(destCam=0; destCam<ANGLE; destCam++)	// each dest angle
			for(j=0; j<60; j++)						// each align
			{
//					err = 0;
//					for(m=0; m<CAMNUM; m++)				// each vertex
//						err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];

				// un-loop to speed-up
				m=0;
				err = cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];

				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];

				if( err < MinErr )	MinErr = err;
			}

	return MinErr;
//	return MinErr<<3;
}



int MatchFD_q8(unsigned char dest_FdCoeff_q8[ANGLE][CAMNUM][FD_COEF])
{
	int						i, j, srcCam, destCam;
	register unsigned char	m;
	int						err, MinErr;
	int						distance;
	static int				cost_q8[ANGLE][ANGLE][CAMNUM][CAMNUM];

	// compare each coefficients pair from the two models first
	for(srcCam=0; srcCam<ANGLE; srcCam++)
		for(destCam=0; destCam<ANGLE; destCam++)
			for(i=0; i<CAMNUM; i++)
				for(j=0; j<CAMNUM; j++)
				{
					// un-loop to speed-up
					m=0;
					distance = q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];

					cost_q8[srcCam][destCam][i][j] = distance;
				}

	// find minimum error of the two models from all camera pairs
	MinErr = INT_MAX;
	for(srcCam=0; srcCam<SRC_ANGLE; srcCam++)		// each src angle
		for(destCam=0; destCam<ANGLE; destCam++)	// each dest angle
			for(j=0; j<60; j++)						// each align
			{
//					err = 0;
//					for(m=0; m<CAMNUM; m++)				// each vertex
//						err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];

				// un-loop to speed-up
				m=0;
				err = cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];

				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];
				err += cost_q8[srcCam][destCam][align10[j][m]][align10[0][m++]];

				if( err < MinErr )
					MinErr = err;
			}

	return MinErr<<1;
//	return MinErr;
}

/*
// #2
double MatchSH(double SHdest_Coeff[SH_KEY_NUM]) 
{
	double					distance;
	int						m;

	// compare each coefficients pair from the two models first
	distance = 0;
	for(m=0 ; m<SH_KEY_NUM ; m++)
		distance += abs(SHdest_Coeff[m] - SHsrc_Coeff[m]);

	return distance;
}

// #3
double MatchS3D(double S3Ddest_Coeff[S3D_KEY_NUM]) 
{
	double					distance;
	int						m;

	// compare each coefficients pair from the two models first
	distance = 0;
	for(m=0 ; m<S3D_KEY_NUM ; m++)
		distance += abs(S3Ddest_Coeff[m] - S3Dsrc_Coeff[m]);

	return distance;
}
*/

// matching FightField descriptor ( ART + Fourier )
int MatchLF(unsigned char dest_ArtCoeff[SRC_ANGLE][CAMNUM][ART_COEF], 
			unsigned char dest_FdCoeff_q8[ANGLE][CAMNUM][FD_COEF],
			unsigned char dest_CirCoeff_q8[ANGLE][CAMNUM],
			unsigned char dest_EccCoeff_q8[ANGLE][CAMNUM])
{
	int						i, j, srcCam, destCam;
	register unsigned char	m;
	int						err, MinErr;
	int						art_distance, fd_distance, cir_distance, ecc_distance;
	static int				cost_q8[ANGLE][ANGLE][CAMNUM][CAMNUM];

	// compare each coefficients pair from the two models first
	for(srcCam=0; srcCam<ANGLE; srcCam++)
		for(destCam=0; destCam<ANGLE; destCam++)
			for(i=0; i<CAMNUM; i++)
				for(j=0; j<CAMNUM; j++)
				{
					// un-loop to speed-up
					// for ART (Zernike moment)
					m=0;
					art_distance = q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					// 11	
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					// 21
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					// 31
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];
					art_distance += q8_table[dest_ArtCoeff[destCam][i][m]][src_ArtCoeff[srcCam][j][m++]];

					// for Fourier Descriptor
					m=0;
					fd_distance = q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance += q8_table[dest_FdCoeff_q8[destCam][i][m]][src_FdCoeff_q8[srcCam][j][m++]];
					fd_distance <<= 1;

					// for Circularity
					cir_distance = q8_table[dest_CirCoeff_q8[destCam][i]][src_CirCoeff_q8[srcCam][j]];
					cir_distance <<= 1;

					// for Eccentricity
					ecc_distance = q8_table[dest_EccCoeff_q8[destCam][i]][src_EccCoeff_q8[srcCam][j]];
					//ecc_distance <<= 1;

					cost_q8[srcCam][destCam][i][j] = art_distance + fd_distance + cir_distance + ecc_distance;
				}

	// find minimum error of the two models from all camera pairs
	MinErr = INT_MAX;
	for(srcCam=0; srcCam<SRC_ANGLE; srcCam++)		// each src angle

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -