sift.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import numpy as np
  2. __all__ = ['load_sift', 'load_surf']
  3. def _sift_read(filelike, mode='SIFT'):
  4. """Read SIFT or SURF features from externally generated file.
  5. This routine reads SIFT or SURF files generated by binary utilities from
  6. http://people.cs.ubc.ca/~lowe/keypoints/ and
  7. http://www.vision.ee.ethz.ch/~surf/.
  8. This routine *does not* generate SIFT/SURF features from an image. These
  9. algorithms are patent encumbered. Please use :obj:`skimage.feature.CENSURE`
  10. instead.
  11. Parameters
  12. ----------
  13. filelike : string or open file
  14. Input file generated by the feature detectors from
  15. http://people.cs.ubc.ca/~lowe/keypoints/ or
  16. http://www.vision.ee.ethz.ch/~surf/ .
  17. mode : {'SIFT', 'SURF'}, optional
  18. Kind of descriptor used to generate `filelike`.
  19. Returns
  20. -------
  21. data : record array with fields
  22. - row: int
  23. row position of feature
  24. - column: int
  25. column position of feature
  26. - scale: float
  27. feature scale
  28. - orientation: float
  29. feature orientation
  30. - data: array
  31. feature values
  32. """
  33. if isinstance(filelike, str):
  34. f = open(filelike)
  35. filelike_is_str = True
  36. else:
  37. f = filelike
  38. filelike_is_str = False
  39. if mode == 'SIFT':
  40. nr_features, feature_len = map(int, f.readline().split())
  41. datatype = np.dtype(
  42. [
  43. ('row', float),
  44. ('column', float),
  45. ('scale', float),
  46. ('orientation', float),
  47. ('data', (float, feature_len)),
  48. ]
  49. )
  50. else:
  51. mode = 'SURF'
  52. feature_len = int(f.readline()) - 1
  53. nr_features = int(f.readline())
  54. datatype = np.dtype(
  55. [
  56. ('column', float),
  57. ('row', float),
  58. ('second_moment', (float, 3)),
  59. ('sign', float),
  60. ('data', (float, feature_len)),
  61. ]
  62. )
  63. data = np.fromfile(f, sep=' ')
  64. if data.size != nr_features * datatype.itemsize / np.dtype(float).itemsize:
  65. raise OSError(f'Invalid {mode} feature file.')
  66. # If `filelike` is passed to the function as filename - close the file
  67. if filelike_is_str:
  68. f.close()
  69. return data.view(datatype)
  70. def load_sift(f):
  71. return _sift_read(f, mode='SIFT')
  72. def load_surf(f):
  73. return _sift_read(f, mode='SURF')
  74. load_sift.__doc__ = _sift_read.__doc__
  75. load_surf.__doc__ = _sift_read.__doc__