SIFT特征提取與檢索


一、SIFT算法介紹

1.SIFT算法簡介:SIFT(Scale-invariant feature transform)是一種檢測局部特征的算法,該算法通過求一幅圖中的特征點(interest points,or corner points)及其有關scale 和 orientation 的描述子得到特征並進行圖像特征點匹配,SIFT特征不只具有尺度不變性,即使改變旋轉角度,圖像亮度或拍攝視角,仍然能夠得到好的檢測效果。

2.算法描述:

(1) 構建尺度空間

這是一個初始化操作,尺度空間理論目的是模擬圖像數據的多尺度特征。

高斯卷積核是實現尺度變換的唯一線性核,於是一副二維圖像的尺度空間定義為:

 

 

 其中 G(x,y,σ) 是尺度可變高斯函數 

(x,y)是空間坐標,是尺度坐標。σ大小決定圖像的平滑程度,大尺度對應圖像的概貌特征,小尺度對應圖像的細節特征。大的σ值對應粗糙尺度(低分辨率),反之,對應精細尺度(高分辨率)。為了有效的在尺度空間檢測到穩定的關鍵點,提出了高斯差分尺度空間(DOG scale-space)。利用不同尺度的高斯差分核與圖像卷積生成。

 

下圖所示不同σ下圖像尺度空間:

關於尺度空間的理解說明:2kσ中的2是必須的,尺度空間是連續的。在  Lowe的論文中 ,將第0層的初始尺度定為1.6(最模糊),圖片的初始尺度定為0.5(最清晰). 在檢測極值點前對原始圖像的高斯平滑以致圖像丟失高頻信息,所以 Lowe 建議在建立尺度空間前首先對原始圖像長寬擴展一倍,以保留原始圖像信息,增加特征點數量。尺度越大圖像越模糊。 

圖像金字塔的建立:對於一幅圖像I,建立其在不同尺度(scale)的圖像,也成為子八度(octave),這是為了scale-invariant,也就是在任何尺度都能夠有對應的特征點,第一個子八度的scale為原圖大小,后面每個octave為上一個octave降采樣的結果,即原圖的1/4(長寬分別減半),構成下一個子八度(高一層金字塔)。

 

尺度空間的所有取值,i為octave的塔數(第幾個塔),s為每塔層數

由圖片size決定建幾個塔,每塔幾層圖像(S一般為3-5層)。0塔的第0層是原始圖像(或你double后的圖像),往上每一層是對其下一層進行Laplacian變換(高斯卷積,其中σ值漸大,例如可以是σ, k*σ, k*k*σ…),直觀上看來越往上圖片越模糊。塔間的圖片是降采樣關系,例如1塔的第0層可以由0塔的第3層down sample得到,然后進行與0塔類似的高斯卷積操作。

(2) LoG近似DoG找到關鍵點<檢測DOG尺度空間極值點>

為了尋找尺度空間的極值點,每一個采樣點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。如圖所示,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。 一個點如果在DOG尺度空間本層以及上下兩層的26個領域中是最大或最小值時,就認為該點是圖像在該尺度下的一個特征點,如圖所示。

 

同一組中的相鄰尺度(由於k的取值關系,肯定是上下層)之間進行尋找

 

                                          s=3的情況

 在極值比較的過程中,每一組圖像的首末兩層是無法進行極值比較的,為了滿足尺度變化的連續性

,我們在每一組圖像的頂層繼續用高斯模糊生成了 3 幅圖像,高斯金字塔有每組S+3層圖像。DOG金字塔每組有S+2層圖像.

(3) 除去不好的特征點

這一步本質上要去掉DoG局部曲率非常不對稱的像素。

通過擬和三維二次函數以精確確定關鍵點的位置和尺度(達到亞像素精度),同時去除低對比度的關鍵點和不穩定的邊緣響應點(因為DoG算子會產生較強的邊緣響應),以增強匹配穩定性、提高抗噪聲能力,在這里使用近似Harris Corner檢測器。

①空間尺度函數泰勒展開式如下:

  對上式求導,並令其為0,得到精確的位置, 得

 

 

 

②在已經檢測到的特征點中,要去掉低對比度的特征點和不穩定的邊緣響應點。去除低對比度的點:把公式(2)代入公式(1),即在DoG Space的極值點處D(x)取值,只取前兩項可得:

 

若   

該特征點就保留下來,否則丟棄。

③邊緣響應的去除
一個定義不好的高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。主曲率通過一個2×2 的Hessian矩陣H求出:

導數由采樣點相鄰差估計得到。

D的主曲率和H的特征值成正比,令α為較大特征值,β為較小的特征值,則

令α=γβ,則

 

 (r + 1)2/r的值在兩個特征值相等的時候最小,隨着r的增大而增大,因此,為了檢測主曲率是否在某域值r下,只需檢測


if (α+β)/ αβ> (r+1)2/r, throw it out.   在Lowe的文章中,取r=10。

(4)給特征點賦值一個128維方向參數

上一步中確定了每幅圖中的特征點,為每個特征點計算一個方向,依照這個方向做進一步的計算, 利用關鍵點鄰域像素的梯度方向分布特性為每個關鍵點指定方向參數,使算子具備旋轉不變性。

 

為(x,y)處梯度的模值和方向公式。其中L所用的尺度為每個關鍵點各自所在的尺度。至此,圖像的關鍵點已經檢測完畢,每個關鍵點有三個信息:位置,所處尺度、方向,由此可以確定一個SIFT特征區域。

 

梯度直方圖的范圍是0~360度,其中每10度一個柱,總共36個柱。隨着距
      中心點越遠的領域其對直方圖的貢獻也響應減小.Lowe論文中還提到要使用高斯函數對直方圖進行平滑,減少突變的影響。

在實際計算時,我們在以關鍵點為中心的鄰域窗口內采樣,並用直方圖統計鄰域像素的梯度方向。梯度直方圖的范圍是0~360度,其中每45度一個柱,總共8個柱, 或者每10度一個柱,總共36個柱。Lowe論文中還提到要使用高斯函數對直方圖進行平滑,減少突變的影響。直方圖的峰值則代表了該關鍵點處鄰域梯度的主方向,即作為該關鍵點的方向。

 

直方圖中的峰值就是主方向,其他的達到最大值80%的方向可作為輔助方向

 

由梯度方向直方圖確定主梯度方向

該步中將建立所有scale中特征點的描述子(128維)

 

 

 

關鍵點描述子的生成步驟

 

 通過對關鍵點周圍圖像區域分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域圖像信息的一種抽象,具有唯一性。


(5)關鍵點描述子的生成

首先將坐標軸旋轉為關鍵點的方向,以確保旋轉不變性。以關鍵點為中心取8×8的窗口。

 

Figure.16*16的圖中其中1/4的特征點梯度方向及scale,右圖為其加權到8個主方向后的效果。

圖左部分的中央為當前關鍵點的位置,每個小格代表關鍵點鄰域所在尺度空間的一個像素,利用公式求得每個像素的梯度幅值與梯度方向,箭頭方向代表該像素的梯度方向,箭頭長度代表梯度模值,然后用高斯窗口對其進行加權運算。

圖中藍色的圈代表高斯加權的范圍(越靠近關鍵點的像素梯度方向信息貢獻越大)。然后在每4×4的小塊上計算8個方向的梯度方向直方圖,繪制每個梯度方向的累加值,即可形成一個種子點,如圖右部分示。此圖中一個關鍵點由2×2共4個種子點組成,每個種子點有8個方向向量信息。這種鄰域方向性信息聯合的思想增強了算法抗噪聲的能力,同時對於含有定位誤差的特征匹配也提供了較好的容錯性。

計算keypoint周圍的16*16的window中每一個像素的梯度,而且使用高斯下降函數降低遠離中心的權重。

在每個4*4的1/16象限中,通過加權梯度值加到直方圖8個方向區間中的一個,計算出一個梯度方向直方圖。

這樣就可以對每個feature形成一個4*4*8=128維的描述子,每一維都可以表示4*4個格子中一個的scale/orientation. 將這個向量歸一化之后,就進一步去除了光照的影響。

(6)根據SIFT進行Match

生成了A、B兩幅圖的描述子,(分別是k1*128維和k2*128維),就將兩圖中各個scale(所有scale)的描述子進行匹配,匹配上128維即可表示兩個特征點match上了。

實際計算過程中,為了增強匹配的穩健性,Lowe建議對每個關鍵點使用4×4共16個種子點來描述,這樣對於一個關鍵點就可以產生128個數據,即最終形成128維的SIFT特征向量。此時SIFT特征向量已經去除了尺度變化、旋轉等幾何變形因素的影響,再繼續將特征向量的長度歸一化,則可以進一步去除光照變化的影響。 當兩幅圖像的SIFT特征向量生成后,下一步我們采用關鍵點特征向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取圖像1中的某個關鍵點,並找出其與圖像2中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離少於某個比例閾值,則接受這一對匹配點。降低這個比例閾值,SIFT匹配點數目會減少,但更加穩定。為了排除因為圖像遮擋和背景混亂而產生的無匹配關系的關鍵點,Lowe提出了比較最近鄰距離與次近鄰距離的方法,距離比率ratio小於某個閾值的認為是正確匹配。因為對於錯誤匹配,由於特征空間的高維性,相似的距離可能有大量其他的錯誤匹配,從而它的ratio值比較高。Lowe推薦ratio的閾值為0.8。但作者對大量任意存在尺度、旋轉和亮度變化的兩幅圖片進行匹配,結果表明ratio取值在0. 4~0. 6之間最佳,小於0. 4的很少有匹配點,大於0. 6的則存在大量錯誤匹配點。(如果這個地方你要改進,最好給出一個匹配率和ration之間的關系圖,這樣才有說服力)作者建議ratio的取值原則如下:

ratio=0. 4 對於准確度要求高的匹配;
ratio=0. 6 對於匹配點數目要求比較多的匹配; 
ratio=0. 5 一般情況下。
也可按如下原則:當最近鄰距離<200時ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分錯誤匹配點。

當兩幅圖像的SIFT特征向量生成后,下一步我們采用關鍵點特征向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取圖像1中的某個關鍵點,並找出其與圖像2中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離少於某個比例閾值,則接受這一對匹配點。降低這個比例閾值,SIFT匹配點數目會減少,但更加穩定。

 

二、SIFT特征提取

1.源代碼

復制代碼

復制代碼
# -*- coding: utf-8 -*-

from PIL import Image

from pylab import *

from PCV.localdescriptors import sift

from PCV.localdescriptors import harris

# 添加中文字體支持

from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

imname = 'b9.jpg'

im = array(Image.open(imname).convert('L'))

sift.process_image(imname, 'b9.sift')

l1, d1 = sift.read_features_from_file('b9.sift')

figure()

gray()

subplot(131)

sift.plot_features(im, l1, circle=False)

title(u'SIFT特征', fontproperties=font)

show()

復制代碼
復制代碼

 

 

 

 2.部分圖片實驗結果如下

3.SIFT算法和Harris算法比較

實驗結果

小結:由實驗結果可以看出,sift算法檢測出圖片的特征更多,運行時,sift算法的效率遠高與harris算法。兩個算法由於選擇特征點的方法不同,而顯示出了差異。

 三、圖片SIFT特征匹配

1.源代碼

復制代碼

復制代碼
# -*- coding: utf-8 -*-
#SIFT算法
from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift

im1f = 'C:/Users/LE/PycharmProjects/untitled/b5.jpg'
im2f = 'C:/Users/LE/PycharmProjects/untitled/b12.jpg'
im1 = array(Image.open(im1f).convert('L'))
im2 = array(Image.open(im2f).convert('L'))

sift.process_image(im1f, 'out_sift_1.txt')
l1, d1 = sift.read_features_from_file('out_sift_1.txt')
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)

sift.process_image(im2f, 'out_sift_2.txt')
l2, d2 = sift.read_features_from_file('out_sift_2.txt')
subplot(122)
sift.plot_features(im2, l2, circle=False)

#matches = sift.match(d1, d2)
matches = sift.match_twosided(d1, d2)
print ('{} matches'.format(len(matches.nonzero()[0])))

figure()
gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
show()


復制代碼
復制代碼
 

2.實驗結果

(1)旋轉圖和正面圖

 

 

 (2)正面圖和側面圖

 

 (3)不同場景匹配

 

 小結:由實驗結果可以看出,實驗(1)(2)是在同一場景下進行,無論任何角度都可以進行匹配,是因為SIFT算法具有尺度和旋轉不變性,而實驗(3)是在不同場景下進行,明顯看出不能匹配,這也證明了sift算法的可行性和有效性。

 

 

 三、SIFT圖片數據集檢索匹配

1.源代碼

復制代碼

復制代碼
from PIL import Image
from pylab import *
from PCV.localdescriptors import sift
import matplotlib.pyplot as plt


im1f = 'C:/Users/LE/PycharmProjects/untitled/12.jpg'
im1 = array(Image.open(im1f))
sift.process_image(im1f, 'out_sift_1.txt')
l1, d1 = sift.read_features_from_file('out_sift_1.txt')

arr=[]
arrHash = {}
for i in range(1,15):

im2f = (r'C:/Users/LE/PycharmProjects/untitled/'+str(i)+'.jpg')
im2 = array(Image.open(im2f))
sift.process_image(im2f, 'out_sift_2.txt')
l2, d2 = sift.read_features_from_file('out_sift_2.txt')
matches = sift.match_twosided(d1, d2)
length=len(matches.nonzero()[0])
length=int(length)
arr.append(length)
arrHash[length]=im2f

arr.sort()
arr=arr[::-1]
arr=arr[:3]
i=0
plt.figure(figsize=(5,12))
for item in arr:
if(arrHash.get(item)!=None):
img=arrHash.get(item)
im1 = array(Image.open(img))
ax=plt.subplot(511 + i)
ax.set_title('{} matches'.format(item))
plt.axis('off')
imshow(im1)
i = i + 1

plt.show()


復制代碼
復制代碼

2.實驗結果

檢索的圖片

 

 

運行結果

 

 小結:由實驗結果可以看出,sift算法不受圖片角度,大小的影響,仍有較高的檢測效率,具有非常強的穩健性。

四、匹配地理標記圖像

1.數據集

 

 

2.源代碼

 

 

復制代碼

 

復制代碼

 


# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import sift
from PCV.tools import imtools
import pydot

""" This is the example graph illustration of matching images from Figure 2-10.
To download the images, see ch2_download_panoramio.py."""

#download_path = "panoimages" # set this to the path where you downloaded the panoramio images
#path = "/FULLPATH/panoimages/" # path to save thumbnails (pydot needs the full system path)

download_path = "C:\Users\LE\PycharmProjects\untitled" # set this to the path where you downloaded the panoramio images
path = "C:\Users\LE\PycharmProjects\untitled" # path to save thumbnails (pydot needs the full system path)

imlist = imtools.get_imlist(download_path)
nbr_images = len(imlist)

featlist = [imname[:-3] + 'sift' for imname in imlist]
for i, imname in enumerate(imlist):
sift.process_image(imname, featlist[i])

matchscores = zeros((nbr_images, nbr_images))

for i in range(nbr_images):
for j in range(i, nbr_images): # only compute upper triangle
print('comparing ', imlist[i], imlist[j])
l1, d1 = sift.read_features_from_file(featlist[i])
l2, d2 = sift.read_features_from_file(featlist[j])
matches = sift.match_twosided(d1, d2)
nbr_matches = sum(matches > 0)
print('number of matches = ', nbr_matches)
matchscores[i, j] = nbr_matches
print("The match scores is: \n", matchscores)
for i in range(nbr_images):
for j in range(i + 1, nbr_images): # no need to copy diagonal
matchscores[j, i] = matchscores[i, j]

threshold = 2 # min number of matches needed to create link

g = pydot.Dot(graph_type='graph') # don't want the default directed graph

for i in range(nbr_images):
for j in range(i + 1, nbr_images):
if matchscores[i, j] > threshold:
# first image in pair
im = Image.open(imlist[i])
im.thumbnail((100, 100))
filename = path + str(i) + '.png'
im.save(filename) # need temporary files of the right size
g.add_node(pydot.Node(str(i), fontcolor='transparent', shape='rectangle', image=filename))

# second image in pair
im = Image.open(imlist[j])
im.thumbnail((100, 100))
filename = path + str(j) + '.png'
im.save(filename) # need temporary files of the right size
g.add_node(pydot.Node(str(j), fontcolor='transparent', shape='rectangle', image=filename))
g.add_edge(pydot.Edge(str(i), str(j)))
g.write_png('untitled.png')

 



 

復制代碼

 

復制代碼
 

 

 

3.運行結果

 

 

 小結:我拍了同一場景不同角度的15張照片作為數據集,還拍了1張不同場景的圖片做對比。由實驗結果可以看出,圖片的匹配度很高,尤其是正面圖片和其他不同角度圖片的匹配度最高,因為正面圖包含特征點比較多,在計算匹配度時與其他圖片特征點連接率最大。實驗結果證明不同場景的圖片無法匹配,但同時我發現有幾張同一場景不同角度圖片無法匹配,這應該是我拍攝的角度和光線明暗問題造成的,因為我拍的建築物的正面圖及側面圖沒有很好的包含俯視圖的特征點,而且俯視圖有一張在晚上拍攝並且建築物自帶燈光這對於圖片特征點的檢索是有影響的,有一張是在白天拍攝並且只拍了局部,這對於正面的全景圖來說匹配到這個局部太難了,即使不熟悉的人看了也不會覺得是同一個地方,因為為了加快代碼運行速度,我降低了圖片像素,這也降低算法對圖片特征點的檢索,對於局部圖特征點的檢索較好,也造成了無法匹配的結果。我還有一個問題就是拍攝的圖片都過於相似,並且沒有在同一時間拍攝,這其實並不能很好的說明匹配算法的准確性,下次會加以改正。

五、RANSAC算法應用

1.RANSAC算法

1.1算法簡介:
RANSAC算法的基本假設是樣本中包含正確數據(inliers,可以被模型描述的數據),也包含異常數據(outliers,偏離正常范圍很遠、無法適應數學模型的數據),即數據集中含有噪聲。這些異常數據可能是由於錯誤的測量、錯誤的假設、錯誤的計算等產生的。同時RANSAC也假設,給定一組正確的數據,存在可以計算出符合這些數據的模型參數的方法。
1.2基本思想描述:
①考慮一個最小抽樣集的勢為n的模型(n為初始化模型參數所需的最小樣本數)和一個樣本集P,集合P的樣本數#(P)>n,從P中隨機抽取包含n個樣本的P的子集S初始化模型M;
②余集SC=P\S中與模型M的誤差小於某一設定閾值t的樣本集以及S構成S*。S*認為是內點集,它們構成S的一致集(Consensus Set);
③若#(S*)≥N,認為得到正確的模型參數,並利用集S*(內點inliers)采用最小二乘等方法重新計算新的模型M*;重新隨機抽取新的S,重復以上過程。
④在完成一定的抽樣次數后,若未找到一致集則算法失敗,否則選取抽樣后得到的最大一致集判斷內外點,算法結束。

 2.應用於圖像拼接

使用RANSAC算法估計出圖像間的單應性矩陣,將所有的圖像扭曲到一個公共的圖像平面上。通常,這里的公共平面為中心圖像平面。一種方法是創建一個很大的圖像,比如將圖像中全部填充0,使其和中心圖像平行,然后將所有的圖像扭曲到上面。由於我們所有的圖像是由照相機水平旋轉拍攝的,因此我們可以使用一個較簡單的步驟:將中心圖像左邊或者右邊的區域填充為0,以便為扭曲的圖像騰出空間。
3.代碼實現

3.1源代碼

復制代碼

 

復制代碼

 

 
        
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift

# set paths to data folder
featname = ['C:/Users/LE/PycharmProjects/untitled/hh/' + str(i + 1) + '.sift' for i in range(4)]
imname = ['C:/Users/LE/PycharmProjects/untitled/hh/' + str(i + 1) + '.jpg' for i in range(4)]

# extract features and match
l = {}
d = {}
for i in range(4):
sift.process_image(imname[i], featname[i])
l[i], d[i] = sift.read_features_from_file(featname[i])

matches = {}
for i in range(3):#2
matches[i] = sift.match(d[i + 1], d[i])

# visualize the matches (Figure 3-11 in the book)
for i in range(3):#2
im1 = array(Image.open(imname[i]))
im2 = array(Image.open(imname[i + 1]))
figure()
sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)


# function to convert the matches to hom. points
def convert_points(j):
ndx = matches[j].nonzero()[0]
fp = homography.make_homog(l[j + 1][ndx, :2].T)
ndx2 = [int(matches[j][i]) for i in ndx]
tp = homography.make_homog(l[j][ndx2, :2].T)

# switch x and y - TODO this should move elsewhere
fp = vstack([fp[1], fp[0], fp[2]])
tp = vstack([tp[1], tp[0], tp[2]])
return fp, tp


# estimate the homographies
model = homography.RansacModel()

fp, tp = convert_points(1)
H_12 = homography.H_from_ransac(fp, tp, model)[0] # im 1 to 2

fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0] # im 0 to 1

# warp the images
delta = 1000 # for padding and translation

im1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)

im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)

figure()
imshow(array(im_02, "uint8"))
axis('off')
show()

 



 

復制代碼

 

復制代碼
 
 
3.2 不同場景實驗
3.2.1景深豐富
數據集

 

 sift匹配

 

圖像拼接

 

 小結:由實驗結果可以看出,在景深豐富的條件下拼接效果不是很好,這與ransac算法提取圖片特征點多少有關,還有即使圖片角度不會太大影響算法提取特征點的效率,但會影響圖片拼接結果

3.2.2景深單一

數據集

 

 

sift特征匹配

 

 

 圖片拼接

小結:由實驗結果可以看出,景深單一的條件下圖片的拼接明顯比景深豐富拼接的效果好

 
 

六、總結

1.SIFT算法可以解決圖片目標的旋轉、縮放、平移 圖像仿射/投影變換 、弱光照影響 、部分目標遮擋 、雜物場景 、 噪聲等問題

2.SIFT算法的特征:
①獨特性,特征點可分辨性高。
②多量性,物體可提供的特征多。
③高速性,速度快。
④可擴展,與其他形式的特征向量進行聯合較為方便。

3.RANSAC只能從特定的數據集中估計出一個模型,如果存在兩個(或多個)模型,RANSAC則不能找到別的模型。
優點:很好的估計模型參數,能從包含大量局外點的數據集中估計出高精度的參數
缺點:它計算參數的迭代次數沒有上限,如果設置迭代次數的上限,得到的結果可能不是最優的結果,甚至可能得到錯誤的結果

七、實驗過程遇到的問題

1.在配置vlfeat時,根據學姐給的配置步驟,下好vlfeat包解壓后,應直接將sift.exe和vl.dll兩個程序文件直接復制到自己運行的項目文件里,這里我畫蛇添足又創建了一個文件夾存放,導致運行代碼時報錯找不到sift。

2.由於上次做harris實驗得知圖片像素過高造成代碼無法運行,所以這次將圖片像素降低太多,導致實驗作對比時無法得出具有說服力的結論。

3.在配置環境時安裝graphviz和pydot,確保安裝順序正確:graphviz->grapphviz軟件本身->pydot,完成配置后運行代碼出現這樣的問題

 

 

 這時需要打開 anaconda\Lib\site-packages 這個文件夾目錄,找到pydot.py文件。在1712行(左Ctrl加F查找 self.prog)找到代碼,原代碼為self.prog = 'dot',將這行改為dot.exe所在位置:

 

 

 記住要加r,保存后再運行程序得以解決。

4.運行ransac算法代碼時遇到此問題

 

 這是由於圖片像素沒有設置一致,將所有圖片像素設置相同得以解決,同時像素不能太大會降低運行速度,也不能過小,這樣提取的特征點不夠准確。

5.還有兩個未解決的問題

 

 

 這可能與圖片本身有關,在無法解決后,我換了新的數據集才能進行實驗。

 

 

參考文章:https://blog.csdn.net/abcjennifer/article/details/7639681/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM