OpenCV-Python 特徵匹配|四十四

2020-12-06 人工智慧遇見磐創

目標

在本章中,

我們將看到如何將一個圖像中的特徵與其他圖像進行匹配。我們將在OpenCV中使用Brute-Force匹配器和FLANN匹配器Brute-Force匹配器的基礎

蠻力匹配器很簡單。它使用第一組中一個特徵的描述符,並使用一些距離計算將其與第二組中的所有其他特徵匹配。並返回最接近的一個。

對於BF匹配器,首先我們必須使用cv.BFMatcher()創建BFMatcher對象。它需要兩個可選參數。第一個是normType,它指定要使用的距離測量。默認情況下為cv.NORM_L2。對於SIFT,SURF等(也有cv.NORM_L1)很有用。對於基於二進位字符串的描述符,例如ORB,BRIEF,BRISK等,應使用cv.NORM_HAMMING,該函數使用漢明距離作為度量。如果ORB使用WTA_K == 3或4,則應使用cv.NORM_HAMMING2

第二個參數是布爾變量,即crossCheck,默認情況下為false。如果為true,則Matcher僅返回具有值(i,j)的那些匹配項,以使集合A中的第i個描述符具有集合B中的第j個描述符為最佳匹配,反之亦然。即兩組中的兩個特徵應彼此匹配。它提供了一致的結果,並且是D.Lowe在SIFT論文中提出的比率測試的良好替代方案。

創建之後,兩個重要的方法是BFMatcher.match()和BFMatcher.knnMatch()。第一個返回最佳匹配。第二種方法返回k個最佳匹配,其中k由用戶指定。當我們需要對此做其他工作時,它可能會很有用。

就像我們使用cv.drawKeypoints()繪製關鍵點一樣,cv.drawMatches()可以幫助我們繪製匹配項。它水平堆疊兩張圖像,並繪製從第一張圖像到第二張圖像的線,以顯示最佳匹配。還有cv.drawMatchesKnn繪製所有k個最佳匹配。如果k=2,它將為每個關鍵點繪製兩條匹配線。因此,如果要選擇性地繪製,則必須通過掩碼。

讓我們來看一個SIFT和ORB的示例(兩者都使用不同的距離測量)。

使用ORB描述符進行Brute-Force匹配

在這裡,我們將看到一個有關如何在兩個圖像之間匹配特徵的簡單示例。在這種情況下,我有一個queryImage和trainImage。我們將嘗試使用特徵匹配在trainImage中找到queryImage。(圖像是/samples/data/box.png和/samples/data/boxinscene.png)

我們正在使用ORB描述符來匹配特徵。因此,讓我們從加載圖像,查找描述符等開始。

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltimg1 = cv.imread('box.png',cv.IMREAD_GRAYSCALE) # 索引圖像img2 = cv.imread('box_in_scene.png',cv.IMREAD_GRAYSCALE) # 訓練圖像# 初始化ORB檢測器orb = cv.ORB_create()# 基於ORB找到關鍵點和檢測器kp1, des1 = orb.detectAndCompute(img1,None)kp2, des2 = orb.detectAndCompute(img2,None)接下來,我們創建一個距離測量值為cv.NORM_HAMMING的BFMatcher對象(因為我們使用的是ORB),並且啟用了CrossCheck以獲得更好的結果。然後,我們使用Matcher.match()方法來獲取兩個圖像中的最佳匹配。我們按照距離的升序對它們進行排序,以使最佳匹配(低距離)排在前面。然後我們只抽出前10的匹配(只是為了提高可見度。您可以根據需要增加它)

# 創建BF匹配器的對象bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True) # 匹配描述符.matches = bf.match(des1,des2) # 根據距離排序matches = sorted(matches, key = lambda x:x.distance) # 繪製前10的匹配項img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:10],None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) plt.imshow(img3),plt.show()將獲得以下的結果:

什麼是Matcher對象?

matchs = bf.match(des1,des2)行的結果是DMatch對象的列表。該DMatch對象具有以下屬性:

DMatch.distance-描述符之間的距離。越低越好。DMatch.trainIdx-火車描述符中的描述符索引DMatch.queryIdx-查詢描述符中的描述符索引DMatch.imgIdx-火車圖像的索引。帶有SIFT描述符和比例測試的Brute-Force匹配

這次,我們將使用BFMatcher.knnMatch()獲得k個最佳匹配。在此示例中,我們將k = 2,以便可以應用D.Lowe在他的論文中闡述的比例測試。

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltimg1 = cv.imread('box.png',cv.IMREAD_GRAYSCALE) # 索引圖像img2 = cv.imread('box_in_scene.png',cv.IMREAD_GRAYSCALE) # 訓練圖像# 初始化SIFT描述符sift = cv.xfeatures2d.SIFT_create()# 基於SIFT找到關鍵點和描述符kp1, des1 = sift.detectAndCompute(img1,None)kp2, des2 = sift.detectAndCompute(img2,None)# 默認參數初始化BF匹配器bf = cv.BFMatcher()matches = bf.knnMatch(des1,des2,k=2)# 應用比例測試good = []for m,n in matches: if m.distance < 0.75*n.distance: good.append([m])# cv.drawMatchesKnn將列表作為匹配項。img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)plt.imshow(img3),plt.show()查看以下結果:

基於匹配器的FLANN

FLANN是近似最近鄰的快速庫。它包含一組算法,這些算法針對大型數據集中的快速最近鄰搜索和高維特徵進行了優化。對於大型數據集,它的運行速度比BFMatcher快。我們將看到第二個基於FLANN的匹配器示例。

對於基於FLANN的匹配器,我們需要傳遞兩個字典,這些字典指定要使用的算法,其相關參數等。第一個是IndexParams。對於各種算法,要傳遞的信息在FLANN文檔中進行了說明。概括來說,對於SIFT,SURF等算法,您可以通過以下操作:

FLANN_INDEX_KDTREE = 1 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)使用ORB時,你可以參考下面。根據文檔建議使用帶注釋的值,但在某些情況下未提供必需的參數。其他值也可以正常工作。

FLANN_INDEX_LSH = 6index_params= dict(algorithm = FLANN_INDEX_LSH, table_number = 6, # 12 key_size = 12, # 20 multi_probe_level = 1) #2第二個字典是SearchParams。它指定索引中的樹應遞歸遍歷的次數。較高的值可提供更好的精度,但也需要更多時間。如果要更改值,請傳遞search_params = dict(checks = 100)

有了這些信息,我們就很容易了。

import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltimg1 = cv.imread('box.png',cv.IMREAD_GRAYSCALE) # 索引圖像img2 = cv.imread('box_in_scene.png',cv.IMREAD_GRAYSCALE) # 訓練圖像# 初始化SIFT描述符sift = cv.xfeatures2d.SIFT_create()# 基於SIFT找到關鍵點和描述符kp1, des1 = sift.detectAndCompute(img1,None)kp2, des2 = sift.detectAndCompute(img2,None)# FLANN的參數FLANN_INDEX_KDTREE = 1index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)search_params = dict(checks=50) # 或傳遞一個空字典flann = cv.FlannBasedMatcher(index_params,search_params)matches = flann.knnMatch(des1,des2,k=2)# 只需要繪製好匹配項,因此創建一個掩碼matchesMask = [[0,0] for i in range(len(matches))]# 根據Lowe的論文進行比例測試for i,(m,n) in enumerate(matches): if m.distance < 0.7*n.distance: matchesMask[i]=[1,0]draw_params = dict(matchColor = (0,255,0), singlePointColor = (255,0,0), matchesMask = matchesMask, flags = cv.DrawMatchesFlags_DEFAULT)img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)plt.imshow(img3,),plt.show()查看以下結果:

相關焦點

  • 如何快速簡單的安裝opencv-python
    這樣就會從清華鏡像安裝opencv-contrib-python庫。目前opencv最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • opencv-python圖像預處理-濾波
    頻率域是指從函數的頻率角度出發分析函數,對圖像進行傅立葉變換可以將圖像由圖像空間轉換到頻域空間,然後在頻率域中對圖像的頻譜作分析處理,以改變圖像的頻率特徵。空間域與頻率域是兩種不同的技術,都可以實現對圖像的濾波、增強,只是有些處理方式更適合在空間域完成,而有些則更適合在頻率域中完成。
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • OpenCV特徵點檢測——ORB特徵
    這個特徵描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進位串,並將這個二進位串作為該特徵點的特徵描述子。
  • OpenCV-Python 特徵匹配 + 單應性查找對象|四十五
    目標在本章節中,我們將把calib3d模塊中的特徵匹配和findHomography混合在一起,以在複雜圖像中找到已知對象。基礎那麼我們在上一環節上做了什麼?我們使用了queryImage,找到了其中的一些特徵點,我們使用了另一個trainImage,也找到了該圖像中的特徵,並且找到了其中的最佳匹配。簡而言之,我們在另一個混亂的圖像中找到了對象某些部分的位置。此信息足以在trainImage上準確找到對象。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 使用OpenCV和Python構建自己的車輛檢測模型
    utm_source=blog&utm_medium=vehicle-detection-opencv-python)利用深度學習的計算機視覺(https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2?
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
  • OpenCV-Python SIFT尺度不變特徵變換|三十九
    因此,在2004年,不列顛哥倫比亞大學的D.Lowe在他的論文《尺度不變關鍵點中的獨特圖像特徵》中提出了一種新算法,即尺度不變特徵變換(SIFT),該算法提取關鍵點並計算其描述算符。 (改論文易於理解,被認為是學習SIFT的最佳材料。因此,本文只是該論文的簡短摘要)。 SIFT算法主要包括四個步驟。
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    一、python中opencv打開圖像方法:import cv2filename='dog.jpg'img=cv2.imread(filename)cv2.imshow('Main Window',img)cv2.waitKey() #任意鍵退出cv2.destroyAllWindows()二、python中用opencv打開視頻頭的方法:
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    php-opencv:https://github.com/hihozhou/php-opencv這是圖像加載的方法:$image = cvimread(「images/faces.jpg」);相比之下,在 python 下圖像加載是這樣的:
  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼第1行導入opencv模塊。代碼的第3行(以上圖為準,空行也算一行),導入別人已經訓練好的臉部識別資料庫。這裡用到的數據是在github上開源的已經訓練好的分類器,如圖所示:需要將對應的數據文件(.xml文件)下載到指定目錄(代碼中的示例,展示的是與.py文件同一目錄下)。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • Python第三方庫安裝
    pypi.org其中PyPI: Python Package Index是由PSF維護的展示全球Python計算生態的主站如要安裝圖像處理opencv-python庫可以搜索 opencv,但結果如下:
  • 基於opencv 的圖像處理入門教程
    檢測和修正歪曲的文字顏色檢測去噪檢測圖片的輪廓移除圖片的背景原文地址:https://likegeeks.com/python-image-processing/代碼和樣例圖片的地址:https://github.com/ccc013/CodesNotes/tree/master/opencv_noteshttps://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb