title: c++ Bag Of Words - OpenCV: Assertion Failed
body: <p>I'm trying to get to grips with Bag Of Words in c++ and I have some sample code, but this Error keeps on throwing it and I don't know why.</p>
  
  <p>I'm completely new to this and am very much lost.</p>
  
  <p>Here's the entirety of the code:</p>
  
  <pre><code>#include "stdafx.h"
  #include &lt;opencv/cv.h&gt;
  #include &lt;opencv/highgui.h&gt;
  #include &lt;opencv2/nonfree/features2d.hpp&gt;
  
  using namespace cv;
  using namespace std;
  
  #define DICTIONARY_BUILD 1 // set DICTIONARY_BUILD 1 to do Step 1, otherwise it goes to step 2
  
  int _tmain(int argc, _TCHAR* argv[])
  {   
  #if DICTIONARY_BUILD == 1
  
  //Step 1 - Obtain the set of bags of features.
  
  //to store the input file names
  char * filename = new char[100];        
  //to store the current input image
  Mat input;  
  
  //To store the keypoints that will be extracted by SIFT
  vector&lt;KeyPoint&gt; keypoints;
  //To store the SIFT descriptor of current image
  Mat descriptor;
  //To store all the descriptors that are extracted from all the images.
  Mat featuresUnclustered;
  //The SIFT feature extractor and descriptor
  SiftDescriptorExtractor detector;   
  
  //I select 20 (1000/50) images from 1000 images to extract feature descriptors and build the vocabulary
  for(int f=0;f&lt;999;f+=50){       
      //create the file name of an image
      sprintf(filename,"G:\\testimages\\image\\%i.jpg",f);
  
      //open the file
      input = imread(filename, CV_LOAD_IMAGE_GRAYSCALE); // -- Forgot to add in
  
      //detect feature points
      detector.detect(input, keypoints);
      //compute the descriptors for each keypoint
      detector.compute(input, keypoints,descriptor);      
      //put the all feature descriptors in a single Mat object 
      featuresUnclustered.push_back(descriptor);      
      //print the percentage
      printf("%i percent done\n",f/10);
  }   
  
  
  //Construct BOWKMeansTrainer
  //the number of bags
  int dictionarySize=200;
  //define Term Criteria
  TermCriteria tc(CV_TERMCRIT_ITER,100,0.001);
  //retries number
  int retries=1;
  //necessary flags
  int flags=KMEANS_PP_CENTERS;
  //Create the BoW (or BoF) trainer
  BOWKMeansTrainer bowTrainer(dictionarySize,tc,retries,flags);
  //cluster the feature vectors
  Mat dictionary;
  
  
  dictionary=bowTrainer.cluster(featuresUnclustered); // -- BREAKS
  
  
  //store the vocabulary
  FileStorage fs("dictionary.yml", FileStorage::WRITE);
  fs &lt;&lt; "vocabulary" &lt;&lt; dictionary;
  fs.release();
  
  #else
  //Step 2 - Obtain the BoF descriptor for given image/video frame. 
  
  //prepare BOW descriptor extractor from the dictionary    
  Mat dictionary; 
  FileStorage fs("dictionary.yml", FileStorage::READ);
  fs["vocabulary"] &gt;&gt; dictionary;
  fs.release();   
  
  //create a nearest neighbor matcher
  Ptr&lt;DescriptorMatcher&gt; matcher(new FlannBasedMatcher);
  //create Sift feature point extracter
  Ptr&lt;FeatureDetector&gt; detector(new SiftFeatureDetector());
  //create Sift descriptor extractor
  Ptr&lt;DescriptorExtractor&gt; extractor(new SiftDescriptorExtractor);    
  //create BoF (or BoW) descriptor extractor
  BOWImgDescriptorExtractor bowDE(extractor,matcher);
  //Set the dictionary with the vocabulary we created in the first step
  bowDE.setVocabulary(dictionary);
  
  //To store the image file name
  char * filename = new char[100];
  //To store the image tag name - only for save the descriptor in a file
  char * imageTag = new char[10];
  
  //open the file to write the resultant descriptor
  FileStorage fs1("descriptor.yml", FileStorage::WRITE);  
  
  //the image file with the location. change it according to your image file location
  sprintf(filename,"G:\\testimages\\image\\1.jpg");       
  //read the image
  Mat img=imread(filename,CV_LOAD_IMAGE_GRAYSCALE);       
  //To store the keypoints that will be extracted by SIFT
  vector&lt;KeyPoint&gt; keypoints;     
  //Detect SIFT keypoints (or feature points)
  detector-&gt;detect(img,keypoints);
  //To store the BoW (or BoF) representation of the image
  Mat bowDescriptor;      
  //extract BoW (or BoF) descriptor from given image
  bowDE.compute(img,keypoints,bowDescriptor);
  
  //prepare the yml (some what similar to xml) file
  sprintf(imageTag,"img1");           
  //write the new BoF descriptor to the file
  fs1 &lt;&lt; imageTag &lt;&lt; bowDescriptor;       
  
  //You may use this descriptor for classifying the image.
  
  //release the file storage
  fs1.release();
  #endif
  printf("\ndone\n"); 
  return 0;
  }
  </code></pre>
  
  <p>But then it throws this up:</p>
  
  <p><strong>OpenCV Error: Assertion failed (data.dims &lt;= 2 &amp;&amp; type == CV_32F &amp;&amp; K > 0) in cv::kmeans, file C:\buildslave64\win64_amdoc1\2_4_PackSlave-win32-vc11-shared\opencv\modules\core\src\matrix.cpp, line 2701</strong></p>
  
  <p>Help, please.</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>Line that it breaks on:</p>
  
  <pre><code>dictionary = bowTrainer.cluster(featuresUnclustered); // -- Breaks
  </code></pre>
  
  <p><strong>EDIT 2</strong></p>
  
  <p><a href="https://stackoverflow.com/questions/7015874/opencv-running-kmeans-algorithm-on-an-image">Ive come across this</a>, but i am unsure how to translate it to help with my cause.</p>