#pragma once class GetFreq_REC { public: double* X; // frequencies buffer pointer double** SX_R, ** SX_G, ** SX_B; // 26x26 pix object RGB components loaded in main program double** S, ** S1, ** S2; int brUz, sWitch; // brUz = total nr. of database patterns, sWitch = decides if object is used for db creation or recognition double* largest; // saves probabilities for all db patterns double** R; // pointer to recognition DB double* x; fftw_complex* y; fftw_plan plan; GetFreq_REC(); // *** 2d FFTW *** void FFT_REC() { int i, j; for (i = 0; i < 26; i++) for (j = 0; j < 26; j++) x[i * 26 + j] = S1[i][j]; fftw_execute(plan); for (i = 0; i < 26; i++) for (j = 0; j < 13; j++) y[i * 14 + j][0] /= 676; } void X3_REC() { int i, j, k; for (i = 0; i < 26; i++) { k = 25; for (j = 0; j < 26; j++) { S[i][j + 26] = S[i][k--]; } } for (i = 0; i < 26; i++) for (j = 0; j < 26; j++) { S[i][j + 52] = S[i][j]; } } void Scan_REC() { int i, j, m, n; double pom = 0; for (i = 0; i < 26; i++) { for (j = 0; j < 13; j++) S2[i][j] = 0; } for (j = 0; j < 52; j++) { for (m = 0; m < 26; m++) for (n = j; n < j + 26; n++) S1[m][n - j] = S[m][n]; FFT_REC(); for (m = 0; m < 26; m++) for (n = 0; n < 13; n++) S2[m][n] += fabs(y[m * 14 + n][0]); } } // *** probabilities *** void PNN() { int i, j; double sum; for (i = 0; i < brUz; i++) { sum = 0; for (j = 0; j < 1014; j++) sum += fabs(X[j] - R[i][j]); largest[i] = exp(-pow(sum, 10) / 2.0E-7); } } // *** main function *** void GetFreq() { int i, j, k; long double sum; // ***** Red ***** for (i = 0; i < 26; i++) for (j = 0; j < 26; j++) S[i][j] = SX_R[i][j]; X3_REC(); Scan_REC(); k = 0; for (i = 0; i < 26; i++) for (j = 0; j < 13; j++) { X[k++] = S2[i][j]; } // ***** Green ***** for (i = 0; i < 26; i++) for (j = 0; j < 26; j++) S[i][j] = SX_G[i][j]; X3_REC(); Scan_REC(); for (i = 0; i < 26; i++) for (j = 0; j < 13; j++) { X[k++] = S2[i][j]; } // ***** Blue ***** for (i = 0; i < 26; i++) for (j = 0; j < 26; j++) S[i][j] = SX_B[i][j]; X3_REC(); Scan_REC(); for (i = 0; i < 26; i++) for (j = 0; j < 13; j++) { X[k++] = S2[i][j]; } // *** normalize & log *** sum = 0;; for (i = 0; i < 1014; i++) sum += X[i]; sum /= 1014; if (sum > 0) { for (i = 0; i < 1014; i++) X[i] /= sum; for (i = 0; i < 1014; i++) X[i] = log(X[i] + 1); } sum = 0; for (i = 0; i < 1014; i++) sum += X[i]; if (sum > 0) for (i = 0; i < 1014; i++) X[i] /= sum; if (sWitch == 1) PNN(); } ~GetFreq_REC(); };