在opencv中使用sift特徵提取運算元進行特徵提取是跟簡單的事情了,通過呼叫api也就下面幾行**的事情
cv::siftfeaturedetector detector;
std::vector
keypoint;
detector.detect(image, keypoint); //image是需要進行特徵提取的影象
std::cout
<< "\ndetected sift feature point size: "
<< keypoint.size() << "\n";
//獲得每個特徵點的128維特徵向量
cv::siftdescriptorextractor extractor;
cv::mat des1; //descriptor
extractor.compute(image, keypoint, des1);
但是在進行諸如匹配的時候由於提取出來的sift特徵樣本的數目是不同的,這就需要進行對映抽取,這就講到了今天說到的bow特徵,抽取到bow特徵之後可以簡單得進行歐式距離的比較,或是放入後面的分類器進行訓練。
bow模型的處理過程:
1. sift特徵提取。sift 特徵提取是求出影象的關鍵點資訊,包括角度,大小以及強度。關鍵點,也就是能夠代表影象關鍵資訊的部分,這也是bag of words中單詞的組成。乙個影象通常有很多的關鍵點。
2. 聚類。我們將每幅影象中的關鍵點資訊新增到詞袋中,並定義聚類中心的數量n。然後將詞袋中的關鍵點通過kmeans演算法聚類到n個類中。同時得到這n個類的中心點組成n*128的dictionary,每個中心都可以代表這個類。
3. 求影象的直方圖。將影象的關鍵點資訊重新放到詞包中,根據落在每個類中關鍵點的數量來得到影象的直方圖,大小為1*n。將每幅影象進行處理,得到影象在bow模型下的特徵。
4. 影象匹配。將測試影象進行相同的處理,同樣也得到1*n的特徵。根據測試影象與訓練影象特徵之間的距離,並將距離較小的影象作為檢索的結果。
在生成bow特徵過程中主要涉及到特徵聚類和產生bow特徵描述(歸一化直方圖)。
首先來看聚類,聚類使用到的是bowkmeanstrainer這個類,
class bowkmeanstrainer : public bowtrainer
// returns trained vocabulary (i.e. cluster centers).
virtual mat cluster() const;
virtual mat cluster( const mat& descriptors ) const;
protected:
...};
這裡主要使用的是它的建構函式,呼叫的時候定好需要分出的類數目,其它的引數預設就好。第二個是成員函式cluster(const mat& descriptors)。
之後是生成bow特徵,使用到的類是bowimgdescriptorextractor,基於視覺詞典包演算法來計算乙個影象的特徵描述子的類。演算法步驟如下:
1. 給定一幅影象及其影象特徵檢測子(關鍵點)集,計算特徵描述子。
2. 給定每乙個影象特徵檢測子對應的特徵描述子,從視覺詞典中尋找最近的詞。
3. 計算視覺詞典包影象特徵描述子.該結果為乙個歸一化後的直方圖.直方圖向量中第i
個 值是視覺詞典中的第i
個詞在給定影象中的頻率。
該類的介面定義為:
class bowimgdescriptorextractor
void setvocabulary( const mat& vocabulary );
const mat& getvocabulary() const;
void compute( const mat& image, vector
& keypoints,
mat& imgdescriptor,
vector
>* pointidxsofclusters=0,
mat* descriptors=0 );
int descriptorsize() const;
int descriptortype() const;
protected:
...};
這裡主要呼叫compute成員函式
cv::initmodule_nonfree();
cv::bowkmeanstrainer bowtraining(feature_num); //定義乙個物件,生成聚類中心cluster_num(聚類的數目)個,其餘的預設引數
cv::mat dictionary = bowtraining.cluster(feature_discriptor); //按照設定好的聚類數目進行聚類,生成字典集,也就是聚類中心 ,feature_discriptor是sift生成的特徵描述
//聚類中心的對映初始化
cv::ptr
> extractor = cv::descriptorextractor
::create("sift"); //引號裡面修改特徵種類。
cv::ptr
> matcher = cv::descriptormatcher
::create("bruteforce"); //引號裡面修改匹配型別;
cv::bowimgdescriptorextractor bowde(extractor, matcher); //直方圖統計
bowde.setvocabulary(dictionary); //dictionary是通過前面聚類得到的詞典
std::vector
> keypoints;
cv::siftfeaturedetector detector;
cv::mat descriptors;
detector.detect(img, keypoints); //sift提取影象的特徵點
bowde.compute(img, keypoints, descriptors); //提取該影象的bow特徵描述
opencv 中關於bow模型的實現以及相關的函式解釋
物體目標分類
學習opencv——bow特徵提取函式(特徵點篇)
基於深度學習的Person Re ID(特徵提取)
一.cnn特徵提取 這一篇我們講的就是基於 cnn的特徵提取,特徵提取過程也就是訓練過程,訓練結果就是 cnn 的引數。以 triplet function 為例,對於 乙個輸入影象三元組 trip,通過乙個共享引數的網路進行訓練,通過下圖可以看到,三個影象 分別得到了乙個特徵空間,這個特徵空間只要...
OpenCV 基於HOG特徵的行人檢測
opencv中提供了hog的行人檢測 pedestrain detection 類。cv hogdescriptor類的建構函式的各引數的定義 cpp view plain copy cv wrap hogdescriptor winsize 64,128 detect window blocksi...
基於C 的opencv(十三)特徵檢測與匹配
特徵點的檢測和匹配是計算機視覺中的重要技術。在物體檢測 視覺跟蹤 三維重建等領域都有很廣泛的應用。opencv中包含以下特徵檢測方法 1.fast fastfeaturedetector 2.star starfeaturedetector 3.sift sift nonfree module 4....