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