OpenCv 9 描述和匹配興趣點

2021-10-13 23:53:01 字數 3993 閱讀 5868

。本章將**從興趣點提取描述子的各種方法。這些描述子通常是二值型別、整數型或浮點數型組成的一維或二維向量,描述了乙個關鍵點和它的鄰域。好的描述子要具有足夠的獨特性,能唯一地表示影象中的每個關鍵點。它還要有足夠的魯棒性,在照度變化或視角變動時仍能較好地體現同一批點集。理想的描述子還要簡潔,以減少對記憶體的占用、提高計算效率。

本章包括以下內容:

 區域性模板匹配;

 描述並匹配區域性強度值模式;

 用二值描述子匹配關鍵點。

通過特徵點匹配,可以將一幅影象的點集和另一幅影象(或一批影象)的點集關聯起來。如果兩個點集對應著現實世界中的同乙個場景元素,它們就應該是匹配的。

僅憑單個畫素就判斷兩個關鍵點的相似度顯然是不夠的,因此要在匹配過程中考慮每個關鍵點周圍的影象塊。如果兩幅影象塊對應著同乙個場景元素,那麼它們的畫素值應該會比較相似。本節介紹的方案是對影象塊中的畫素進行逐個比較。

這裡使用fast 檢測器:

// 定義特徵檢測器

cv::ptr<:featuredetector> ptrdetector;

// 泛型檢測器指標

ptrdetector=

// 這裡選用fast 檢測器

cv::fastfeaturedetector::

create(80

);// 檢測關鍵點

ptrdetector-

>

detect

(image1,keypoints1)

;ptrdetector-

>

detect

(image2,keypoints2)

;// 定義正方形的鄰域

const

intnsize(11

);// 鄰域的尺寸

cv::rect neighborhood(0

,0, nsize, nsize)

;// 11×11

cv::mat patch1;

cv::mat patch2;

// 在第二幅影象中找出與第一幅影象中的每個關鍵點最匹配的

cv::mat result;

std::vector<:dmatch> matches;

// 針對影象一的全部關鍵點

for(

int i=

0; i

size()

; i++)}

// 新增最佳匹配

matches.

push_back

(bestmatch);}

// 提取25 個最佳匹配項

std::

nth_element

(matches.

begin()

,matches.

begin()

+25,matches.

end())

;matches.

erase

(matches.

begin()

+25,matches.

end())

;// 畫出匹配結果

cv::mat matchimage;

cv::

drawmatches

(image1,keypoints1,

// 第一幅影象

image2,keypoints2,

// 第二幅影象

matches,

// 匹配項的向量

cv::

scalar

(255

,255

,255),

// 線條顏色

cv::

scalar

(255

,255

,255))

;// 點的顏色

本節將介紹如何用特徵描述子來描述興趣點的鄰域。在影象分析中,可以用鄰域包含的視覺資訊來標識每個特徵點,以便區分各個特徵點。特徵描述子通常是乙個n 維的向量,在光照變化和拍攝角度發生微小扭曲時,它描述特徵點的方式不會發生變化。通常可以用簡單的差值矩陣來比較描述子,例如用歐幾里得距離。綜上所述,特徵描述子是一種非常強大的工具,能進行目標的匹配。

可以用cv::surf 的例項檢測並描述兩幅影象的特徵點:

// 定義關鍵點的容器

std::vector<:keypoint> keypoints1;

std::vector<:keypoint> keypoints2;

// 定義特徵檢測器

cv::ptr<:feature2d> ptrfeature2d =

cv::xfeatures2d::surf::

create

(2000.0);

// 檢測關鍵點

ptrfeature2d-

>

detect

(image1,keypoints1)

;ptrfeature2d-

>

detect

(image2,keypoints2)

;// 提取描述子

cv::mat descriptors1;

cv::mat descriptors2;

ptrfeature2d-

>

compute

(image1,keypoints1,descriptors1)

;ptrfeature2d-

>

compute

(image2,keypoints2,descriptors2)

;

對於sift,呼叫cv::sift::create 函式即可。

使用cv::drawmatches類得到如下的影象。

對sift 採用同樣數量的關鍵點,得到匹配結果如下所示。

為了減少記憶體使用、降低計算量,人們引入了將一組位元位(0 和1)組合成二值描述子的概念。這裡的難點在於,既要易於計算,又要在場景和視角變化時保持魯棒性。本節將介紹其中的幾種二值描述子,重點講解orb 和brisk 描述子,第8 章介紹了與它們相關的特徵點檢測器。

// 定義關鍵點容器和描述子

std::vector<:keypoint> keypoints1;

std::vector<:keypoint> keypoints2;

cv::mat descriptors1;

cv::mat descriptors2;

// 定義特徵檢測器/描述子

// construct the orb feature object

cv::ptr<:feature2d> feature = cv::orb::

create(60

);// 大約60 個特徵點

// 檢測並描述關鍵點

// 檢測orb 特徵

feature-

>

detectandcompute

(image1, cv::

noarray()

,keypoints1, descriptors1)

;feature-

>

detectandcompute

(image2, cv::

noarray()

,keypoints2, descriptors2)

;// 構建匹配器

cv::bfmatcher matcher

(cv::norm_hamming)

;// 二值描述子一律使用hamming 規範

// 匹配兩幅影象的描述子

std::vector<:dmatch> matches;

matcher.

match

(descriptors1, descriptors2, matches)

;

opencv 9 輪廓 性質

邊界矩形的寬高比 x,y,w,h cv2.boundingrect cnt aspect ratio float w h輪廓面積與邊界矩形面積的比 area cv2.contourarea cnt x,y,w,h cv2.boundingrect cnt rect area w h extent f...

OpenCV9 膨脹與腐蝕操作

九 膨脹與腐蝕 1 形態學操作 2 形態學操作 膨脹 空白區域變大了,暗色部分變小了 dilate src,dst,kernel src為待處理影象,dst為處理後影象,kernel為獲得的結構元素 後面會說到 將結構元素kernel覆蓋下的所有畫素的最大值賦給錨點 3 形態學操作 腐蝕 黑色區域變...

Opencv學習筆記 9 模板匹配

opencv中提供了六種常見的匹配演算法如下 計算平方不同 計算相關性 計算相關係數 計算歸一化平方不同 計算歸一化相關性 計算歸一化相關係數 api中相關匹配方法的巨集定義名 源影象,必須是8 bit或者32 bit浮點數影象 inputarray templ,模板影象,型別與輸入影象一致 out...