【问题标题】:SIFT implementation Python errorSIFT实现Python错误
【发布时间】:2020-10-06 15:54:59
【问题描述】:

我在 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

【问题讨论】:

  • process_image 是否可能异步发生?
  • 这是 process_image() 的样子:def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"): """ 处理图像并保存结果在一个文件中""" if imagename[-3:] != 'pgm': #创建一个 pgm 文件 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() 用于 .jpg 文件吗?您是否尝试过先转换为 .pgm?

标签: python sift


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    看起来它是异步的,因为它通过名为 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。

    【讨论】:

      【解决方案3】:

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

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

      cv2.SIFT_create()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-11
        • 2015-02-06
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        相关资源
        最近更新 更多