博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vector与KeyPoint
阅读量:6735 次
发布时间:2019-06-25

本文共 3466 字,大约阅读时间需要 11 分钟。

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

    近来,博主烦恼于问题丛生的特征点提取与匹配算法。更苦于X疼的各种无休止的各种类型数据的存存取取。博主还是个菜鸟,因此此前一直用的是傻气的一维数组存取,不管是什么图像的灰度值啊,还是计算出来的每个点的XX值,都用一维数组。结果就是,超麻烦,存取不易且每次都需要求取数组长度!

    今天,博主发现了C++中的vector,真是好用啊!C++有这么个容器博主居然一直不知道。

    参考:

       代码实例:

    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
& 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
& keypoints1, const Mat& img2, const vector
& keypoints2, const vector
& matches1to2, Mat& outImg, const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), const vector
& matchesMask=vector
(), int flags=DrawMatchesFlags::DEFAULT );

 

转载于:https://www.cnblogs.com/zengcv/p/5582196.html

你可能感兴趣的文章
软件工程随笔(1)--jetbrain在软件工程中的应用
查看>>
matlab 以cell的形式读取excel---保留原excel 里面的字符
查看>>
python 经典排序方法(冒泡排序,快速排序,二分法查找)
查看>>
树莓派与Linux系统之间文件传输
查看>>
CacheHelper
查看>>
今天开始了objective-c的学习!
查看>>
莫人云亦云,莫走弯路!正确认识ExtJs4
查看>>
xss如何加载远程js的一些tips
查看>>
《机器学习实战》支持向量机(手稿+代码)
查看>>
修改VS自带的模版文件
查看>>
hdu2874 LCA
查看>>
fedora中丢失或损坏fstab,无法启动,如何补救
查看>>
JAVA基本算法面试题:1斐波纳契数列
查看>>
GPU Memory Usage占满而GPU-Util却为0的调试
查看>>
iOS开发-UITapGestureRecognizer手势
查看>>
Java中的Lambda表达式
查看>>
Android中数据存储之SharedPreferences
查看>>
查询oracle中所有用户信息
查看>>
PHP数字价格格式化,保留两位小数
查看>>
MVC3.0入门学习笔记--Razor 之样式加载方式1
查看>>