1. 程式人生 > >Python計算機視覺程式設計練習1:Python 呼叫 SIFT

Python計算機視覺程式設計練習1:Python 呼叫 SIFT

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 不存在問題

個別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)