sift 计算机视觉――描述子

匿名 (未验证) 提交于 2019-12-03 00:19:01

描述子实现代码

这里使用开源工具包VLFeat提供的二进制文件来计算图像的SIFT特征。用完整的Python实现SIFT特征的所有步骤可能效率不是很高。VLFeat工具包可以从http://www.vlfeat.org/下载,二进制文件可以在所有主要的平台上运行。VLFeat库是用C语言来写的,但是我们可以使用该库提供的命令行接口。以在Windows 10 64bit平台上为例,下载的文件为vlfeat-0.9.20-bin.tar.gz,解压缩后,将vlfeat-0.9.20/bin/win64文件夹下的sift.exevl.dll
代码如下所示:

# -*- coding: utf-8 -*- from PIL import Image from pylab import * from numpy import * import os  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  def read_features_from_file(filename):     """读取特征属性值,然后将其以矩阵的形式返回"""     f = loadtxt(filename)     return f[:,:4], f[:,4:] #特征位置,描述子  def write_featrues_to_file(filename, locs, desc):     """将特征位置和描述子保存到文件中"""     savetxt(filename, hstack((locs,desc)))  def plot_features(im, locs, circle=False):     """显示带有特征的图像        输入:im(数组图像),locs(每个特征的行、列、尺度和朝向)"""      def draw_circle(c,r):         t = arange(0,1.01,.01)*2*pi         x = r*cos(t) + c[0]         y = r*sin(t) + c[1]         plot(x, y, 'b', linewidth=2)      imshow(im)     if circle:         for p in locs:             draw_circle(p[:2], p[2])     else:          plot(locs[:,0], locs[:,1], 'ob')     axis('off')  imname = 'empire.jpg' im1 = array(Image.open(imname).convert('L')) process_image(imname, 'empire.sift') l1,d1 = read_features_from_file('empire.sift')  figure() gray() plot_features(im1, l1, circle=True) show()  

FileNotFoundError: [Errno 2] No such file or directory: 'empire.sift'

下载旧版,0.9.20,里面有win64版本的,把vlfeat-0.9.20\bin 下面的sift.exe和vl.dll 拷到目录下面就好了了 效果图如下:
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!