Pregunta

¿Cómo creo una base de datos de descriptores SIFT (de imágenes)? Mi intención es implementar un conjunto de capacitación supervisión en la máquina de vectores de soporte.

¿Fue útil?

Solución

¿Qué tipo de imágenes necesitas? Si no le importa, puede descargar un conjunto de datos de visión de computadora pública como http://lear.inrialpes.fr/~jegou/data.php#holidays que ofrece ambas imágenes y tamizos ya calculados de sus regiones. O pruebe otros conjuntos de datos, por ejemplo, desde http://www.cvpapers.com/datasets.html

Otra posibilidad es descargar hacer muchas fotos, detectar el punto de interés y describirlas con tamizos. Se puede hacer con Opencv, Vlfeat u otras bibliotecas.

Ejemplo de OpenCV.

    #include <opencv2/opencv.hpp>
    #include <opencv2/nonfree/nonfree.hpp>
    #include <fstream>


    void WriteSIFTs(std::vector<cv::KeyPoint> &keys, cv::Mat desc, std::ostream &out1)
    {
      for(int i=0; i < (int) keys.size(); i++)
        {
          out1 << keys[i].pt.x << " " << keys[i].pt.y << " " << keys[i].size << " " << keys[i].angle << " "; 
//If you don`t need information about keypoints (position, size) 
//you can comment out the string above

          float* descPtr = desc.ptr<float>(i);
          for (int j = 0; j < desc.cols; j++)
              out1  << *descPtr++ << " ";
          out1 << std::endl;
        }

    }


    int main(int argc, const char* argv[])
    {
      const cv::Mat img1 = cv::imread("graf.png", 0); //Load as grayscale

      cv::SiftFeatureDetector detector;
      std::vector<cv::KeyPoint> keypoints;
      detector.detect(img1, keypoints);

      cv::SiftDescriptorExtractor extractor;
      cv::Mat descriptors;
      extractor.compute(img1, keypoints, descriptors);

      std::ofstream file1("SIFTs1.txt");
      if (file1.is_open())
        WriteSIFTs(keypoints,descriptors,file1);
      file1.close();
      return 0;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top