• 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 );
    复制代码
  • 相关阅读:
    eclipse导入基于maven的java项目后没有Java标志和没有maven Dependencies有解决办法
    centOS6.5 安装后无法启动无线上网
    centOS6.5 关闭关盖待机
    centOS6.5 usr/src/kernels下为空
    python求两个列表的并集.交集.差集
    二叉树遍历
    python实现单链表的反转
    关系型数据库和非关系型数据库的区别和特点
    python 实现快速排序(面试经常问到)
    golang 切片和map查询比较
  • 原文地址:https://www.cnblogs.com/zengcv/p/5582196.html
Copyright © 2020-2023  润新知