opencv在新版本中把很多c語言的**都重新整理成了c++**,讓我們在使用的時候更加方便靈活。其中對於特徵點的提取和匹配,充分體現了c++的強大。下面直接用例子來說明。假設我們有兩幅圖:1.bmp和2.bmp,要從中提取體徵點並匹配,**如下:
// load image from file
iplimage *pleftimage = cvloadimage("1.bmp", cv_load_image_grayscale);
iplimage *prightimage = cvloadimage("2.bmp", cv_load_image_grayscale);
// convert iplimage to cv::mat
mat matleftimage = mat(pleftimage, false); // do not copy
mat matrightimage = mat(prightimage, false);
// key point and its descriptor
vectorleftkey;
vectorrightkey;
mat leftdescriptor;
mat rightdescriptor;
vectormatches;
// detect key points from image
featuredetector *pdetector = new surffeaturedetector; // 這裡我們用了surf特徵點
pdetector->detect(matleftimage, leftkey);
pdetector->detect(matrightimage, rightkey);
delete pdetector;
// extract descriptors
descriptorextractor *pextractor = new surfdescriptorextractor; // 提取surf描述向量
pextractor->compute(matleftimage, leftkey, leftdescriptor);
pextractor->compute(matrightimage, rightkey, rightdescriptor);
delete pextractor;
// matching features
descriptormatcher *pmatcher = new flannbasedmatcher; // 使用flann匹配演算法
pmatcher->match(leftdescriptor, rightdescriptor, matches);
delete pmatcher;
// show result
mat outimage;
drawmatches(matleftimage, leftkey, matrightimage, rightkey, matches, outimage);
cvnamedwindow( "match features", 1);
cvshowimage("match features", &(iplimage(outimage)));
cvwaitkey( 0 );
cvdestroywindow( "match features" );
從上面的**可以看見,用opencv來做特徵提取匹配相當簡便,出去讀圖和顯示結果的**,真正核心的部分只有3段**,分別是檢測關鍵點,提取描述向量和特徵匹配,一共只有11行**。
在我的示例**中,使用的是surf特徵,而在opencv中,實現了很多種特徵,如sift,fast等,這些特徵的實現各不相同,但是都是從乙個公共抽象基類派生出來的,因此可以用多型方便地切換特徵提取演算法。下面我將詳細地說明。
1 featuredetector
featuredetector是關鍵點檢測類的抽象基類,其已經實現的具體類有:
class fastfeaturedetector
class goodfeaturestotrackdetector
class mserfeaturedetector
class starfeaturedetector
class siftfeaturedetector
class surffeaturedetector
要使用某一種檢測器,可以直接呼叫featuredetector的工廠來建立,該工廠是乙個靜態方法,如下:
// create feature detector by detector name.
static ptrcreate( const string& detectortype );
也可以像我的示例**中那樣顯式的建立,如下:
featuredetector *pdetector = new surffeaturedetector;
可以用swich實現在多種方法中切換。
2 descriptorextractor
descriptorextractor是提取關鍵點的描述向量類抽象基類,其具體類有:
class siftdescriptorextractor
class surfdescriptorextractor
class calonderdescriptorextractor
class briefdescriptorextractor
class opponentcolordescriptorextractor
要使用某一種描述向量,可以呼叫descriptorextractor的工廠來建立,靜態方法如下:
static ptrcreate( const string& descriptorextractortype );
也可以像我的示例**中那樣顯式的建立,如下:
descriptorextractor *pextractor = new surfdescriptorextractor;
可以用swich實現在多種方法中切換。
3 descriptormatcher
descriptormatcher是匹配器的抽象基類,其具體類有:
class bruteforcematcher
class flannbasedmatcher
匹配器可以由靜態工廠方法直接建立,如下:
static ptrcreate( const string& descriptormatchertype );
也可以像我的示例**中那樣顯式的建立,如下:
descriptormatcher *pmatcher = new flannbasedmatcher;
可以用swich實現在多種方法中切換。
多型的使用,可以讓我們對不同的特徵採用相同的**來程式設計,這是opencv設計的一種策略模式,大大地簡化了**量,並增加了靈活性,讓我們可以在多種特徵提取和匹配方法之間自由切換。
特徵點提取opencv
opencv中提供了harris角點檢測的介面,即cv cornerharris 缺陷 角點是畫素級別的,速度較慢 dst cv2.cornerharris gray,2,3,0.04 img 資料型別為 float32 的輸入影象 blocksize 角點檢測中要考慮的領域大小 ksize sob...
opencv 特徵提取以及特徵匹配
用到的庫檔案 include include using namespace std opencv 特徵檢測模組 include include include 提取影象中的特徵 關鍵點 與 關鍵點的描述子,分別用到了opencv庫中的cv featuredetector和cv descriptor...
OpenCV2 3 1特徵點提取
今天做特徵點匹配實驗,從網上找來了surf特徵點檢測程式,除錯也調通了,但是執行之後就是沒有結果出來,還會出現執行之後程式崩潰的問題,後來試了好多遍,發現是由於lib檔案有問題,雖然在屬性裡已經新增了,但是仍然鏈結不上。解決方法是在程式開始新增lib檔案,如下所示。include opencv2 o...