OpenCV 使用 FLANN 庫實現特徵匹配
目標
在這篇文章中你將學到:
- 使用 FlannBasedMatcher 介面來執行快速高效的匹配,用的是 FLANN ( Fast Approximate Nearest Neighbor Search Library ) 演算法
程式碼
完整程式碼可從這裡 下載
/**
* @file SURF_FlannMatcher
* @brief SURF detector + descriptor + FLANN Matcher
* @author A. Huaman
*/
#include "opencv2/opencv_modules.hpp"
#include <stdio.h>
#ifndef HAVE_OPENCV_NONFREE
int main(int, char**)
{
printf("The sample requires nonfree module that is not available in your OpenCV distribution.\n");
return -1;
}
#else
# include "opencv2/core/core.hpp"
# include "opencv2/features2d/features2d.hpp"
# include "opencv2/highgui/highgui.hpp"
# include "opencv2/nonfree/features2d.hpp"
using namespace cv;
void readme();
/**
* @function main
* @brief Main function
*/
int main( int argc, char** argv )
{
if( argc != 3 )
{ readme(); return -1; }
Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );
if ( !img_1.data || !img_2.data )
{ printf(" --(!) Error reading images \n"); return -1; }
//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect( img_1, keypoints_1 );
detector.detect( img_2, keypoints_2 );
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute( img_1, keypoints_1, descriptors_1 );
extractor.compute( img_2, keypoints_2, descriptors_2 );
//-- Step 3: Matching descriptor vectors using FLANN matcher
FlannBasedMatcher matcher;
std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors_1.rows; i++ )
{ double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
printf("-- Max dist : %f \n", max_dist );
printf("-- Min dist : %f \n", min_dist );
//-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist,
//-- or a small arbitary value ( 0.02 ) in the event that min_dist is very
//-- small)
//-- PS.- radiusMatch can also be used here.
std::vector< DMatch > good_matches;
for( int i = 0; i < descriptors_1.rows; i++ )
{ if( matches[i].distance <= max(2*min_dist, 0.02) )
{ good_matches.push_back( matches[i]); }
}
//-- Draw only "good" matches
Mat img_matches;
drawMatches( img_1, keypoints_1, img_2, keypoints_2,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
//-- Show detected matches
imshow( "Good Matches", img_matches );
for( int i = 0; i < (int)good_matches.size(); i++ )
{ printf( "-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }
waitKey(0);
return 0;
}
/**
* @function readme
*/
void readme()
{ printf(" Usage: ./SURF_FlannMatcher <img1> <img2>\n"); }
#endif
結果
-
這是對首張圖片進行特徵檢測的結果
-
下面是對關鍵點進行過濾過程中的控制檯輸出:
相關推薦
OpenCV 使用 FLANN 庫實現特徵匹配
目標 在這篇文章中你將學到: 使用 FlannBasedMatcher 介面來執行快速高效的匹配,用的是 FLANN ( Fast Approximate Nearest Neighbor Search Library ) 演算法 程式碼 完整程式碼可從這裡 下載 /** * @file SURF_F
0052-OpenCV下使用FLANN加速特徵匹配的檢索
當用相關演算法檢測到兩幅圖的特徵點後,我們一般要進行匹配操作,一般的搜尋方法因為資料量大而造成時間的開銷大,這個時候,如果使用FLANN(即Fast Approximate Nearest Neighbor Search Library),會減小不少運算量。相關的原理大家請大家參考相關資料,這裡給出
OpenCv-C++-平面物件識別(接FLANN特徵匹配)
本文接著上篇FLANN特徵匹配,從上篇可以知道,如果特徵匹配時全部是用線進行匹配,那麼真的讓人看著很窩心。那麼,可不可以把匹配到的結果用矩形或圓表示出來呢?當然可以,這就是平面物件識別。是上一章節的更進一步。這裡主要用到兩個新的API: 1、findHomography() ------&g
OpenCv-C++-FLANN特徵匹配演算法
FLANN(快速最近鄰逼近搜尋函式庫),它是一個演算法庫,包含一系列演算法庫,OpenCv中集成了FLANN的一部分匹配演算法,主要對高維資料搜尋比較快。 相比於上一篇的暴力匹配演算法,FLANN更加精確,不會有過多的描述特徵匹配到。 匹配基本步驟: 檢測->提取->計算得到描述
OpenCV中feature2D學習——SIFT和SURF運算元實現特徵點提取與匹配
概述 之前的文章SURF和SIFT運算元實現特徵點檢測簡單地講了利用SIFT和SURF運算元檢測特徵點,在檢測的基礎上可以使用SIFT和SURF運算元對特徵點進行特徵提取並使用匹配函式進行特徵點的匹配。具體實現是首先採用SurfFeatureDetector檢測
OpenCV學習筆記[5]FLANN特徵匹配
OpenCV學習筆記:FLANN特徵匹配 本次給出FLANN特徵匹配的Java實現。 [簡介] 特徵匹配記錄下目標影象與待匹配影象的特徵點(KeyPoint),並根據特徵點集合構造特徵量(descriptor),對這個特徵量進行比較、篩選,
Python中openCV庫實現卡爾曼濾波案例
1.0 什麼是卡爾曼模型 理論推導過於複雜,看個知乎上的解釋吧 假設你有兩個感測器,測的是同一個訊號。可是它們每次的讀數都不太一樣,怎麼辦? 取平均。 再假設你知道其中貴的那個感測器應該準一些,便宜的那個應該差一些。那有比取平均更好的辦法嗎? 加權平均。 怎麼加權?假
OpenCv-C++-KAZE(AKAZE)區域性特徵匹配(二)
上一篇已經做出了KAZE(AKAZE)區域性特徵的檢測,就差匹配沒有做到。 那麼,現在來實現一下: 放上程式碼: #include<opencv2/opencv.hpp> #include<iostream> #include<math.h> u
Python+OpenCV學習(12)---特徵匹配
利用python學習OpenCV,個人感覺比較方便。函式的形式與C++基本相同,所以切換過來還是比較好的,對於像我這種對python不太熟練的人,使用python的整合開發環境PyCharm進行學習,可以設定斷點除錯,有助於我這類初學者理解掌握。 下面是利用python
openCV實現模板匹配
在影象目標識別技術的研究應用中,模板匹配技術是其中一個重要的研究方向,它具有演算法簡單、計算量小以及識別率高的特點。模板匹配的基本原理是通過相關函式的計算來找到它和被搜尋圖的座標位置。比如可以設模板 T ( n×m畫素點)疊放在搜尋圖S上平移,模板覆蓋下的那塊搜
OpenCV中feature2D學習——SURF和SIFT運算元實現特徵點檢測
概述 在opencv的features2d中實現了SIFT和SURF演算法,可以用於影象特徵點的自動檢測。具體實現是採用SurfFeatureDetector/SiftFeatureDetector類的detect函式檢測SURF/SIFT特徵的關鍵點,並儲存
opencv3.2 SURF實現特徵點匹配
opencv3.2中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher這三個的使用方法已經和原先2.4版本前不一樣了。 使用方法示例如下: Ptr<SURF> dete
opencv人臉檢測_Haar特徵分類器實現人臉檢測_cascade.detectMultiScale引數詳解
1. 概述 CascadeClassifier為OpenCV中cv namespace下用來做目標檢測的級聯分類器的一個類。該類中封裝的目標檢測機制,簡而言之是滑動視窗機制+級聯分類器的方式 2. 支援的特徵 對於Haar、LBP和HOG,CascadeClas
特徵匹配之Brute-Force 匹配和FLANN 匹配器
使用 OpenCV 中的蠻力(Brute-Force)匹配和 FLANN 匹配。 1:Brute-Force 匹配的基礎 蠻力匹配器是很簡單的。首先在第一幅影象中選取一個關鍵點然後依次與第二幅影象的每個關鍵點進行(描述符)距離測試,最後返回距離最近的關鍵點。
【Python】使用openCV與dlib實現人臉68特徵點的檢測與手動修改
在使用plib檢測人臉特徵點的過程中由於各種原因難免會遇到特徵點定位不準確的情況。這時,如果能夠手動修改來移動特徵點的位置,後續工作則可以更好地得以完成。 由於openCV的畫圖工具會覆蓋原來的圖片,這裡我通過手動儲存被修改畫素的辦法實現移動定位點而不損害原來
用opencv實現立體匹配
轉自:http://blog.csdn.net/scyscyao/article/details/5443341 嘗試用OpenCV來實現立體視覺也有一段時間了,主要的參考資料就是Learning OpenCV十一、十二章和OpenCV論壇上一些前輩的討論。過程中磕磕碰碰,
SAD立體匹配演算法在opencv中的實現
SAD演算法具體原理見相關影象處理書籍。 該程式是opencv中文論壇的牛人貢獻的,感謝他的工作。 [c-sharp] view plaincopyprint? // Sum of Absolute Difference(SAD) #include <
python實現opencv學習十三:模板匹配
模板匹配:通俗講就是以圖找圖,通過圖中的一部分來找它在圖中的位置通過三種方式來匹配:cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED程式碼如下:# -*- coding=GBK -*- import cv
OpenCV學習筆記__特徵檢測與匹配之 SURF演算法
SURF 演算法 ——“加速版的具有魯棒性的特徵”演算法 步驟: 特徵檢測 —— 特徵描述 —— 特徵匹配 實現流程: (1)特徵檢測:SurfFeatureDetector類 . detec
Opencv Sift和Surf特徵實現影象無縫拼接生成全景影象
Sift和Surf演算法實現兩幅影象拼接的過程是一樣的,主要分為4大部分: 1. 特徵點提取和描述2. 特徵點配對,找到兩幅影象中匹配點的位置3. 通過配對點,生成變換矩陣,並對影象1應用變換矩陣生成對影象2的對映影象4. 影象2拼接到對映影象上,完成拼接 過程1、2