特征提取与匹配、基础矩阵、单应矩阵、极限约束

Ubuntu16.04 + opencv2.4.9

一、特征提取与匹配

(以ORB特征为例)

features.cpp

 1 #include<iostream>
 2 #include<opencv2/core/core.hpp>
 3 #include<opencv2/highgui/highgui.hpp>
 4 #include<opencv2/features2d/features2d.hpp>
 5 #include<opencv2/calib3d/calib3d.hpp>
 6 using namespace cv;
 7 int main(int argc, char* argv[]){
 8
 9 if (argc!=3){
10     std::cout << "usage: feature_extraction imge1 image2" << std::endl;
11     return 1;
12 }
13 //read image
14 Mat image1 =imread(argv[1],CV_LOAD_IMAGE_COLOR);
15 Mat image2 = imread(argv[2],CV_LOAD_IMAGE_COLOR);
16 Mat describtor1, describtor2;
17 vector<KeyPoint> keypoint1,keypoint2;
18 //step2  orb
19 ORB orb;
20 orb(image1,Mat(),keypoint1,describtor1);
21 orb(image2,Mat(),keypoint2,describtor2);
22 Mat outimage1;
23 drawKeypoints(image1,keypoint1,outimage1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);
24 namedWindow("orb特征点",0);
25 cvResizeWindow("orb特征点", 640,480);
26 imshow("orb特征点",outimage1);
27 //step3 match
28 vector<DMatch> matches;
29 BFMatcher matcher(NORM_HAMMING);
30 matcher.match(describtor1,describtor2,matches);
31 //step4 find min dist and max dist of all matches
32 double mindist=1000,maxdist=0;
33 for(int i=0; i<describtor1.rows;i++){
34     double dist =matches[i].distance;
35     if(dist<mindist) mindist = dist;
36     if(dist>maxdist) maxdist = dist;
37
38 }
39 std::cout <<"Max="<<maxdist <<std::endl;
40 std::cout<<"Min=" <<mindist <<std::endl;
41 //5
42 std::vector<DMatch> good_matches;
43 for(int i=0; i<describtor1.rows; i++){
44    if(matches[i].distance <= max(2*mindist,30.0))
45    good_matches.push_back(matches[i]);
46 }
47 //step6 plot results
48 Mat img_match,img_goodmatch;
49 drawMatches(image1,keypoint1,image2,keypoint2,matches,img_match);
50 drawMatches(image1,keypoint1,image2,keypoint2,good_matches,img_goodmatch);
51 namedWindow("所有匹配点",0);
52 namedWindow("优化后匹配点",0);
53 cvResizeWindow("所有匹配点", 1021,376);
54 cvResizeWindow("优化后匹配点", 1021,376);
55 imshow("所有匹配点",img_match);
56 imwrite("img_match.png",img_match);
57 imshow("优化后匹配点",img_goodmatch);
58 imwrite("img_goodmatch.png",img_goodmatch);
59 waitKey(0);
60 return 0;
61 }

结果:

Max=94
Min=21

orb特征点:

所有匹配点:

优化后匹配点:

二、基础矩阵、单应矩阵

(调用opencv函数)

 1 vector<Point2f> points1;
 2 vector<Point2f> points2;
 3 for (int i=0; i<matches.size();i++){
 4     points1.push_back(keypoint1[matches[i].queryIdx].pt);
 5     points2.push_back(keypoint2[matches[i].queryIdx].pt);
 6 }
 7 Mat fundamental_matrix;
 8 fundamental_matrix = findFundamentalMat (points1,points2,CV_FM_8POINT);
 9 std::cout <<"Fundamental_matrix="<< fundamental_matrix<<std::endl;
10
11 Mat homography_matrix ;
12 homography_matrix= findHomography (points1,points2,RANSAC);
13 std::cout << "homography_matrix="<<homography_matrix <<std::endl;

结果:

Fundamental_matrix=[-4.075224349747993e-09, 2.477107638875577e-06, -0.0003483120020484568;
  -5.388675340517034e-08, 3.801248867773318e-05, -0.005352597475279493;
  2.16130923207796e-05, -0.007172831622169928, 1]
Homography_matrix=[-0.2147533899810728, -1.588025524342637, 437.941430304518;
  -0.07845693563076726, -0.580883857003762, 160.1035190035557;
  -0.0004891439919827992, -0.003633821403150171, 1]

三、极线约束

 1 //极线约束
 2 std::vector<Vec<float,3> > epilines1,epilines2;
 3 computeCorrespondEpilines(points1,1,fundamental_matrix,epilines1);
 4 computeCorrespondEpilines(points2,2,fundamental_matrix,epilines2);
 5 RNG rng;
 6 for(uint i=0;i<10;i++){
 7     Scalar color = Scalar(rng(256),rng(256),rng(256));
 8     circle(image2,points2[i],6,color,6);
 9     line(image2,Point(0,-epilines1[i][2]/epilines1[i][1]), Point(image2.cols,-(epilines1[i][2]+epilines1[i][0]*image2.cols)/epilines1[i][1]),color);
10     circle(image1,points1[i],6,color,6);
11     line(image1,Point(0,-epilines2[i][2]/epilines2[i][1]), Point(image1.cols,-(epilines2[i][2]+epilines2[i][0]*image1.cols)/epilines2[i][1]),color);
12 }
13 namedWindow("epilines1",0);
14 resizeWindow("epilines1",640,480);
15 imshow("epilines1",image1);
16 imwrite("epilines1.png",image1);
17 namedWindow("epilines2",0);
18 resizeWindow("epilines2",640,480);
19 imshow("epilines2",image1);
20 imwrite("epilines2.png",image1);
21 waitKey(0);

结果:

原文地址:https://www.cnblogs.com/Yanfang20180701/p/10874153.html

时间: 2024-10-01 00:31:49

特征提取与匹配、基础矩阵、单应矩阵、极限约束的相关文章

SLAM入门之视觉里程计(5):单应矩阵

在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时只是知道通过单应矩阵,能够将图像1中的像素坐标\((u_1,v_1)\)变换到图像2中对应的位置上\((u_2,v_2)\),而没有深究其中的变换关系. 单应(Homography)是射影几何中的概念,又称为射影变换.它把一个射影平面上的点(三维齐次矢量)映射到另一个射影平面上,并且把直线映射为直线

从零开始一起学习SLAM | 神奇的单应矩阵

小白最近在看文献时总是碰到一个奇怪的词叫"homography matrix",查看了翻译,一般都称作"单应矩阵",更迷糊了.正所谓:"每个字都认识,连在一块却不认识"就是小白的内心独白.查了一下书上的推导,总感觉有种"硬凑"的意味,于是又找到了师兄... 神奇的单应矩阵小白:师兄~单应矩阵是什么鬼啊?我看书上的推导,每一步勉强能看懂,但还是不太理解其背后的物理意义,感觉不能转化为自己理解的方式啊师兄:哦,我第一次看的时候也是

(四)单应矩阵

单应矩阵原理 单应(透射变换)是射影几何中的概念,又称为射影变换.他把一个射影平面上的点映射到另一个平面对应的位置,并且把直线映射为直线,具有保线性质.与对极几何不同的是,对极几何将点映射到线上,而单应矩阵是点对点的关系.要注意的是单应矩阵的适用场景为:当场景中的特征点都落在同一平面上,比如墙.地面等,此时可用单应性估计运动. 单应(透射变换)可以看成是仿射变换的拓展.仿射变换在图形中的变换包括:平移.缩放.旋转.斜切及它们的组合形式.这些变换的特点是:平行关系和线段的长度比例保持不变,即保持物

OpenCV,计算两幅图像的单应矩阵

平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 \times 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography).计算出两幅图像之间的单应矩阵H,那么应用这个关系可以将一个视图中的 所有点变换到另一个视图中. 上图,最右边图像是将最左边图像进行了一次射影变换,变换到中间图像视图后的图像. 使用OpenCV可以调用库函数findHomography计算两幅图像的单应矩阵,其声明如下 Mat findHomography(InputArray sr

线性求解单应矩阵 Homography

定义: 2D单应:给定图像$\mathbb{P}^{2}$中的特征点集$\mathbf{x}_i$和另一幅图像在$\mathbb{P}^{2}$ 中对应的特征点集$\mathbf{x}_{i}^{'}$,  将$\mathbf{x}_i$映射到$\mathbf{x}^{'}_{i}$的射影变换.在实际情况中,点$\mathbf{x}_{i}$和$\mathbf{x}^{'}_{i}$是两幅图像上的点,每幅图像都视为一张射影平面$\mathbb{P}^{2}$ $\mathbf{x}^{'}_{i

OpenCV仿射变换+投射变换+单应性矩阵

本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6. warpAffine():对输入图像进行仿射

数论基础——循环节和矩阵快速幂的运用

首先我们来看一道基础题: 题目链接:HDU1005 Number Sequence 题目描述: Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 147421    Accepted Submission(s): 35814 Problem Description A number sequence is

单应性(homography)变换的推导

我们的目标是要得到单应性矩阵 $$ H= \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix}$$ 矩阵$H$会将一幅图像上的一个点的坐标$a=(x,y,1)$映射成另一幅图像上的点的坐标$b=(x_1,y_1,1)$,也就是说,我们已知$a$和$b$,它们是在同一平面上. 则有下面的公式:

转载+整理 - 计算机图形学 - 模型视图矩阵和投影矩阵

出处:http://blog.csdn.net/qb371/article/details/8650094 根据原文,我将其中关于模型视矩阵和投影矩阵的比较重要的知识整理出来再加工一下,如果有什么地方看得不适合明白的话还是去看一下原文吧. 模型矩阵 我们必须考虑,当空间中点的位置会发生变化的时候,其坐标如何变化.考虑三种基本的变换:平移.旋转和缩放. “变换”的含义就是,将点的初始位置的坐标P映射到平移.旋转.缩放后的位置坐标P’,即: 平移变换是最简单的变换: 旋转变换有一些复杂,先看在二维平