Pergunta

Como faço para criar um banco de dados de descritores SIFT (de imagens)? Minha intenção é implementar um treinamento supervisionado definido na máquina de vetor de suporte.

Foi útil?

Solução

Que tipo de imagens você precisa? Se você não se importa, basta baixar algum conjunto de dados público de visão computacional http://lear.inrialpes.fr/~jegou/data.php#holidays que oferece imagens e peneiras já calculadas de suas regiões. Ou tente outros conjuntos de dados, por exemplo, de http://www.cvpapers.com/datasets.html

Outra possibilidade é apenas baixar fazer muitas fotos, detectar o ponto de interesse e descrevê -las com peneiras. Pode ser feito com OpenCV, Vlfeat ou outras bibliotecas.

Exemplo 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top