예제 #1
0
파일: DrawAxis.cpp 프로젝트: DrM0SK4/Ass1
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

}
예제 #2
0
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);
}