。本章將**從興趣點提取描述子的各種方法。這些描述子通常是二值型別、整數型或浮點數型組成的一維或二維向量,描述了乙個關鍵點和它的鄰域。好的描述子要具有足夠的獨特性,能唯一地表示影象中的每個關鍵點。它還要有足夠的魯棒性,在照度變化或視角變動時仍能較好地體現同一批點集。理想的描述子還要簡潔,以減少對記憶體的占用、提高計算效率。
本章包括以下內容:
區域性模板匹配;
描述並匹配區域性強度值模式;
用二值描述子匹配關鍵點。
通過特徵點匹配,可以將一幅影象的點集和另一幅影象(或一批影象)的點集關聯起來。如果兩個點集對應著現實世界中的同乙個場景元素,它們就應該是匹配的。
僅憑單個畫素就判斷兩個關鍵點的相似度顯然是不夠的,因此要在匹配過程中考慮每個關鍵點周圍的影象塊。如果兩幅影象塊對應著同乙個場景元素,那麼它們的畫素值應該會比較相似。本節介紹的方案是對影象塊中的畫素進行逐個比較。
這裡使用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...