我在vlfeat.py中使用vlfeat.org中的SIFT实现。
我一直收到错误,指出索引太多,行号表示执行read_features_from_file()
时发生错误。
我还注意到文件 features1.sift 是空的,这意味着在executing process_image()
时出现了问题。
代码段:
from PIL import Image
from pylab import *
import vlfeat as vlf
vlf.process_image('semper1.jpg','features1.sift', params="--edge-thresh 10 --peak-thresh 5")
l1,d1 = vlf.read_features_from_file('features1.sift')
image = array(Image.open('semper1.jpg'))
vlf.process_image('semper2.jpg','features2.sift', params="--edge-thresh 10 --peak-thresh 5")
l2,d2 = vlf.read_features_from_file('feautures2.sift')
image2 = array(Image.open('semper2.jpg'))
matches = vlf.match(d1,d2)
imshow(image)
for k in xrange(len(matches)):
if matches[k] > 0:
plot(l1[k, 0], l1[k, 1], 'r.')
plot([l1[k,0], l2[matches[k,0],0]], [l1[k,1], l2[matches[k,0],1]], 'b-')
show()
这是process_image的样子:
def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"):
""" process an image and save the results in a file"""
if imagename[-3:] != 'pgm':
#create a pgm file
im = Image.open(imagename).convert('L')
im.save('tmp.pgm')
imagename = 'tmp.pgm'
cmmd = str("sift "+imagename+" --output="+resultname+ " "+params)
os.system(cmmd)
print 'processed', imagename, 'to', resultname
答案 0 :(得分:0)
看起来它是异步的,因为它通过名为sift.exe的cmd调用外部程序。
cmmd = str("sift "+imagename+" --output="+resultname+ " "+params)
os.system(cmmd)
这个python vlf模块在完成处理时是否有处理程序/回调?
否则,如果您可以修改process_image函数,则可以使用subprocess并等到外部应用程序完成后再返回进程。 另请参阅python subprocess hide stdout and wait it to complete
编辑:
确保您可以从python工作目录访问外部sift.exe。
答案 1 :(得分:0)
尝试旧的vlfeat版本,我使用二进制文件vlfeat-0.9.21-bin.tar.gz,这给了我这个错误。尝试使用旧版本vlfeat-0.9.20-bin.tar.gz。
答案 2 :(得分:0)
SIFT现在可作为主要opencv存储库的一部分(SIFT的专利已过期)。
您可以使用opencv的最新版本(从今天起4.4)进行检查。尝试使用以下代码进行筛选。
cv2.SIFT_create()