Python / OpenCV如何处理.yml文件中的大量SIFT特性?

时间:2018-01-18 18:52:47

标签: python numpy opencv yaml sift

我正在使用OpenCv,我使用yaml来存储SIFT关键点和描述符。 我有一个1659张图片的数据库(.jpg,每张图片大约95 KB)。对于每个图像,我使用关键点和描述符创建了一个.yml文件。现在,对于单个图像,我最终得到了700个关键点和描述符,从而产生了一个ca. 4MB,我想避免使用二进制文件 我的问题是:

  
      
  • 如何知道图像的数量是否足够?
  •   
  • 有什么方法可以控制功能的数量?例如,为SIFT设置阈值?
  •   
  • 现在使用cv2.FileStorage.write将numpy矩阵存储到yamil文件中,OpenCv使用16位有效数字(例如1.9705572128295898e + 00)写入每个数字。如果我减少有效数字会有问题吗?例如到4?
  •   

1 个答案:

答案 0 :(得分:0)

  
      
  1. 如何知道功能的数量是否适合图像?
  2.   

这必须取决于你的形象,你的任务要求。你应该比别人更清楚,或者做实验来说清楚。

  
      
  1. 有什么方法可以控制功能的数量?
  2.   

当然。创建时,只需传递必要的参数。

cv2.xfeatures2d.SIFT_create([, nfeatures[, nOctaveLayers[, contrastThreshold[, edgeThreshold[, sigma]]]]]) -> retval
 | . @param nfeatures The number of best features to retain. The features are ranked by their scores
 | . (measured in SIFT algorithm as the local contrast)
 | .
 | . @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. 
 | . The number of octaves is computed automatically from the image resolution.
 | .
 | . @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
 | . (low-contrast) regions. The larger the threshold, the less features are produced by the detector.
 | .
 | . @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
 | . is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
 | . filtered out (more features are retained).
 | .
 | . @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
 | . is captured with a weak camera with soft lenses, you might want to reduce the number.
 |

例如,我创建了一个具有50个关键点和3层的筛选检测器:

sift = cv2.xfeatures2d.SIFT_create(nfeatures = 50, nOctaveLayers=3)

这是检测结果:

enter image description here

  
      
  1. 太久了。我知道你在OpenCV-Python中将大量的关键点和描述符存储成.yml格式。
  2.   

好的,当您要存储大量数据时,.yml真的有帮助吗?这是真的合理吗?你真的需要keypoint (points2f, size, response, octave, class_id)的每一个元素吗?对于描述符,它是直方图或int数组。所以即使你把它保存为int,值也没关系。