SIFT 实现 Python 错误



我正在使用 vlfeat.org 的SIFT实现,vlfeat.py。

我不断收到一个错误,指出索引太多,行号指示执行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

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

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

cmmd = str("sift "+imagename+" --output="+resultname+ " "+params) 
os.system(cmmd) 

这个python vlf模块是否有完成处理时的处理程序/回调?

否则,如果可以修改process_image函数,则可以使用子进程并等待外部应用程序完成再返回进程。另请参阅python子进程隐藏标准输出并等待它完成

编辑:

确保你有外部筛选.exe可从python工作目录访问。

SIFT现在可作为OpenCV主存储库的一部分使用(SIFT的专利已过期)。

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

cv2.SIFT_create()

最新更新