我正在尝试从一组图像补丁中创建一个代码簿。我将图像(Caltech 101)划分为20 X 20图像色块。我想为每个补丁创建一个SIFT描述符。但对于某些图像补丁,它不会返回任何描述符/关键点。我尝试过使用OpenCV和vlfeat。 使用任何库都行为相同。
以下是使用OpenCV的代码 -
sift = cv2.SIFT()
img = cv2.imread('patch_temp.jpg',0)
imgptch = cv2.imread('image_patch.jpg',cv2.CV_LOAD_IMAGE_GRAYSCALE)
kp, des = sift.detectAndCompute(imgptch,None)
print des
des is'无'。如果我使用vlfeat也是如此。 注意:如果我使用不同的图像,则上述工作正常。对于某些图像,它返回None(10个中的6个)。
我使用OpenCV索引创建了图像补丁 -
patch = img[0:20,0:20]
cv2.imwrite('image_patch.jpg',img)
答案 0 :(得分:2)
函数sift.detectAndCompute
将首先尝试检测SIFT关键点然后计算找到位置的描述符。
这不是您想要的:您希望每个补丁都有一个描述符。
您可以先设置关键点位置(通过将其pt
属性调整到修补程序的中心并将其size
属性调整为修补程序大小)。
然后,只调用这组位置上的描述符提取器。