三角测量,用Opencv计算获得两图片匹配点的深度

  1. 函数cv::triangulatePoints(T1, T2, points1, points2, points_4d);输入:T1: 3*4的cv::Mat ,就是第一张图片的 R和t组合一起的T2: 3*4的cv::Mat ,就是第二张图片的 R和t组合一起的points1: vector 前一张图片的匹配点points2: vector 后一张图片的匹配点,肯定和上一个size()一样输出:points_3d: cv::Mat类型会输出4行,points1.size()列的Mat,一列代表一个点,把每一列的点都除以第4行的数,就是归一化的三维坐标了
  2. 例子
    先特征匹配,获得前后两张图片匹配的特征点对,并计算的到旋转矩阵R,和平移向量t,此部分内容可以参考上篇博客//根据两张图片的匹配点,计算三维点的函数void triangulation(vector& keypoints1, vector& keypoints2, vector& matches, cv::Mat& R, cv::Mat& t, vector& points3D, cv::Mat& image1, cv::Mat& image2){ cv::Mat T1 = (cv::Mat_(3,4)<<1,0,0,0, //这里以第一张图片为世界坐标系 0,1,0,0, 0,0,1,0); R.convertTo(R,CV_64FC1); //R, t已经算得,可以参考之前篇内容,根据匹配点计算R, t t.convertTo(t,CV_64FC1); cv::Mat T2 = (cv::Mat_(3,4)<< //第二张图片的位姿,[R,t] R.at(0,0),R.at(0,1),R.at(0,2),t.at(0,0), R.at(1, 0), R.at(1, 1), R.at(1, 2), t.at(1, 0), R.at(2, 0), R.at(2, 1), R.at(2, 2), t.at(2, 0)); cv::Mat K = (cv::Mat_(3,3)<<520.9,0,325.1,0,521.0,249.7,0,0,1); //相机内参矩阵 vector pt1, pt2; //匹配点的归一化坐标 x1, x2 for(cv::DMatch m:matches) { cv::Point2f p1 = keypoints1[m.queryIdx].pt; //匹配点的像素坐标 cv::Point2f p2 = keypoints2[m.trainIdx].pt; pt1.push_back(cv::Point2f((p1.x-K.at(0,2))/K.at(0,0),(p1.y-K.at(1,2))/K.at(1,1))); //归一化坐标 pt2.push_back(cv::Point2f((p2.x-K.at(0,2))/K.at(0,0),(p2.y-K.at(1,2))/K.at(1,1))); } cv::Mat pts_4d; //保存计算得到的三维点结果 //!!!!!!!!!!!!!!!!!!!!!!!OpenCV自带函数 cv::triangulatePoints(T1,T2,pt1,pt2,pts_4d); //pst_4d 是4行的,每一列表示一个点 cout<<“**********************”<(3,0); cv::Point3f p(x.at(0,0),x.at(1,0),x.at(2,0)); //归一化的三维点 points3D.push_back(p); } cv::Mat img1 = image1.clone(); cv::Mat img2 = image2.clone(); for(int i=0; i

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年4月4日 下午1:03
下一篇 2022年4月4日 下午1:12

相关推荐