我正在使用OpenCv,我使用yaml来存储SIFT关键点和描述符。 我有一个1659张图片的数据库(.jpg,每张图片大约95 KB)。对于每个图像,我使用关键点和描述符创建了一个.yml文件。现在,对于单个图像,我最终得到了700个关键点和描述符,从而产生了一个ca. 4MB,我想避免使用二进制文件 我的问题是:
- 如何知道图像的数量是否足够?
- 有什么方法可以控制功能的数量?例如,为SIFT设置阈值?
- 现在使用
cv2.FileStorage.write
将numpy矩阵存储到yamil文件中,OpenCv使用16位有效数字(例如1.9705572128295898e + 00)写入每个数字。如果我减少有效数字会有问题吗?例如到4?
答案 0 :(得分:0)
- 如何知道功能的数量是否适合图像?
醇>
这必须取决于你的形象,你的任务要求。你应该比别人更清楚,或者做实验来说清楚。
- 有什么方法可以控制功能的数量?
醇>
当然。创建时,只需传递必要的参数。
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)
这是检测结果:
- 太久了。我知道你在OpenCV-Python中将大量的关键点和描述符存储成.yml格式。
醇>
好的,当您要存储大量数据时,.yml
真的有帮助吗?这是真的合理吗?你真的需要keypoint (points2f, size, response, octave, class_id)
的每一个元素吗?对于描述符,它是直方图或int数组。所以即使你把它保存为int,值也没关系。