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 );