• 大小: 60.5MB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-02-01
  • 语言: 其他
  • 标签: SfM三维重  PCL  OpenCV  

资源简介

基于SfM实现视觉稀疏三维点云重建,完整的工程文件,内含所需图片,可直接运行。环境:Win10+VS2015+OpenCV3.4+PLC1.8。

资源截图

代码片段和文件信息

/*
使用两张图片进行三维重建
流程:
1.求相机内外参数
a):2D-2D:可通过提取特征点、计算基本(或本质)矩阵、分解基本(或本质)矩阵得到R、t(K已知)
b):也可通过相机标定的方式,直接获得R、t、K
2.三维重建
a):可通过三角法进行重建
b):也可通过RGB-D相机获得深度z,再求得xy进行重建
注意事项:
1.任意两张图片之间的K略有不同,不影响重建效果但要尽量选择相邻的图片,否则匹配的特征点较少
2.可由本质矩阵E通过SVD分解可得到4个解,只有选择正确的R、T才能完成重建否则归一化的坐标之后无法正常显示;
使用recoverPose则能直接得到正确的R、t
3.在使用triangulatePoints三维重建时,有两种归一化方式
4.由于E本身具有尺度等价性,它分解得到的t具有一个尺度,即在分解过程中,对t乘以任意非零常数,分解都是成立的。因此常把t进行归一化,让其长度等于1。
对t长度的归一化,导致重建的尺度不确定性。因此如何1:1三维重建?
*/
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include 
#include 

#include  
#include 

#include 
#include 
#include 

using namespace std;
using namespace cv;
using namespace pcl;
using namespace cv::xfeatures2d;

// ratio & symmetry test
void ratioTest(vector> &matches vector &goodMatches);
void symmetryTest(const vector& matches1 const vector& matches2 vector& symMatches);

// 从匹配对中提取特征点
void fillPoints(vector goodMatches vector keypoints1 vector keypoints2 vector& points1 vector& points2);

// 三维重建
void reconstruct(Mat& K Mat& fundamentalMatrix vector& points1 vector& points2 vector& points3D);

// 获取关键点RGB
void getPointColor(vector points1 Mat baseImageLeft vector& colors);

int main(int argc char* argv[])
{
// PCL可视化
PointCloud::Ptr cloud(new PointCloud);
boost::shared_ptr viewer(new visualization::PCLVisualizer(“3D viewer“)); // 实例化PCLVisualizer对象,窗口命名为3D viewer

Mat K; // 内参数矩阵
Matx34d P P1;  // 两图片的相机坐标

// 1.读入图片
Mat baseImageLeft = imread(“.\\images\\003.png“ -1);
Mat baseImageRight = imread(“.\\images\\004.png“ -1);
if (baseImageLeft.empty() || baseImageRight.empty())
{
cout << “ERROR! NO IMAGE LOADED!“ << endl;
return -1;
}
cout << “processing...“ << endl;
// 2.SIFT提取特征点
Ptr detector = xfeatures2d::SIFT::create(0 3 0.04 10);

vector keypoints_1 keypoints_2; // 关键点
Mat descriptors_1 descriptors_2;    // 描述符

detector->detectAndCompute(baseImageLeft noArray() keypoints_1 descriptors_1);
detector->detectAndCompute(baseImageRight noArray() keypoints_2 descriptors_2);

// 3.Flann匹配特征点
vector> matches1 matches2;
vector goodMatches1 goodMatches2 goodMatches outMatches;

FlannbasedMatcher matcher;
// 1个descriptors_1[i]对应1个matches[i],1个matches[i]对应2个DMatch(2 nearest)
matcher.knnMatch(descriptors_1 descriptors_2 matches1 2);// find 2 nearest neighbours match.size() = query.rowsize()
matcher.knnMatch(descriptors_2 descriptors_1 matches2 2);

// 4.使用Ratio Test和Symmetry Test消除误匹配点,提高重建精度
ratioTest(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-03-08 22:59  .vs\
     目录           0  2019-03-08 22:59  .vs\SfM\
     目录           0  2019-03-08 22:59  .vs\SfM\v14\
     文件       60416  2019-03-08 21:30  .vs\SfM\v14\.suo
     文件        1291  2019-03-03 14:51  SfM.sln
     文件          36  2019-03-08 21:28  SfM.VC.VC.opendb
     目录           0  2019-03-08 23:00  SfM\
     文件       10310  2019-03-08 22:14  SfM\3DReconstruction_Signle2Images.cpp
     目录           0  2019-03-08 22:59  SfM\images\
     文件     6047052  2018-04-22 08:33  SfM\images\000.png
     文件     6273917  2018-04-22 08:33  SfM\images\001.png
     文件     6382709  2018-04-22 08:33  SfM\images\002.png
     文件     6363282  2018-04-22 08:33  SfM\images\003.png
     文件     6340215  2018-04-22 08:33  SfM\images\004.png
     文件     6365922  2018-04-22 08:33  SfM\images\005.png
     文件     6262661  2018-04-22 08:33  SfM\images\006.png
     文件     6347685  2018-04-22 08:33  SfM\images\007.png
     文件     6481233  2018-04-22 08:33  SfM\images\008.png
     文件     6540372  2018-04-22 08:33  SfM\images\009.png
     文件        7461  2019-03-08 22:14  SfM\SfM.vcxproj
     文件         971  2019-03-08 22:14  SfM\SfM.vcxproj.filters

评论

共有 条评论