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 );
复制代码
原文地址:https://www.cnblogs.com/zengcv/p/5582196.html