當進行跟蹤時或者其他型別的用到關鍵點及其描述符的分析時,通常需要做三件事情:第乙個是根據一些關鍵點的定義搜尋影象並查詢該影象中的所有關鍵點;第二個是為發現的每個關鍵字建立乙個描述符;第三個是通過將所找到的關鍵點的描述符與一些現有的描述符集進行比較,看看是否可以找到匹配項。
在跟蹤應用程式中,最後一步涉及查詢序列的一幀影象中的特徵,並嘗試將其與前一幀中的特徵進行匹配。在目標檢測應用程式中,人們通常會在一些(潛在的廣泛)資料庫中搜尋「已知」特徵的「已知」與各個目標或目標類相關聯的特徵。
對於這些層中的每乙個,opencv提供了乙個遵循「做東西的類」(函子)模型的泛化機制;對於這些階段中的每乙個都有乙個抽象基類,它為從其派生的一系列物件定義乙個公共介面;最後每個派生類都實現乙個特定的演算法。
1、cv :: keypoint物件
classcv:
:keypoint ;
3種過載都包括了cv :: point2f的資訊,此外還包括其他一些能夠說明「特徵」的屬性。
2、cv :: feature2d
classcv::
feature2d
:publiccv::
algorithm ;
複雜的定義,注意feature2d派生自alogorithm演算法類。
a、如果它是乙個單純的關鍵點檢測演算法(如fast),實際的實現可能只是執行cv :: feature2d :: detect(),;
b、如果它是乙個純特徵描述演算法(如freak),實際的實現可能只是cv :: feature2d :: compute();
c、在要求「完全解決」的演算法的情況下,如sift,surf,orb,brisk等,實際的實現就會是cv :: feature2d :: detectandcompute(),在這種情況下,detect()和compute()會被隱式地呼叫。
對於具體每一種演算法,查詢關鍵點的實際方法當然對於cv :: feature2d的許多可用派生類中的每乙個都是不同的。
值得注意的是,根據演算法何時實現,許多關鍵點特徵檢測器和提取器都設計在一起成為乙個物件。在這種情況下,方法cv::feature2d::detectandcompute() 被實現。每當某個演算法提供了detectandcompute()時,強烈建議直接使用它,而不是在後續呼叫detect(),然後再使用compute()。原因很明顯,就是效能更好。
3、cv :: dmatch
尋找到的特徵結果需要進行匹配,以方便下一步的計算。
classcv:
:dmatch
cv :: dmatch的資料成員是queryidx,trainidx,imgidx和distance。前兩個辨別與每個影象中的關鍵點列表匹配的關鍵點。 imgidx用於辨別在影象和字典之間尋求匹配的情況下訓練影象來自的特定影象。最後乙個成員,distance,用來表示匹配的質量。
4、cv :: descriptormatcher(關鍵點匹配類)
一般有兩種不同的情況:對於目標識別的情況,我們需要首先用描述符的字典訓練匹配器,然後才能向匹配器呈現單個描述符列表,並告訴我們匹配器儲存的哪個(如果有的話)關鍵點是與我們提供的列表中的那些相匹配;對於跟蹤的情形,我們需要提供兩個描述符列表,然後匹配器告訴我們它們之間的匹配位置。
cv:descriptormatcher類介面提供了三個函式match(),knnmatch()和 radiusmatch();對於每個函式,有兩個不同的變形 - 乙個用於識別(需要乙個特徵列表並使用經過訓練的字典),另乙個用於跟蹤(需要兩個特徵列表)。
部分定義:
class
cv::
descriptormatcher ;
簡單比較,match()方法需要通常的cv :: mat格式的單個關鍵點描述符列表querydescriptors。在這種情況下,請記住每行代表單個描述符,每列是該描述符向量表示的乙個維度。
knnmatch() 函式,它需要與match() 相同的列表描述符。然而,在這種情況下,對於查詢列表中的每個描述符,它將從字典中找到特定數量的最佳匹配。
第三種匹配方法是radiusmatch()。 與搜尋k個最佳匹配的k-最近鄰匹配不同,半徑匹配返回了查詢描述符特定距離內的所有匹配。
5、序列化
read()和write()方法分別對應cv :: filenode和cv :: filestorage格式的物件,並允許你從磁碟讀取和寫入匹配器;
clone() 和create() 方法允許你分別建立乙個描述符的副本或者通過名稱建立乙個新的描述符;
感謝閱讀至此,希望有所幫助。
來自為知筆記(wiz)
常見的資料結構及其特徵
array 陣列 特性 使用連續的記憶體來儲存,陣列中的所有元素必須是相同的型別或型別的衍生 同質資料結構 元素可以通過下標直接訪問。queue 佇列。特性 先進先出,併發中使用,可以安全地將物件從乙個任務傳給另乙個任務。set 集合。特性 儲存不重複的元素。stack 棧,和佇列相似,乙個帶有資料...
資料結構和演算法基礎
最近在學習王爭老師的資料結構和演算法之美課程,課程的很多知識之前並未了解。在此做簡單記錄。廣義上,資料結構是一組資料的儲存結構,演算法是操作這組資料的方法。狹義上,是指某些著名的資料結構和演算法,比如堆 棧 佇列 二分查詢等。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特定...
基礎知識點總結 資料結構
準備筆面試期間做了一些基本知識點的總結,分享一下 1 邏輯結構 物理結構。2 演算法5大特性。4 順序 鏈式儲存。鍊錶 棧和佇列 串 1 鍊錶的操作 增刪改查 2 靜態 迴圈 雙向鍊錶。3 棧的操作及儲存方式。4 遞迴 斐波那契數列。5 棧的中 字尾。6 佇列的操作及儲存方式。7 迴圈佇列空 滿判斷...