前面我們已經(jīng)了解了Harris函數(shù)來進(jìn)行角點(diǎn)檢測,因?yàn)榻屈c(diǎn)的特性,這些角點(diǎn)在圖像旋轉(zhuǎn)的時候也可以被檢測到。但是,如果我們放大或縮小圖像時,就可能會丟失圖像的某些部分,甚至有可能增加角點(diǎn)的質(zhì)量。這種損失的現(xiàn)象需要一種與圖像比例無關(guān)的角點(diǎn)檢測方法來解決。
SIFT(Scale-Invariant Feature Transform)尺度不變特征變換可以解決這個問題。
注意: SIFT 并不檢測關(guān)鍵點(diǎn)(關(guān)鍵點(diǎn)由Difference of Gaussians檢測),SIFT會通過一個特征向量來描述關(guān)鍵點(diǎn)周圍區(qū)域的情況。DoG操作的最終結(jié)果會得到感興趣的區(qū)域(關(guān)鍵點(diǎn)),這將通過SIFT來進(jìn)行說明。
函數(shù)說明:
sift =cv2.SIFT_create([, nfeatures[, nOctaveLayers[,
contrastThreshold[, edgeThreshold]]]])
參數(shù):
-
nfeatures: 保留的最佳功能的數(shù)量。這些特征按其分?jǐn)?shù)排名(在SIFT算法中作為局部對比度測量)。
-
nOctaveLayers:每個八度中的層數(shù)。3是D.Lowe(原作者)論文中使用的值。八度的數(shù)量是根據(jù)圖像分辨率自動計算的。
-
contrastThreshold:用于過濾掉半均勻(低對比度)區(qū)域中的弱特征的對比度閾值。閾值越大,檢測器產(chǎn)生的特征越少。應(yīng)用過濾時,對比度閾值將被nOctaveLayers除。當(dāng)nOctaveLayers設(shè)置為默認(rèn)值并且如果要使用D.Lowe論文中使用的值0.03時,請將此參數(shù)設(shè)置為0.09。
-
edgeThreshold:用于過濾邊緣特征的閾值。請注意,其含義與contrastThreshold不同,即edgeThreshold越大,濾除的特征越少(保留的特征越多)。
返回值:
- sift:實(shí)例化一個sift特征檢測器。
示例:對圖像檢測DoG特征并提取SIFT描述符
實(shí)驗(yàn)原圖:
import cv2
import numpy as np
img = cv2.imread('images\\sumian.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)
img = cv2.drawKeypoints(image= img, outImage= img, keypoints= keypoints, flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color= (0, 0, 255))
cv2.imshow('sift', img)
cv2.waitKey()
cv2.destroyAllWindows()
發(fā)現(xiàn)是,如果你沿用之前的代碼即
descriptor = cv2.xfeatures2d.SIFT_create()
會出現(xiàn)一個warning,但不影響結(jié)果。
[ WARN:0@0.037] global shadow_sift.hpp:15 cv::xfeatures2d::SIFT_create DEPRECATED: cv.xfeatures2d.SIFT_create() is deprecated due SIFT tranfer to the main repository. https://github.com/opencv/opencv/issues/16736
這是因?yàn)樾掳姹镜腟IFT可以直接引用,不再需要安裝contrib包,即
descriptor = cv2.SIFT_create()
官方公告可參見 OpenCV Google Summer of Code 2020
新代碼如下:
import cv2
img = cv2.imread('images\\sumiao.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#sift = cv2.xfeatures2d.SIFT_create()
sift = cv2.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)
img = cv2.drawKeypoints(image= img, outImage= img, keypoints= keypoints, flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color= (0, 0, 255))
cv2.imshow('sift', img)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行效果:文章來源:http://www.zghlxwxcb.cn/news/detail-673921.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-673921.html
到了這里,關(guān)于opencv 進(jìn)階15-檢測DoG特征并提取SIFT描述符cv2.SIFT_create()的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!