Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.23 KB | None | 0 0
  1. INCLUDEPATH += /usr/include/opencv
  2. LIBS += -L/usr/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui
  3.  
  4.  
  5. #include "ml.h"
  6. #include "highgui.h"
  7.  
  8. int main( int argc, char** argv )
  9. {
  10. const int K = 10;
  11. int i, j, k, accuracy;
  12. float response;
  13. int train_sample_count = 100;
  14. CvRNG rng_state = cvRNG(-1);
  15. CvMat* trainData = cvCreateMat( train_sample_count, 2, CV_32FC1 );
  16. CvMat* trainClasses = cvCreateMat( train_sample_count, 1, CV_32FC1 );
  17. IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
  18. float _sample[2];
  19. CvMat sample = cvMat( 1, 2, CV_32FC1, _sample );
  20. cvZero( img );
  21.  
  22. CvMat trainData1, trainData2, trainClasses1, trainClasses2;
  23.  
  24. // form the training samples
  25. cvGetRows( trainData, &trainData1, 0, train_sample_count/2 );
  26. cvRandArr( &rng_state, &trainData1, CV_RAND_NORMAL, cvScalar(200,200), cvScalar(50,50) );
  27.  
  28. cvGetRows( trainData, &trainData2, train_sample_count/2, train_sample_count );
  29. cvRandArr( &rng_state, &trainData2, CV_RAND_NORMAL, cvScalar(300,300), cvScalar(50,50) );
  30.  
  31. cvGetRows( trainClasses, &trainClasses1, 0, train_sample_count/2 );
  32. cvSet( &trainClasses1, cvScalar(1) );
  33.  
  34. cvGetRows( trainClasses, &trainClasses2, train_sample_count/2, train_sample_count );
  35. cvSet( &trainClasses2, cvScalar(2) );
  36.  
  37. // learn classifier
  38. CvKNearest knn( trainData, trainClasses, 0, false, K );
  39. CvMat* nearests = cvCreateMat( 1, K, CV_32FC1);
  40.  
  41. for( i = 0; i < img->height; i++ )
  42. {
  43. for( j = 0; j < img->width; j++ )
  44. {
  45. sample.data.fl[0] = (float)j;
  46. sample.data.fl[1] = (float)i;
  47.  
  48. // estimate the response and get the neighbors' labels
  49. response = knn.find_nearest(&sample,K,0,0,nearests,0);
  50.  
  51. // compute the number of neighbors representing the majority
  52. for( k = 0, accuracy = 0; k < K; k++ )
  53. {
  54. if( nearests->data.fl[k] == response)
  55. accuracy++;
  56. }
  57. // highlight the pixel depending on the accuracy (or confidence)
  58. cvSet2D( img, i, j, response == 1 ?
  59. (accuracy > 5 ? CV_RGB(180,0,0) : CV_RGB(180,120,0)) :
  60. (accuracy > 5 ? CV_RGB(0,180,0) : CV_RGB(120,120,0)) );
  61. }
  62. }
  63.  
  64. // display the original training samples
  65. for( i = 0; i < train_sample_count/2; i++ )
  66. {
  67. CvPoint pt;
  68. pt.x = cvRound(trainData1.data.fl[i*2]);
  69. pt.y = cvRound(trainData1.data.fl[i*2+1]);
  70. cvCircle( img, pt, 2, CV_RGB(255,0,0), CV_FILLED );
  71. pt.x = cvRound(trainData2.data.fl[i*2]);
  72. pt.y = cvRound(trainData2.data.fl[i*2+1]);
  73. cvCircle( img, pt, 2, CV_RGB(0,255,0), CV_FILLED );
  74. }
  75.  
  76. cvNamedWindow( "classifier result", 1 );
  77. cvShowImage( "classifier result", img );
  78. cvWaitKey(0);
  79.  
  80. cvReleaseMat( &trainClasses );
  81. cvReleaseMat( &trainData );
  82. return 0;
  83. }
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. 120 изображений, 6 эмоций. По 20 картинок на каждую эмоцию. Каждое изображение характеризуется 76 точками. Следовательно, каждое изображение представляется вектором в 76-мерном пространстве. При попытке классификации изображение оно представляется аналогичным векторов и рассчитываются расстояние от этого вектора до каждого из других векторов. Выбираются k ближайших соседей. объект относится к тому классу, чье число соседей максимально. В задаче классификации двумерных точек у нас 100 обучающих примеров. Матрица обучающей выборки имеет размерность 100*2, а матрица классов 100*1. Далее множество входных данных делится на 2 класса по 50 элементов. При помощи метода setScalar каждому из подмассивов ставится в соответствие число.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement