void PCAKNN::train(const list<Interval> &intervals, const bool console_output) { if (intervals.size() == 0) return; projections.clear(); n = 0; width = intervals.front().start->face.cols; height = intervals.front().start->face.rows; list<Interval>::const_iterator itr; vector<Face>::const_iterator start, end; //add the number of images from all intervals for (itr = intervals.cbegin(); itr != intervals.cend(); itr++) { n += itr->Length(); } Mat pca_matrix(static_cast<int>(n), width*height, data_type); int c = 0; for (itr = intervals.cbegin(); itr != intervals.cend(); itr++) { //for each image in the current interval for (start = itr->start, end = itr->end; start != end; start++, ++c) { if (console_output) printf("Preparing samples %d/%d\n", c + 1, n); //insert current image into pca_matrix Mat image_row = start->face.clone().reshape(1, 1); Mat row_i = pca_matrix.row(c); image_row.convertTo(row_i, data_type);//CV_64FC1 ? Face f; f.name = start->name; projections.push_back(f);//save the names for later } } if (console_output) printf("TRAINING...\n"); //Perfrom principal component analysis on pca_matrix PCA pca(pca_matrix, Mat(), CV_PCA_DATA_AS_ROW, pca_matrix.rows); //extract mean/eigenvalues mean = pca.mean.reshape(1, 1); ev = pca.eigenvalues.clone(); transpose(pca.eigenvectors, w); //project each face into subspace and save them with the name above for recognition for (unsigned int i = 0; i<n; ++i) { if (console_output) printf("Projecting %d/%d\n", i + 1, n);//project so subspace projections[i].face = subspaceProject(w, mean, pca_matrix.row(i)); } }
static MATRIX * align_pca(MRI *mri_in, MRI *mri_ref) { int row, col, i ; float dot ; MATRIX *m_ref_evectors = NULL, *m_in_evectors = NULL ; float in_evalues[3], ref_evalues[3] ; double ref_means[3], in_means[3] ; #if 0 MRI *mri_in_windowed, *mri_ref_windowed ; mri_in_windowed = MRIwindow(mri_in, NULL, WINDOW_HANNING,127,127,127,100.0f); mri_ref_windowed = MRIwindow(mri_ref,NULL,WINDOW_HANNING,127,127,127,100.0f); if (Gdiag & DIAG_WRITE) { MRIwriteImageViews(mri_in_windowed, "in_windowed", 400) ; MRIwriteImageViews(mri_ref_windowed, "ref_windowed", 400) ; } #endif if (!m_ref_evectors) m_ref_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; if (!m_in_evectors) m_in_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; MRIprincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means, thresh_low); MRIprincipleComponents(mri_in,m_in_evectors,in_evalues,in_means,thresh_low); /* check to make sure eigenvectors aren't reversed */ for (col = 1 ; col <= 3 ; col++) { #if 0 float theta ; #endif for (dot = 0.0f, row = 1 ; row <= 3 ; row++) dot += m_in_evectors->rptr[row][col] * m_ref_evectors->rptr[row][col] ; if (dot < 0.0f) { printf("WARNING: mirror image detected in eigenvector #%d\n", col) ; dot *= -1.0f ; for (row = 1 ; row <= 3 ; row++) m_in_evectors->rptr[row][col] *= -1.0f ; } #if 0 theta = acos(dot) ; printf("angle[%d] = %2.1f\n", col, DEGREES(theta)) ; #endif } printf("ref_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) printf("\t\t%2.2f %2.2f %2.2f\n", m_ref_evectors->rptr[i][1], m_ref_evectors->rptr[i][2], m_ref_evectors->rptr[i][3]) ; printf("\nin_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) printf("\t\t%2.2f %2.2f %2.2f\n", m_in_evectors->rptr[i][1], m_in_evectors->rptr[i][2], m_in_evectors->rptr[i][3]) ; return(pca_matrix(m_in_evectors, in_means,m_ref_evectors, ref_means)) ; }
static MATRIX * compute_pca(MRI *mri_in, MRI *mri_ref) { int row, col, i ; float dot ; MATRIX *m_ref_evectors = NULL, *m_in_evectors = NULL ; float in_evalues[3], ref_evalues[3] ; double ref_means[3], in_means[3] ; if (!m_ref_evectors) m_ref_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; if (!m_in_evectors) m_in_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; if (binarize) { MRIbinaryPrincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means, thresh_low); MRIbinaryPrincipleComponents(mri_in,m_in_evectors,in_evalues,in_means, thresh_low); } else { MRIprincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means, thresh_low); MRIprincipleComponents(mri_in,m_in_evectors,in_evalues,in_means, thresh_low); } order_eigenvectors(m_in_evectors, m_in_evectors) ; order_eigenvectors(m_ref_evectors, m_ref_evectors) ; /* check to make sure eigenvectors aren't reversed */ for (col = 1 ; col <= 3 ; col++) { #if 0 float theta ; #endif for (dot = 0.0f, row = 1 ; row <= 3 ; row++) dot += m_in_evectors->rptr[row][col] * m_ref_evectors->rptr[row][col] ; if (dot < 0.0f) { fprintf(stderr, "WARNING: mirror image detected in eigenvector #%d\n", col) ; dot *= -1.0f ; for (row = 1 ; row <= 3 ; row++) m_in_evectors->rptr[row][col] *= -1.0f ; } #if 0 theta = acos(dot) ; fprintf(stderr, "angle[%d] = %2.1f\n", col, DEGREES(theta)) ; #endif } fprintf(stderr, "ref_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) fprintf(stderr, "\t\t%2.2f %2.2f %2.2f\n", m_ref_evectors->rptr[i][1], m_ref_evectors->rptr[i][2], m_ref_evectors->rptr[i][3]) ; fprintf(stderr, "\nin_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) fprintf(stderr, "\t\t%2.2f %2.2f %2.2f\n", m_in_evectors->rptr[i][1], m_in_evectors->rptr[i][2], m_in_evectors->rptr[i][3]) ; return(pca_matrix(m_in_evectors, in_means,m_ref_evectors, ref_means)) ; }