1. 程式人生 > >【圖片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu

【圖片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu

文件 read 等待 s2d imread mage clas create detect

  最近在搗鼓圖片相似性匹配算法。這裏先說一點必要的題外話:

如果是在同一個object不同角度拍攝的多張圖片中,使用SIFT可以有不錯的效果;

如果是尋找類別相同的圖片(可能不是同一object),SIFT是無效的。

前言:

  1 需要安裝好opencv3.1.0 + opencv_contrib(放到 opencv主文件夾的module文件夾中)。

  2 可以使用IDE 比如:Codeblocks or Eclipse etc 配置好opencv開發所需要的 頭文件 + lib so 庫文件。

  但是我這裏是直接手寫的 g++ 編譯命令,這樣省事兒,可以方便展示。這裏不得不吐槽一下,網上一大堆 搓逼教程,亂配置一氣,有用的沒用的全抄上,而且3.1.0中的imshow等基礎的函數都已經換了頭文件了。並不在highgui中了。所以我就自己手寫了 編譯命令,用什麽加什麽。

代碼如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>  //頭文件
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;  //包含cv命名空間
using namespace std;

int main()
{
    
//Create SIFT class pointer Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); //讀入圖片 Mat img_1 = imread("kebe1.jpg"); Mat img_2 = imread("kebe2.jpg"); //Detect the keypoints vector<KeyPoint> keypoints_1, keypoints_2; f2d->detect(img_1, keypoints_1); f2d->detect(img_2, keypoints_2);
//Calculate descriptors (feature vectors) Mat descriptors_1, descriptors_2; f2d->compute(img_1, keypoints_1, descriptors_1); f2d->compute(img_2, keypoints_2, descriptors_2); //Matching descriptor vector using BFMatcher BFMatcher matcher; vector<DMatch> matches; matcher.match(descriptors_1, descriptors_2, matches); //繪制匹配出的關鍵點lopencv_core Mat img_matches; drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches); imshow("【match圖】", img_matches); //等待任意按鍵按下 waitKey(0); } //g++ sift_match.cpp -o output -L/usr/local/lib -lopencv_imgcodecs -lopencv_highgui -lopencv_xfeatures2d -lopencv_features2d -lopencv_core -I/usr/local/include

  文件夾下有兩張圖片,使用最下面註釋的 編譯命令直接運行

./output 即可。

技術分享

  發現這也不咋準啊! 當然我使用的不是同一張皂片的不同角度,只是覺得差不多。

  下一步,打算校準 + 具體實現使用SIFT來衡量圖片的相似度。

  

【圖片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu