中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?OpenCV中如何進行特征點檢測與匹配

發布時間:2022-01-17 16:21:23 來源:億速云 閱讀:265 作者:kk 欄目:開發技術

Python OpenCV中如何進行特征點檢測與匹配,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

背景

提取圖像的特征點是圖像領域中的關鍵任務,不管在傳統還是在深度學習的領域中,特征代表著圖像的信息,對于分類、檢測任務都是至關重要的;

特征點應用的一些場景:

圖像搜索:以圖搜圖(電商、教育領域)

圖像拼接:全景拍攝(關聯圖像拼接)

拼圖游戲:游戲領域

一、Harris角點

哈里斯角點檢測主要有以下三種情況:

Python?OpenCV中如何進行特征點檢測與匹配

  • 光滑區域:無論向哪個方向移動,衡量系數不變;

  • 邊緣區域:垂直邊緣移動時,衡量系數變化強烈;

  • 角點區域:不管往哪個方向移動,衡量系數變化強烈;

函數原型:

cornerHarris(img,blockSize,ksize,k)

blockSize:檢測窗口大小;

k:權重系數,一般取0.02~0.04之間;

代碼案例:

img = cv2.imread('chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

dst = cv2.cornerHarris(gray, 2, 3, 0.04)

img[dst > 0.01*dst.max()] = (0, 0, 255)

cv2.imshow('harris', img)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

二、Shi-Tomasi角點檢測

說明:是Harris角點檢測的改進,在Harris中需要知道k這個經驗值,而在Shi-Tomasi不需要;

函數原型:

goodFeaturesToTrack(img,…)

maxCorners:角點的最大數量,值為0表示所有;

qualityLevel:角點的質量,一般在0.01~0.1之間(低于的過濾掉);

minDistance:角點之間最小歐式距離,忽略小于此距離的點;

mask:感興趣區域;

useHarrisDetector:是否使用Harris算法(默認為false)

代碼案例:

img = cv2.imread('chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

dst = cv2.goodFeaturesToTrack(gray, 1000, 0.01, 10)
dst = np.int0(dst)            # 實際上也是np.int64
for i in dst:
    x, y = i.ravel()         # 數組降維成一維數組(inplace的方式)
    cv2.circle(img, (x, y), 3, (0, 0, 255), -1)

cv2.imshow('harris', img)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

本質上和Harris角點檢測相同,效果會好一些,角點數量會多一些;

三、SIFT關鍵點

中文簡譯:與縮放無關的特征轉換;

說明:Harris角點檢測具有旋轉不變性,也就是旋轉圖像并不會影響檢測效果;但其并不具備縮放不變性,縮放大小會影響角點檢測的效果;SIFT具備縮放不變性的性質;

實現步驟:

創建SIFT對象 —— 進行檢測(sift.detect) —— 繪制關鍵點(drawKeypoints)

代碼案例:

img = cv2.imread('chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)      # 第二個參數為mask區域
cv2.drawKeypoints(gray, kp, img)

cv2.imshow('sift', img)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

四、SIFT描述子

首先需要說明,關鍵點和描述子是兩個概念;

關鍵點:位置、大小和方向;

關鍵點描述子:記錄了關鍵點周圍對其有貢獻的像素點的一組向量值,其不受仿射變換,光照變換等影響;描述子的作用就是用于特征匹配;

同時計算關鍵點和描述子的函數(主要使用):

detectAndCompute(img,…)

代碼案例:

img = cv2.imread('chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
kp, dst = sift.detectAndCompute(gray, None)      # 第二個參數為mask區域

得到的dst即為描述子的信息;

五、SURF

中譯:加速的魯棒性特征檢測;

說明:SIFT最大的缺點是速度慢,因此才會有SURF(速度快);

實現步驟與SIFT一致,代碼如下:

surf = cv2.xfeatures2d.SURF_create()
kp, dst = surf.detectAndCompute(gray, None)      # 第二個參數為mask區域
cv2.drawKeypoints(gray, kp, img)

由于安裝的opencv-contrib版本過高(有版權問題),已經不支持該功能了,在此就不作展示了;

六、ORB

說明:最大的優勢就是做到實時檢測,缺點就是缺失了很多信息(準確性下降);

主要是兩個技術的結合:FAST(特征點實時檢測)+ BRIEE(快速描述子建立,降低特征匹配時間)

使用步驟與之前的SIFT一致,代碼如下:

img = cv2.imread('chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

orb = cv2.ORB_create()
kp, dst = orb.detectAndCompute(gray, None)      # 第二個參數為mask區域
cv2.drawKeypoints(gray, kp, img)

cv2.imshow('orb', img)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

可以看出,相比于SIFT以及SURF關鍵點變少了,但是其速度有了很大提升;

七、暴力特征匹配(BF)

匹配原理:類似于窮舉匹配機制,使用第一組中每個特征的描述子與第二組中的進行匹配,計算相似度,返回最接近的匹配項;

實現步驟:

創建匹配器:BFMatcher(normType,crossCheck)

進行特征匹配:bf.match(des1,des2)

繪制匹配點:cv2.drawMatches(img1,kp1,img2,kp2)

代碼案例:

img1 = cv2.imread('opencv_search.png')
img2 = cv2.imread('opencv_orig.png')
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
kp1, dst1 = sift.detectAndCompute(g1, None)      # 第二個參數為mask區域
kp2, dst2 = sift.detectAndCompute(g2, None)      # 第二個參數為mask區域

bf = cv2.BFMatcher_create(cv2.NORM_L1)
match = bf.match(dst1, dst2)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, match, None)

cv2.imshow('result', img3)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

從上圖可看出,匹配的效果還是不錯的,只有一個特征點匹配錯誤;

八、FLANN特征匹配

優點:在進行批量特征匹配時,FLANN速度更快;

缺點:由于使用的時鄰近近似值,所有精度較差;

實現步驟與暴力匹配法一致,代碼如下:

img1 = cv2.imread('opencv_search.png')
img2 = cv2.imread('opencv_orig.png')
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
kp1, dst1 = sift.detectAndCompute(g1, None)      # 第二個參數為mask區域
kp2, dst2 = sift.detectAndCompute(g2, None)      # 第二個參數為mask區域

index_params = dict(algorithm = 1, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matchs = flann.knnMatch(dst1, dst2, k=2)

good = []
for i, (m, n) in enumerate(matchs):
    if m.distance < 0.7 * n.distance:
        good.append(m)
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None)

cv2.imshow('result', img3)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

上圖可以看出,匹配的特征點數量相比暴力匹配明顯變少了,但速度會快很多;

九、圖像查找

實現原理:特征匹配 + 單應性矩陣;

單應性矩陣原理介紹:

Python?OpenCV中如何進行特征點檢測與匹配

上圖中表示從兩個不同角度對原圖的拍攝,其中H為單應性矩陣,可通過該矩陣將圖像進行轉換;

下面使用兩個函數實現圖像查找的功能:

findHomography():獲得單應性矩陣;

perspectivveTransform():仿射變換函數;

代碼實現如下:

img1 = cv2.imread('opencv_search.png')
img2 = cv2.imread('opencv_orig.png')
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
kp1, dst1 = sift.detectAndCompute(g1, None)      # 第二個參數為mask區域
kp2, dst2 = sift.detectAndCompute(g2, None)      # 第二個參數為mask區域

index_params = dict(algorithm = 1, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matchs = flann.knnMatch(dst1, dst2, k=2)

good = []
for i, (m, n) in enumerate(matchs):
    if m.distance < 0.7 * n.distance:
        good.append(m)
if len(good) >= 4:
    # 獲得源和目標點的數組
    srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
    dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
    
    # 獲得單應性矩陣H
    H, _ = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)
    h, w = img1.shape[:2]
    pts = np.float32([[0,0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)
    # 進行放射變換
    dst = cv2.perspectiveTransform(pts, H)
    
    # 繪制查找到的區域
    cv2.polylines(img2, [np.int32(dst)], True, (0,0,255))
else:
    print('good must more then 4.')
    exit()
    
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None)

cv2.imshow('result', img3)
cv2.waitKey(0)

Python?OpenCV中如何進行特征點檢測與匹配

Python主要用來做什么

Python主要應用于:1、Web開發;2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發;5、游戲開發;6、桌面應用開發。

關于Python OpenCV中如何進行特征點檢測與匹配問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江油市| 临清市| 西平县| 西充县| 灵山县| 蛟河市| 贵南县| 宁乡县| 元朗区| 万载县| 正定县| 梁山县| 吴忠市| 偏关县| 舞钢市| 黑水县| 孟连| 汾西县| 来凤县| 察哈| 鹤岗市| 乡宁县| 大连市| 隆德县| 留坝县| 宁明县| 安阳县| 台安县| 安塞县| 巴塘县| 太仓市| 昌宁县| 英德市| 文水县| 武冈市| 介休市| 拉萨市| 安泽县| 乡城县| 黄龙县| 定兴县|