void DrawAxis::drawAxis(Mat &image, vector<Scalar> &color, int thickness){ arrowedLine(image, imageFramePoints[0], imageFramePoints[1], color[0], thickness); //x axis arrowedLine(image, imageFramePoints[0], imageFramePoints[2], color[1], thickness); //y arrowedLine(image, imageFramePoints[0], imageFramePoints[3], color[2], thickness); //z }
void PCASimpleExample() { // Different possible samples with varying variances along the secondary axis //float samples[][2] = { {30,30}, {50,50}, {101,101}, {151,151}, {201,201}, {251,251}, {311,311}, {351,351}, {411,411}, {391,391} }; float samples[][2] = { {30,30}, {70,50}, {101,81}, {151,171}, {181,201}, {251,271}, {291,311}, {351,371}, {421,411}, {391,391} }; //float samples[][2] = { {30,30}, {120,50}, {41,81}, {221,171}, {151,201}, {211,271}, {391,311}, {301,371}, {501,411}, {391,391} }; int number_of_samples = sizeof(samples)/sizeof(int[2]); Mat samples_matrix(number_of_samples, 2, CV_32FC1, samples); int width = 800; int height = 512; char output[500]; Mat feature_space = Mat::zeros(height, width, CV_8UC3); feature_space.setTo(Scalar(255,255,255)); // Show the samples (as circles) for(int sample=0; sample < number_of_samples; sample++) circle( feature_space, Point((int) samples[sample][0], (int) samples[sample][1]), 3, Scalar( 0,128,0 ), -1, 8); PCA pca(samples_matrix, Mat(), 0, 2 ); Mat eigenvalues = pca.eigenvalues; Mat eigenvectors = pca.eigenvectors; Mat mean = pca.mean; sprintf(output,"Mean (%.1f, %.1f)",((float*) mean.data)[0],((float*) mean.data)[1]); Point location( (int) ((float*) mean.data)[0]+3, (int) ((float*) mean.data)[1] ); putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,255 ) ); for (int row=0; row<eigenvalues.rows; row++) { float eigenvalue = ((float*) eigenvalues.data)[row*eigenvalues.cols]; float length = ((float) height)/(((float) 1.8)*(((float) 1.0)+((float) row))); sprintf(output,"Eigenvalue %.1f Eigenvector (%.4f, %.4f) ",eigenvalue,((float*) eigenvectors.data)[0+row*eigenvectors.cols],((float*) eigenvectors.data)[1+row*eigenvectors.cols]); Point location((int)(((float*) mean.data)[0]+length*((float*) eigenvectors.data)[0+row*eigenvectors.cols])+3,(int)(((float*) mean.data)[0]+length*((float*) eigenvectors.data)[1+row*eigenvectors.cols])+3); putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,255 ) ); arrowedLine(feature_space,Point((int)(((float*) mean.data)[0]-length*((float*) eigenvectors.data)[0+row*eigenvectors.cols]),(int)(((float*) mean.data)[0]-length*((float*) eigenvectors.data)[1+row*eigenvectors.cols])), Point((int)(((float*) mean.data)[0]+length*((float*) eigenvectors.data)[0+row*eigenvectors.cols]),(int)(((float*) mean.data)[0]+length*((float*) eigenvectors.data)[1+row*eigenvectors.cols])), Scalar(0,0,255)); } Mat transformed_samples_matrix = samples_matrix.clone(); for (int sample_number = 0; sample_number<number_of_samples; sample_number++) { Mat sample = samples_matrix.row(sample_number), transformed_sample; pca.project(sample,transformed_sample); transformed_sample.row(0).copyTo(transformed_samples_matrix.row(sample_number)); sprintf(output,"(%.0f, %.0f) -> (%.0f, %.0f)",((float*) sample.data)[0],((float*) sample.data)[1],((float*) transformed_sample.data)[0],((float*) transformed_sample.data)[1]); Point location( (int) ((float*) sample.data)[0]+3, (int) ((float*) sample.data)[1] ); putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); } { // OPTIONAL: Write covariance matrices on images Mat covariance,average,new_covariance,new_average; calcCovarMatrix(samples_matrix,covariance,average,CV_COVAR_NORMAL | CV_COVAR_ROWS); calcCovarMatrix(transformed_samples_matrix,new_covariance,new_average,CV_COVAR_NORMAL | CV_COVAR_ROWS); covariance = covariance/number_of_samples; new_covariance = new_covariance/number_of_samples; location.y = height-100; location.x = 10; sprintf(output,"Original covariance matrix:",((float*) covariance.data)[0+0*covariance.cols],((float*) covariance.data)[1+0*covariance.cols]); putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); sprintf(output,"%5.1f, %5.1f",((double*) covariance.data)[0+0*covariance.cols],((double*) covariance.data)[1+0*covariance.cols]); location.x = 20; location.y += 15; putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); sprintf(output,"%5.1f, %5.1f",((double*) covariance.data)[0+1*covariance.cols],((double*) covariance.data)[1+1*covariance.cols]); location.y += 15; putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); location.y += 30; location.x = 10; sprintf(output,"New covariance matrix:"); putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); sprintf(output,"%5.1f, %5.1f",((double*) new_covariance.data)[0+0*new_covariance.cols],((double*) new_covariance.data)[1+0*new_covariance.cols]); location.x = 20; location.y += 15; putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); sprintf(output,"%5.1f, %5.1f",((double*) new_covariance.data)[0+1*new_covariance.cols],((double*) new_covariance.data)[1+1*new_covariance.cols]); location.y += 15; putText( feature_space, output, location, FONT_HERSHEY_SIMPLEX, 0.4, Scalar( 0,0,0 ) ); } imshow("PCA transformation",feature_space); }