Python 调用 VLFeat 接口

最近,一直在抽空学习 Python计算机视觉编程,因为目前还没有一本较为完整且适合初学者来使用的 Python计算机视觉教程,所以前前后后遇到了不少的问题,每次遇到调试代码出错,甚是头疼,完全找不到解决的思路,有时候耗费了我很多的精力和时间。暂时打算以系列博文来记录一下我学习中遇到的一些问题,方便后来人。
#####说明:Matlab,VS 调用VLFeat 就不用参考本文了,VLFeat 工具包中 readme 和官网上有详细教程。本文针对官网上没有提到的 Python 调用VLFeat 情况。


VLFeat 以及 SIFT 相关资源

实现平台:Win64 + Pycharm/anaconda ( 同时我也安装了 anaconda ,因为它自带了很完整的库,无需自己去费时费力的去安装)

VLFeat工具包: 官方下载链接,如果打开速度较慢的话,也可以使用我上传的这个CSDN下载链接。VLFeat 工具包中含有大量的完整的代码实现,如下图。
这里写图片描述

SIFT:这个就不得不提到大牛 Lowe 了。因为接下来实现的就是调用他写的 SIFT demo。提上链接,供大家参详,SIFT主页。本文使用 的 是VLFeat 工具包(内含SIFT),所以这个你不用下载。当然你如果不想使用VLFeat工具包,直接使用这个也行,链接奉上CSDN下载链接
这里写图片描述

开始正题

###**1.**下载VLFeat 工具包并解压。
按照下图的路径一次打开,显然我们将要使用的就是 win32/win64根据你自己的系统选择。我是windows7 64位操作系统,自然选择 win64这个文件夹。
这里写图片描述

###**2.**调用VLFeat。(方法二,较为简单,我采用了方法二)
方法一:把 VLFaet 添加到环境变量中。
方法二:把Win64文件夹直接复制到自己的Python工程项目中。我在项目中新建了一个名为VLFeat的文件夹,将复制的win64文件家直接粘贴在这个新建的文件中。
这里写图片描述
这里写图片描述

###**3.**代码调整
主要使用到三个py文件,我已经上传了。使用说明:下载上面三个py文件,放在一起,用Pycharm 打开 test5_sift.py。
sift.py
test5_sift.py
harris.py harris角点检测就是顺带放在里面做对比玩的。。。你也可以不用,在 test5_sift.py 中,将对应的代码删掉就行了。
这里写图片描述
这里写图片描述

####test5_sift.py部分代码事例

#python
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'Image process module'
from PIL import Image
from pylab import *
"""
我这边已经是按照自己的习惯,都已经改为包和文件了,如果你想使用本程序,请根据#号的提示,做相应的修改。我的sift.py 和 harris.py 均在PCV/localdescriptors/路径下,所以下面两句的 import 导入你都要修改。
"""
from PCV.localdescriptors import sift           #这是我导入的方式,你的就改为 import sift
from PCV.localdescriptors import harris         #这是我导入的方式,你的就改为 import harris
imname = ('/Python-PCV/Test/test.jpg')          #路径替换为自己测试图片的路径
im = array(Image.open(imname).convert('L'))
sift.process_image(imname,'test.sift')
l1,d1 = sift.read_features_from_file('test.sift')
figure()
gray()
subplot(131)
"""
图1 :SIFT特征
"""
sift.plot_features(im,l1,circle = False)
title('sift-features')
subplot(132)
"""
图2 :使用圆圈表示特征尺度的SIFT特征
"""
sift.plot_features(im,l1,circle = True)
title('sift_features_det')
harrisim = harris.compute_harris_response(im)
filtered_coords = harris.get_harris_points(harrisim,6,0.1)
subplot(133)
"""
图3 :harris角点检测的结果
"""
imshow(im)
plot([p[1]for p in filtered_coords],[p[0] for p in filtered_coords])
axis('off')
title('harris')
show()

####sift.py部分代码事例

#python
from PIL import Image
from numpy import *
from pylab import *
import os

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中的"E:\Python-PCV\VLFeat\win64\sift.exe "路径修改为步骤2中的路径下的sift.exe。
务必注意,sift.exe后面还有一个空格不能丢!!!
"""
    cmmd = str("E:\Python-PCV\VLFeat\win64\sift.exe "+imagename+" --output="+resultname+
                " "+params) 
    os.system(cmmd)
    print 'processed', imagename, 'to', resultname

###**4.**修改好了,那就跑一跑呗。
在pycharm打开的test5_sift.py中,使用快捷键:Shift+F10,运行代码。效果如下。

这里写图片描述

###****5.2016/11/09更新:针对 test.sift 不存在问题1
个别win 7 64位操作系统,使用win64下的sift,可能会出现查找不到test.sift。
其实很简单,做个简单的替换就行了,上面的使用VLFeat就是个简单例子,你也可以尝试Lowe大牛的sift.
解决方案:
(1)使用win32代替VLFeat/win64

cmmd = str("D:\PCV\VLFeat\win32\sift.exe "+imagename+" --output="+resultname+
                " "+params)

(2)使用大牛 Lowe 的sift。原理一样的,解压、拷贝,然后在sift.py中修改路径

cmmd = str("D:\PCV\VLFeat\siftDemoV4\siftWin32.exe "+imagename+" --output="+resultname+
                " "+params)

###****6.2019/03/19更新:针对 test.sift 不存在问题2
部分网友找不到win32。我贴个官方链接:下载以前的老版本:vlfeat-0.9.20-bin.tar.gz
http://www.vlfeat.org/download/

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐