资源简介
基于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
- 上一篇:小米解锁,BL,刷机,软件ROM
- 下一篇:黑客防线2013年第1到12期全集合
相关资源
- 基于opencv的数人头程序源代码
- 全面的点云库PCL学习教程
- 利用OpenCV中的Stitcher类实现全景图像拼
- CPCL查看器.rar
- opencv实现的sift算法源码,包含了图像
- openCV 上的小波变换
- 基于OPENCV的车牌识别系统设计
- 617张国内车牌60-17bmp图片用于OpenCV正样
- hog特征提取,c版本代码
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
- Linux ntpclient代码
- 基于Opencv实现的图像纠偏
- 点云库PCL学习教程 完整版
- ImageWatch2019.vsix
- SIFT特征提取+匹配
- 基于SIFT算法的图像拼接.rar
- opencv4.1.1+contrib完整版.zip
- OpenCV3.3+contrib-master,VS2013编译后的l
- OpenCV2.4.10官方完整版
- 基于OpenCV3.0的手势识别.rar
- 基于opencv的车牌识别源码
- Firmware_F103 V1.3.rar
- VS2017+opencv写的火焰检测带检测视频哦
- opencv图像处理方法总结.pdf
- 中英文PCL5语言参考手册_11086676.zip
- bumblebee双目标定/伪彩色深度图/鼠标测
- OpenCV中对图片进行灰度处理
- 车牌识别系统原创+详细注释版+少函数
- 张正友相机标定自己编写calibratie函数
- Ubuntu16.04中配置Qt5.9.1和OpenCV3.4.0过程
评论
共有 条评论