當我們學習乙個新的知識的時候,往往我們第一點能夠想到的就是這個東西有什麼用,有沒有實際價值。如果學會了一樣本領,現實生活中卻用不到,這也是一種浪費,浪費的是時間精力。
那麼,特徵檢測在視覺領域有哪些地方可以用到呢?如下:
1、影象匹配;
2、影象拼接;
3、實時跟蹤;
…… 什麼是特徵檢測呢?所謂的特徵檢測直觀一些的講就是,你用手機拍了兩幅,在這兩幅中有重疊的區域,想要找出這兩幅中相似的部分,度量他們是否相似的一些特徵就是我們檢測出來的特徵點。現在我們要讓計算機去找到這些特徵點,會是什麼樣子呢?請看下面的例子。
首先我從**上擷取了兩張,如下:
用肉眼不難發現兩張中的建築是有重疊的部分的,那麼我們來看一下使用opencv檢測出來的重合部分或者說是具有相同特徵的部分是什麼樣子的呢?
上面這幅圖是使用surf特徵匹配演算法實現的特徵匹配效果圖。
如果覺得有意思的朋友們,我們可以接著往下看看,使用c++和opencv是如何實現的。
我將特徵檢測的步驟分成了以下幾個部分。
//步驟一:讀取並將灰度化
//code:
mat src1, src2;
src1 = imread("路徑");
src2 = imread("路徑");
mat graysrc1, graysrc2;
cvtcolor(src1, graysrc1, cv_bgr2gray);
cvtcolor(src2, graysrc2, cv_bgr2gray);
//步驟二:提取特徵並描述
//code:
vector
keys1;
vector
keys2;
ptrdetector = xfeatures2d::surf::create(1500);
mat descriptormat1, descriptormat2;
detector->detectandcompute(src1, mat(), keys1, descriptormat1);
detector->detectandcompute(src2, mat(), keys2, descriptormat2);
//步驟三:特徵點匹配
//code:
cv::bfmatcher matcher;
std::vector
matches;
matcher.match(descriptormat1, descriptormat2, matches);
//步驟四:獲取優秀匹配點
//code:
double max_dist = 0; double min_dist = 100;
for (int i=0; idouble dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}cout
<
<< max_dist
<
<< min_dist
< dmatch > good_matches;
for (int i=0; iif (matches[i].distance < 0.2*max_dist)
}
//步驟五:繪製特徵匹配圖
以上就是整個特徵檢測的實現過程,根據實際專案需求,可以替換為sift,orb,fast等演算法,僅需改動演算法選擇部分即可,其它**博主已經寫成了具有通用型的格式,任何檢測演算法都可以直接使用。
覺得有用的朋友可以幫博主點一波關注呦,謝謝
有問題的朋友可以聯絡博主本人進行問題諮詢,有需要相關資料及開發環境也可以聯絡博主本人獲取。
如有不對的地方請指正,謝謝各位!
opencv 特徵值檢測和匹配
影象的特徵值 影象的特徵值簡單理解就是邊緣,角點,紋理等 角點在影象的邊緣中,有一些特殊的畫素點值得我們特別關注,那就是影象邊緣的角點,角點更好反應影象中物件的整體特徵 harris角點檢測 shi tomasi角點檢測 private void omasicornerdemo mat src,ma...
Opencv之特徵匹配
import cv2 import numpy as np import matplotlib.pyplot as plt matplotlib inline def cv show name,img cv2.imshow name,img cv2.waitkey 0 cv2.destroyallw...
基於C 的opencv(十三)特徵檢測與匹配
特徵點的檢測和匹配是計算機視覺中的重要技術。在物體檢測 視覺跟蹤 三維重建等領域都有很廣泛的應用。opencv中包含以下特徵檢測方法 1.fast fastfeaturedetector 2.star starfeaturedetector 3.sift sift nonfree module 4....