📄 main.c
字号:
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 + -