Vector與KeyPoint


 from:  http://www.cnblogs.com/my-idiot-days/archive/2013/05/01/3053831.html

    近來,博主煩惱於問題叢生的特征點提取與匹配算法。更苦於X疼的各種無休止的各種類型數據的存存取取。博主還是個菜鳥,因此此前一直用的是傻氣的一維數組存取,不管是什么圖像的灰度值啊,還是計算出來的每個點的XX值,都用一維數組。結果就是,超麻煩,存取不易且每次都需要求取數組長度!

    今天,博主發現了C++中的vector,真是好用啊!C++有這么個容器博主居然一直不知道。

    參考:http://www.cplusplus.com/reference/vector/vector/

       代碼實例:

    1.首先包含頭文件

#include<vector>

        2.測試代碼

int  i,j;
std::vector <cv::Point> VectorPoints;
for (i=0;i<5;i++)
     for (j=0;j<5;j++)
     {
         cv::Point myPoint = Point(i,j);
         VectorPoints.push_back(myPoint);
     }
 
     for (i=0;i<VectorPoints.size();i++)
         cout<<VectorPoints.at(i)<<endl;

說明:首先定義一個Point(即Point2i---二維整型的點)類型的變量VectorPoints,這就是我們創建的用來存儲Point類型的點的容器啦。<cv::Point>表示容器中所裝的數據的類型,double啊,int啊,各種都可以。之后,博主用二重循環給我們的容器裝數據:定義一個我們要裝的數據的類型的變量(這里叫myPoint),給這個變量賦值,然后調用vector變量的push_back函數(參數即為該類型數據)。我們就把這些數據裝入容器了。

我們可以用cout輸出數據來看看。用at我們可以輕易地訪問容器中的第i個元素(數據)。VectorPoints.at(i)有兩個變量x,y即為我們剛才復制的i,j。VectorPoints.at(i).x和VectorPoints.at(i).y直接可以得到某個Point類型數據的x、y元素。

    為了繪制特征點並將兩幅匹配了的圖像的對應點連起來,博主又嘔心瀝血,才知道原來OpenCV有現成的函數。不過,只在網上搜到了sift、surf算子中使用的,沒有找到明白的單獨討論的文字。不管有是沒有,博主還是簡單寫一寫吧。

代碼是最好的講解,先上代碼:

vector<KeyPoint> keypoint_test;
KeyPoint mykeypoint=KeyPoint(3,3,3,-1,0,0,-1);
keypoint_test.push_back(mykeypoint);
mykeypoint=KeyPoint(7,7,3,-1,0,0,-1);
keypoint_test.push_back(mykeypoint);
mykeypoint=KeyPoint(11,11,3,-1,0,0,-1);
keypoint_test.push_back(mykeypoint);
Mat mat_test=imread( "D:\\test.jpg" );
Mat mat_show;
drawKeypoints(mat_test,keypoint_test,mat_show,Scalar::all(-1),0);
imshow( "show" ,mat_show);

 說明:在OpenCV的繪制特征點和匹配點繪制及連線中,都反復地使用了KeyPoint這種數據類型,因此首先定義一個數據類型為KeyPoint的vector容器,名之keypoint_test。接着,我們給容器裝數據:KeyPoint比之Pont多了些參數,頭兩個參數分別是float型,第三個是繪制點的大小,再后就都是用的默認參數,博主還沒有深究,是對着下邊的features2d.hpp中的東西對着打的(后四個參數:-1,0 ,0,-1)。之后,如法炮制地調用函數push_back,我們就得到了裝載了數據的vector容器keypoint_test。接下來的繪制就簡單了。Mat型變量讀取圖像,再定義一個Mat性變量mat_show用於繪制。最后調用drawKeypoints,參數分別是:原始圖像,待繪制的數據keypoint_test,繪制所用的圖像,任意顏色,ID號(同一幅圖像相同)。這樣簡單幾步就大功告成啦。

參考:

復制代碼
    //! the default constructor
    CV_WRAP KeyPoint() : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {}
    //! the full constructor
    KeyPoint(Point2f _pt, float _size, float _angle=-1,
            float _response=0, int _octave=0, int _class_id=-1)
            : pt(_pt), size(_size), angle(_angle),
            response(_response), octave(_octave), class_id(_class_id) {}
    //! another form of the full constructor
    CV_WRAP KeyPoint(float x, float y, float _size, float _angle=-1,
            float _response=0, int _octave=0, int _class_id=-1)
            : pt(x, y), size(_size), angle(_angle),
            response(_response), octave(_octave), class_id(_class_id) {}
復制代碼

 

復制代碼
// Draw keypoints.
CV_EXPORTS_W void drawKeypoints( const Mat& image, const vector<KeyPoint>& keypoints, CV_OUT Mat& outImage,
                                 const Scalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );

// Draws matches of keypints from two images on output image.
CV_EXPORTS void drawMatches( const Mat& img1, const vector<KeyPoint>& keypoints1,
                             const Mat& img2, const vector<KeyPoint>& keypoints2,
                             const vector<DMatch>& matches1to2, Mat& outImg,
                             const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1),
                             const vector<char>& matchesMask=vector<char>(), int flags=DrawMatchesFlags::DEFAULT );
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM