SIFT实现Python错误

3

我正在使用vlfeat.org提供的Python SIFT实现,即vlfeat.py。

我一直收到一个错误,指出索引太多,而行号表明当执行read_features_from_file()时发生了错误。

我还注意到文件features1.sift是空的,这意味着在执行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

process_image 可能是异步发生的吗? - Jono
最好将其添加到原始帖子中,这样您可以将其格式化为代码。 - Jono
我已经自己添加了它。看起来它是异步的,因为它通过cmd调用一个名为sift.exe的外部程序。这个Python VLF模块是否有处理程序/回调函数来处理它完成处理的情况? - Jono
我不确定是否有。 - user2761615
1
你确定可以使用process_image()函数处理.jpg文件吗?你尝试过先转换为.pgm格式再处理吗? - darmat
显示剩余5条评论
3个回答

1

尝试使用我使用的二进制版本vlfeat-0.9.21-bin.tar.gz,这会导致错误。尝试使用旧版本vlfeat-0.9.20-bin.tar.gz。


0

看起来它是异步的,因为它通过 cmd 调用名为 sift.exe 的外部程序。

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。

0

SIFT现在作为主要的OpenCV存储库的一部分提供(SIFT专利已过期)。

您可以使用最新版本的OpenCV(截至今天的版本为4.4)检查它。尝试使用以下代码进行SIFT。

cv2.SIFT_create()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接