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

📄 main.c

📁 完整的3D 模型检索程序
💻 C
📖 第 1 页 / 共 4 页
字号:
		fpt = fopen("align20.txt", "r");
		for(i=0; i<60; i++)
			for(j=0; j<CAMNUM_2; j++)
				fscanf(fpt, "%d", &align[i][j]);
		fclose(fpt);

		// read filename of two models
		fpt1 = fopen("compare.txt", "r");
		if( fscanf(fpt1, "%s", srcfn) == EOF )
			break;
		fclose(fpt1);

		// read coefficient from model 1
		sprintf(filename, "%s.ccd", srcfn);
		if( (fpt = fopen(filename, "rb")) == NULL )
		{
			printf("%s does not exist.\n", filename);
			break;
		}

		fread(CompactColor, ANGLE * CAMNUM, sizeof(unsigned __int64), fpt);
		fclose(fpt);

		// read feature of all models
		fpt1 = fopen("list.txt", "r");
		Count = 0;
		pSearch = NULL;
		while( fscanf(fpt1, "%s", destfn) != EOF )
		{
			// read coefficient from model 2
			sprintf(filename, "%s.ccd", destfn);
			if( (fpt = fopen(filename, "rb")) == NULL )
			{
				printf("%s does not exist.\n", filename);
				break;
			}

			fread(dest_CompactColor, ANGLE * CAMNUM,  sizeof(unsigned __int64), fpt);
			fclose(fpt);

			// compare each coefficients pair from the two models first
			for(destCam=0; destCam<ANGLE; destCam++)
				for(i=0; i<CAMNUM_2; i++)
					for(srcCam=0; srcCam<ANGLE; srcCam++)
						for(j=0; j<CAMNUM_2; j++)
							cost[srcCam][destCam][j][i] = ColorDistance(dest_CompactColor[destCam]+CamMap[i], CompactColor[srcCam]+CamMap[j]);

			// find minimum error of the two models from all camera pairs
			MinErr = DBL_MAX;
			for(srcCam=0; srcCam<ANGLE; srcCam++)		// each src angle
				for(destCam=0; destCam<ANGLE; destCam++)	// each dest angle
					for(i=0; i<60; i++)						// each align
					{
						err = 0;
						for(j=0; j<CAMNUM_2; j++)				// each vertex
							err += cost[srcCam][destCam][CamMap[j]][CamMap[align[i][j]]];

						if( err < MinErr )
							MinErr = err;
					}

//			printf("Difference of %s and %s: %f\n", srcfn, destfn, MinErr);
			// add to a list
			pmr = (pMatRes) malloc (sizeof(MatRes));
			strcpy(pmr->name, destfn);
			pmr->sim = MinErr;
			pmr->pointer = pSearch;
			pSearch = pmr;
			Count ++;
		}

		TopNum = 10;		// show top 10

		pTop = (pMatRes) malloc ( TopNum * sizeof(MatRes) );
		for(i=0; i<TopNum; i++)
		{
			pTop[i].sim = DBL_MAX;
			strcpy(pTop[i].name, "");
		}

		for(pmr=pSearch; pmr; pmr=pmr->pointer)
			for(i=0; i<TopNum; i++)
				if( pmr->sim < pTop[i].sim )
				{
					for(j=TopNum-2; j>=i; j--)
					{
						strcpy(pTop[j+1].name, pTop[j].name);
						pTop[j+1].sim = pTop[j].sim;
					}
					strcpy(pTop[i].name, pmr->name);
					pTop[i].sim = pmr->sim;
					break;
				}

		printf("%s\n", srcfn);
		for(i=0; i<TopNum && i<Count; i++)
			printf("%s %.6f\n", pTop[i].name, pTop[i].sim);
		printf("\n");

		pmr=pSearch;
		while(pmr)
		{
			pmrr = pmr;
			pmr = pmr->pointer;
			free(pmrr);
		}
		free(pTop);

		break;

// *************************************************************************************************
	// compare two models using circularity
	case 'z':
		// initialize: read camera pair
		fpt = fopen("align20.txt", "r");
		for(i=0; i<60; i++)
			for(j=0; j<CAMNUM_2; j++)
				fscanf(fpt, "%d", &align[i][j]);
		fclose(fpt);

		// read filename of two models
		fpt1 = fopen("compare.txt", "r");
		if( fscanf(fpt1, "%s", srcfn) == EOF )
			break;
		fclose(fpt1);

		// read coefficient from model 1
		sprintf(filename, "%s_q8.cir", srcfn);
		if( (fpt = fopen(filename, "rb")) == NULL )
		{
			printf("%s does not exist.\n", filename);
			break;
		}

		fread(q8_cirCoeff, ANGLE * CAMNUM, sizeof(unsigned char), fpt);
		fclose(fpt);

		// read feature of all models
		fpt1 = fopen("list.txt", "r");
		Count = 0;
		pSearch = NULL;
		while( fscanf(fpt1, "%s", destfn) != EOF )
		{
			// read coefficient from model 2
			sprintf(filename, "%s_q8.cir", destfn);
			if( (fpt = fopen(filename, "rb")) == NULL )
			{
				printf("%s does not exist.\n", filename);
				break;
			}

			fread(dest_cirCoeff, ANGLE * CAMNUM,  sizeof(unsigned char), fpt);
			fclose(fpt);

			// compare each coefficients pair from the two models first
			for(destCam=0; destCam<ANGLE; destCam++)
				for(i=0; i<CAMNUM_2; i++)
					for(srcCam=0; srcCam<ANGLE; srcCam++)
						for(j=0; j<CAMNUM_2; j++)
							cost[srcCam][destCam][j][i] = abs(q8_cirCoeff[srcCam][CamMap[j]] - dest_cirCoeff[destCam][CamMap[i]]);

			// find minimum error of the two models from all camera pairs
			MinErr = DBL_MAX;
			for(srcCam=0; srcCam<ANGLE; srcCam++)		// each src angle
				for(destCam=0; destCam<ANGLE; destCam++)	// each dest angle
					for(i=0; i<60; i++)						// each align
					{
						err = 0;
						for(j=0; j<CAMNUM_2; j++)				// each vertex
							err += cost[srcCam][destCam][CamMap[j]][CamMap[align[i][j]]];

						if( err < MinErr )
							MinErr = err;
					}

//			printf("Difference of %s and %s: %f\n", srcfn, destfn, MinErr);
			// add to a list
			pmr = (pMatRes) malloc (sizeof(MatRes));
			strcpy(pmr->name, destfn);
			pmr->sim = MinErr;
			pmr->pointer = pSearch;
			pSearch = pmr;
			Count ++;
		}

		TopNum = 10;		// show top 10

		pTop = (pMatRes) malloc ( TopNum * sizeof(MatRes) );
		for(i=0; i<TopNum; i++)
		{
			pTop[i].sim = DBL_MAX;
			strcpy(pTop[i].name, "");
		}

		for(pmr=pSearch; pmr; pmr=pmr->pointer)
			for(i=0; i<TopNum; i++)
				if( pmr->sim < pTop[i].sim )
				{
					for(j=TopNum-2; j>=i; j--)
					{
						strcpy(pTop[j+1].name, pTop[j].name);
						pTop[j+1].sim = pTop[j].sim;
					}
					strcpy(pTop[i].name, pmr->name);
					pTop[i].sim = pmr->sim;
					break;
				}

		printf("%s\n", srcfn);
		for(i=0; i<TopNum && i<Count; i++)
			printf("%s %.6f\n", pTop[i].name, pTop[i].sim);
		printf("\n");

		pmr=pSearch;
		while(pmr)
		{
			pmrr = pmr;
			pmr = pmr->pointer;
			free(pmrr);
		}
		free(pTop);
		break;

// *************************************************************************************************
	// compare two models using fourier descriptor
	case 'g':
		// initialize: read camera pair
		fpt = fopen("align20.txt", "r");
		for(i=0; i<60; i++)
			for(j=0; j<CAMNUM_2; j++)
				fscanf(fpt, "%d", &align[i][j]);
		fclose(fpt);

		// read filename of two models
		fpt1 = fopen("compare.txt", "r");
		if( fscanf(fpt1, "%s", srcfn) == EOF )
			break;
		fclose(fpt1);

		// read coefficient from model 1
		sprintf(filename, "%s.fd", srcfn);
		if( (fpt = fopen(filename, "rb")) == NULL )
		{	printf("%s does not exist.\n", filename);	break;	}
		fread(src_FdCoeff, ANGLE * CAMNUM * FD_COEFF_NO, sizeof(double), fpt);
		fclose(fpt);

		// read feature of all models
		fpt1 = fopen("list.txt", "r");
		Count = 0;
		pSearch = NULL;
		while( fscanf(fpt1, "%s", destfn) != EOF )
		{
			// read coefficient from model 2
			sprintf(filename, "%s.fd", destfn);
			if( (fpt = fopen(filename, "rb")) == NULL )
			{	printf("%s does not exist.\n", filename);	break;	}
			fread(dest_FdCoeff, ANGLE * CAMNUM * FD_COEFF_NO, sizeof(double), fpt);
			fclose(fpt);

			// compare each coefficients pair from the two models first
			for(destCam=0; destCam<ANGLE; destCam++)
				for(i=0; i<CAMNUM_2; i++)
					for(srcCam=0; srcCam<ANGLE; srcCam++)
						for(j=0; j<CAMNUM_2; j++)
						{
							err = 0;
							for(k=0; k<FD_COEFF_NO; k++)						// each align
								err += abs(src_FdCoeff[srcCam][CamMap[j]][k]-dest_FdCoeff[destCam][CamMap[i]][k]);// * (src_FdCoeff[srcCam][j][k]-dest_FdCoeff[destCam][i][k]);

							cost[srcCam][destCam][j][i] = err;
						}

			// find minimum error of the two models from all camera pairs
			MinErr = DBL_MAX;
			for(srcCam=0; srcCam<ANGLE; srcCam++)		// each src angle
				for(destCam=0; destCam<ANGLE; destCam++)	// each dest angle
					for(i=0; i<60; i++)						// each align
					{
						err = 0;
						for(j=0; j<CAMNUM_2; j++)				// each vertex
							err += cost[srcCam][destCam][CamMap[j]][CamMap[align[i][j]]];

						if( err < MinErr )
							MinErr = err;
					}

//			printf("Difference of %s and %s: %f\n", srcfn, destfn, MinErr);
			// add to a list
			pmr = (pMatRes) malloc (sizeof(MatRes));
			strcpy(pmr->name, destfn);
			pmr->sim = MinErr;
			pmr->pointer = pSearch;
			pSearch = pmr;
			Count ++;
		}

		TopNum = 10;		// show top 10

		pTop = (pMatRes) malloc ( TopNum * sizeof(MatRes) );
		for(i=0; i<TopNum; i++)
		{
			pTop[i].sim = DBL_MAX;
			strcpy(pTop[i].name, "");
		}

		for(pmr=pSearch; pmr; pmr=pmr->pointer)
			for(i=0; i<TopNum; i++)
				if( pmr->sim < pTop[i].sim )
				{
					for(j=TopNum-2; j>=i; j--)
					{
						strcpy(pTop[j+1].name, pTop[j].name);
						pTop[j+1].sim = pTop[j].sim;
					}
					strcpy(pTop[i].name, pmr->name);
					pTop[i].sim = pmr->sim;
					break;
				}

		printf("%s\n", srcfn);
		for(i=0; i<TopNum && i<Count; i++)
			printf("%s %.6f\n", pTop[i].name, pTop[i].sim);
		printf("\n");

		pmr=pSearch;
		while(pmr)
		{
			pmrr = pmr;
			pmr = pmr->pointer;
			free(pmrr);
		}
		free(pTop);
		break;

	default:
		break;
	}
}

void init(void) 
{
	glClearColor (1.0, 1.0, 1.0, 0.0);
	glClearDepth(1.0);
	glEnable(GL_DEPTH_TEST);
//	glShadeModel(GL_FLAT);
}

void reshape (int w, int h)
{
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
//	gluPerspective(90.0, (GLfloat) winw/(GLfloat) winh, 0.1, 10.0);
	glOrtho(-1, 1, -1, 1, 0.0, 2.0);
//	glOrtho(-1, 1, -1, 1, 0.5, 1.5);
	glViewport (0, 0, (GLsizei) winw, (GLsizei) winh); 

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(1,0,0,0,0,0,0,1,0);
//	gluLookAt(CAMSCALE*-0.85065, CAMSCALE*0.61803, CAMSCALE*-0.20081, 0,0,0,0,1,0);
//	gluLookAt(-0.85065, 0.61803, -0.20081, 0,0,0,0,1,0);
}


int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize (WIDTH, HEIGHT); 
	glutInitWindowPosition (100, 100);
	glutCreateWindow (argv[0]);
	init ();
	glutDisplayFunc(display); 
	glutReshapeFunc(reshape);
	//   glutMouseFunc(mouse);
	//   glutMotionFunc(motion);
	glutKeyboardFunc(keyboard);

	glutMainLoop();

	return 0;
}

⌨️ 快捷键说明

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