1. 程式人生 > >特徵匹配之Brute-Force 匹配和FLANN 匹配器

特徵匹配之Brute-Force 匹配和FLANN 匹配器

使用 OpenCV 中的蠻力(Brute-Force)匹配和 FLANN 匹配。
1:Brute-Force 匹配的基礎
蠻力匹配器是很簡單的。首先在第一幅影象中選取一個關鍵點然後依次與第二幅影象的每個關鍵點進行(描述符)距離測試,最後返回距離最近的關鍵點。
對於 BF 匹配器,我們首先要使用 cv2.BFMatcher() 建立一個 BF-Matcher 物件。它有兩個可選引數。第一個是 normType。它是用來指定要使用的距離測試型別。預設值為 cv2.Norm_L2。這很適合 SIFT 和 SURF 等(c2.NORM_L1 也可以)。對於使用二進位制描述符的 ORB,BRIEF,BRISK演算法等,要使用 cv2.NORM_HAMMING,這樣就會返回兩個測試物件之間的漢明距離。如果 ORB 演算法的引數設定為 V T A_K==3 或 4,normType就應該設定成 cv2.NORM_HAMMING2。
第二個引數是布林變數 crossCheck,預設值為 False。如果設定為True,匹配條件就會更加嚴格,只有到 A 中的第 i 個特徵點與 B 中的第 j 個特徵點距離最近,並且 B 中的第 j 個特徵點到 A 中的第 i 個特徵點也是最近(A 中沒有其他點到 j 的距離更近)時才會返回最佳匹配(i,j)。也就是這兩個特徵點要互相匹配才行。這樣就能提供統一的結果,這可以用來替代 D.Lowe在 SIFT 文章中提出的比值測試方法。
BFMatcher 物件具有兩個方法, BFMatcher.match() 和 BFMatcher.knnMatch()。第一個方法會返回最佳匹配。第二個方法為每個關鍵點返回 k 個最佳匹配(降序排列之後取前 k 個),其中 k 是由使用者設定的。如果除了匹配之外還要做其他事情的話可能會用上(比如進行比值測試)。
就 像 使 用 cv2.drawKeypoints() 繪 制 關 鍵 點 一 樣, 我 們 可 以 使 用cv2.drawMatches() 來繪製匹配的點。它會將這兩幅影象先水平排列,然後在最佳匹配的點之間繪製直線(從原影象到目標影象)。如果前面使用的是 BF-Matcher.knnMatch(),現在我們可以使用函式 cv2.drawMatchsKnn為每個關鍵點和它的 k 個最佳匹配點繪製匹配線。如果 k 等於 2,就會為每個關鍵點繪製兩條最佳匹配直線。如果我們要選擇性繪製話就要給函式傳入一個掩模。

2:FLANN 匹配器
FLANN 是快速最近鄰搜尋包(Fast_Library_for_Approximate_Nearest_Neighbors)的簡稱。它是一個對大資料集和高維特徵進行最近鄰搜尋的演算法的集合,而且這些演算法都已經被優化過了。在面對大資料集時它的效果要好於 BFMatcher。
使用 FLANN 匹配,我們需要傳入兩個字典作為引數。這兩個用來確定要使用的演算法和其他相關引數等。第一個是 IndexParams。indexparams = dict(algorithm = FLANNINDEX K DT REE, trees = 5)
各種不同演算法的資訊可以在 FLANN 文件中找到。
第二個字典是 SearchParams。用它來指定遞迴遍歷的次數。值越高結 果 越 準 確, 但是消耗的時間也越多。 如果你想修改這個值, 傳入參 數:searchparams = dict(checks = 100)。

使用一個查詢影象,在其中找到一些特徵點(關鍵點),我們又在另一幅影象中也找到了一些特徵點,最後對這兩幅影象之間的特徵點進行匹配。簡單來說就是:我們在一張雜亂的影象中找到了一個物件(的某些部分)的位置。這些資訊足以幫助我們在目標影象中準確的找到(查詢影象)物件。
為了達到這個目的可以使用 calib3d 模組中的 cv2.findHomography()函式。如果將這兩幅影象中的特徵點集傳給這個函式,他就會找到這個物件的透檢視變換。然後就可以使用函式cv2.perspectiveTransform() 找到這個物件了。至少要 4 個正確的點才能找到這種變換。
我們已經知道在匹配過程可能會有一些錯誤,而這些錯誤會影響最終結果。為了解決這個問題,演算法使用 RANSAC 和 LEAST_MEDIAN(可以通過引數來設定)。所以好的匹配提供的正確的估計被稱為 inliers,剩下的被稱為outliers。cv2.findHomography() 返回一個掩模,這個掩模確定了 inlier 和outlier 點。

相關推薦

特徵匹配Brute-Force 匹配FLANN 配器

使用 OpenCV 中的蠻力(Brute-Force)匹配和 FLANN 匹配。 1:Brute-Force 匹配的基礎 蠻力匹配器是很簡單的。首先在第一幅影象中選取一個關鍵點然後依次與第二幅影象的每個關鍵點進行(描述符)距離測試,最後返回距離最近的關鍵點。

字串匹配Brute-Force演算法

簡單模式匹配演算法(BF演算法) //匹配成功返回str2在str1中shou首次出現的位置 public static int BForce(String str1, String str2) { int i = 0, j = 0; while (i <

資料結構例程——串的模式匹配Brute-Force演算法)

問題:模式匹配,設有主串s和子串t,在主串s中找到一個與子串t相等的子串。 解答:(標頭檔案sqstring.h見順序串演算法庫) #include <stdio.h> #inc

【20171121早】DVWA練習:low級別Brute Force

con content word int 4.2 books 安全 主機 每次 0x00:簡介   DVWA是滲透測試網站,想研究安全的兄弟們可以安裝在自己的虛擬機中,沒事的時候攻破著玩,老黑最近在玩這個,當然也遇到了坑爹的 事情,話不多說,直接開始! 0x01:環境

DVWABrute Force(暴力破解)

暴力破解是指使用窮舉法,舉出所有的可能的結果,然後逐一驗證是否正確! Low 原始碼: <?php if( isset( $_GET[ 'Login' ] ) ) { // Get username $user = $_GET[ 'username

[算法系列十二]字串匹配蠻力匹配

引言 字串匹配是資料庫開發和文書處理軟體的關鍵。幸運的是所有現代程式語言和字串庫函式,幫助我們的日常工作。不過理解他們的原理還是比較重要的。 字串演算法主要可以分為幾類。字串匹配就是其中之一。當我們提到字串匹配演算法,最基本的方法就是所謂的蠻力解法,這意味著

OpenCV學習FLANN配器

FLANN是快速最近鄰搜尋包(Fast_Library_for_Approximate_Nearest_Neighbors)的簡稱。它是一個對大資料集合高維特徵進行最近鄰搜尋演算法集合。在面對大資料集時,它的效果要好與BFMatcher。#include <iostre

OpenCV學習筆記-FLANN配器

FLANN是快速最近鄰搜尋包(Fast_Library_for_Approximate_Nearest_Neighbors)的簡稱。它是一個對大資料集和高維特徵進行最近鄰搜尋的演算法的集合,而且這些演算法都已經被優化過了。在面對大資料集是它的效果要好於BFMatcher。使用

java實現Brute-ForceKMP模式匹配

Brute-Force模式匹配演算法 從主串第start(i=start)個字元起,與模式串t的第一個字元(j=0)開始比較。 若相等,則繼續比較後面字元(i++,j++) 若不相等,則從主串第二個字元起重新和模式串t比較(i=i-j+1,j=0) 若都匹配成功,則返回模式串t第

Brute-Force模式匹配演算法兩種實現方式

1. public static int indexOf(String mainStr,String subString,int start) { if((mainStr.length()<subString.length()) || mainStr==null || subStr

經典演算法研究系列 九 影象特徵提取與匹配SIFT演算法

                      經典演算法研究系列:九、SIFT演算法研究作者:July、二零一一年二月十五日。推薦閱讀:David G. Lowe, "Distinctive image features from scale-invariant keypoints," Internationa

SURF特徵點檢測與匹配匹配點刪除

SURF特徵點檢測與匹配之誤匹配點刪除 SURF(SpeededUp Robust Feature)是加速版的具有魯棒性的演算法,是SIFT演算法的加速版。 但是SURF特徵匹配之後有大量的誤匹配點,需要對這些誤匹配點進行刪除。 這裡不從理論上講解SURF原理等,直接說用

OpenCV成長路(9):特徵點檢測與影象匹配

特徵點檢測與影象匹配 稱興趣點、關鍵點,它是在影象中突出且具有代表意義的一些點,通過這些點我們可以用來識別影象、進行影象配準、進行3D重建等。本文主要介紹OpenCV中幾種定位與表示關鍵點的函式。 一、Harris角點 角點是影象中最基本的一種關鍵點,它是由影象中一些幾何

scala 模式匹配Type、Array、ListTuple

1、程式碼 package com.yy.base /** * Scala 模式匹配 * Type Array List Tuple */ object PatternMatchMore extends App { println("-----Type

經典演算法研究系列:九、影象特徵提取與匹配SIFT演算法

      經典演算法研究系列:九、SIFT演算法研究作者:July、二零一一年二月十五日。推薦閱讀:David G. Lowe, "Distinctive image features from scale-invariant keypoints," Internation

影象特徵提取與匹配SIFT演算法

推薦閱讀:David G. Lowe, "Distinctive image features from scale-invariant keypoints," International Journal of Computer Vision, 60, 2 (2004),

OpenCV學習筆記__特徵檢測與匹配 SURF演算法

SURF 演算法  ——“加速版的具有魯棒性的特徵”演算法 步驟: 特徵檢測 —— 特徵描述 —— 特徵匹配 實現流程: (1)特徵檢測:SurfFeatureDetector類 . detec

javascript正則表示式最長匹配(貪婪匹配最短匹配(懶惰匹配

最近在閱讀RequireJS 2.1.15原始碼,原始碼開始處定義了一系列的變數,有4個正則表示式: var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)

角點檢測匹配Harris與FAST角點檢測

這一章主要內容:        1. Harris角點檢測        2. FAST特徵檢測       3. 尺度不變的SURF特徵檢測       4.SURF檢測描述 一、引言         在計算機視覺中,特徵點或稱興趣點,角點(即影象的極值點,線段的終點,曲

字符串匹配Sunday算法

detail pat 相等 asc kmp算法 http sin not 參考 Sunday算法不像KMP算法那麽復雜,但是效率又比較高,在KMP之上,下面簡單介紹Sunday算法及其實現。 Sunday 算法由 Daniel M.Sunday 在 1990 年提出,它的思