资源简介

使用OpenCV3.0进行双目三维重建。 代码是用VS2013写的,OpenCV版本为3.0且包含扩展部分,如果不使用SIFT特征,可以修改源代码,然后使用官方未包含扩展部分的库。软件运行后会将三维重建的结果写入Viewer目录下的structure.yml文件中,在Viewer目录下有一个SfMViewer程序,直接运行即可读取yml文件并显示三维结构。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 

using namespace cv;
using namespace std;

void extract_features(
vector& image_names
vector>& key_points_for_all
vector& descriptor_for_all
vector>& colors_for_all

{
key_points_for_all.clear();
descriptor_for_all.clear();
Mat image;

//读取图像,获取图像特征点,并保存
Ptr sift = xfeatures2d::SIFT::create(0 3 0.04 10);
for (auto it = image_names.begin(); it != image_names.end(); ++it)
{
image = imread(*it);
if (image.empty()) continue;

vector key_points;
Mat descriptor;
//偶尔出现内存分配失败的错误
sift->detectAndCompute(image noArray() key_points descriptor);

//特征点过少,则排除该图像
if (key_points.size() <= 10) continue;

key_points_for_all.push_back(key_points);
descriptor_for_all.push_back(descriptor);

vector colors(key_points.size());
for (int i = 0; i < key_points.size(); ++i)
{
Point2f& p = key_points[i].pt;
colors[i] = image.at(p.y p.x);
}
colors_for_all.push_back(colors);
}
}

void match_features(Mat& query Mat& train vector& matches)
{
vector> knn_matches;
BFMatcher matcher(NORM_L2);
matcher.knnMatch(query train knn_matches 2);

//获取满足Ratio Test的最小匹配的距离
float min_dist = FLT_MAX;
for (int r = 0; r < knn_matches.size(); ++r)
{
//Ratio Test
if (knn_matches[r][0].distance > 0.6*knn_matches[r][1].distance)
continue;

float dist = knn_matches[r][0].distance;
if (dist < min_dist) min_dist = dist;
}

matches.clear();
for (size_t r = 0; r < knn_matches.size(); ++r)
{
//排除不满足Ratio Test的点和匹配距离过大的点
if (
knn_matches[r][0].distance > 0.6*knn_matches[r][1].distance ||
knn_matches[r][0].distance > 5 * max(min_dist 10.0f)

continue;

//保存匹配点
matches.push_back(knn_matches[r][0]);
}
}

bool find_transform(Mat& K vector& p1 vector& p2 Mat& R Mat& T Mat& mask)
{
//根据内参矩阵获取相机的焦距和光心坐标(主点坐标)
double focal_length = 0.5*(K.at(0) + K.at(4));
Point2d principle_point(K.at(2) K.at(5));

//根据匹配点求取本征矩阵,使用RANSAC,进一步排除失配点
Mat E = findEssentialMat(p1 p2 focal_length principle_point RANSAC 0.999 1.0 mask);
if (E.empty()) return false;

double feasible_count = countNonZero(mask);
cout << (int)feasible_count << “ -in- “ << p1.size() << endl;
//对于RANSAC而言,outlier数量大于50%时,结果是不可靠的
if (feasible_count <= 15 || (feasible_count / p1.size()) < 0.6)
return false;

//分解本征矩阵,获取相对变换
int pass_count = recoverPose(E p1 p2 R T focal_length principle_point mask);

//同时位于两个相机前方的点的数量要足够大
if (((double)pass_count) / feasible_count < 0.7)
return false;

return true;
}

void get_matched_points(
vector& p1 
vector& p2 
vec

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件     6363282  2008-09-17 15:42  0004.png
     文件     6365922  2008-09-17 15:43  0006.png
     文件        7030  2015-09-02 13:55  main.cpp
     文件         898  2015-09-02 10:26  OpenCV_3_ex_x86.props
     文件         903  2015-09-02 10:26  OpenCV_3_ex_x86d.props
     目录           0  2015-09-02 14:23  Release\
     文件     1822930  2015-09-02 14:23  Release\main.obj
     文件       44032  2015-09-02 14:23  Release\SequentialSfM.exe
     文件        2995  2015-09-02 14:23  Release\SequentialSfM.log
     文件     1200128  2015-09-02 14:23  Release\SequentialSfM.pdb
     目录           0  2015-09-02 14:23  Release\SequentialSfM.tlog\
     文件         684  2015-09-02 14:23  Release\SequentialSfM.tlog\cl.command.1.tlog
     文件       18298  2015-09-02 14:23  Release\SequentialSfM.tlog\CL.read.1.tlog
     文件         278  2015-09-02 14:23  Release\SequentialSfM.tlog\CL.write.1.tlog
     文件        1644  2015-09-02 14:23  Release\SequentialSfM.tlog\link.command.1.tlog
     文件        4204  2015-09-02 14:23  Release\SequentialSfM.tlog\link.read.1.tlog
     文件         328  2015-09-02 14:23  Release\SequentialSfM.tlog\link.write.1.tlog
     文件         165  2015-09-02 14:23  Release\SequentialSfM.tlog\SequentialSfM.lastbuildstate
     文件      888832  2015-09-02 14:23  Release\vc120.pdb
     文件         971  2015-09-01 19:18  SequentialSfM.sln
     文件        4187  2015-09-01 19:37  SequentialSfM.vcxproj
     文件         956  2015-09-01 19:22  SequentialSfM.vcxproj.filters
     目录           0  2015-09-02 12:59  Viewer\
     文件     4627456  2014-09-09 18:03  Viewer\Assimp32.dll
     目录           0  2015-09-02 12:58  Viewer\data\
     文件           0  2014-09-09 18:03  Viewer\data\.gitkeep
     文件      289280  2014-09-09 18:03  Viewer\fmodex.dll
     文件      330752  2014-09-09 18:03  Viewer\fmodexL.dll
     文件     2713600  2014-09-09 18:03  Viewer\FreeImage.dll
     文件      364726  2014-09-09 18:03  Viewer\FreeType-6.dll
     文件      237568  2014-09-09 18:03  Viewer\glut32.dll
............此处省略7个文件信息

评论

共有 条评论