资源简介
使用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\li
文件 4204 2015-09-02 14:23 Release\SequentialSfM.tlog\li
文件 328 2015-09-02 14:23 Release\SequentialSfM.tlog\li
文件 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个文件信息
相关资源
- podofo vs2010 x86编译好的库
- opencv相机标定程序
- 国际象棋马的遍历 贪心算法
- 基于opencv的图片旋转实现
- QT+OpenCV+VS Gerber光绘文件识别
- 海康威视实时视频预览+opencv实时处理
- 计盒维数/盒维数OpenCV计算图片分形维
- 《OpenCV教程》电子书+源代码
-
opencv2.fr
amework - 基于opencv的二维码畸变矫正QT程序
- OpenCV 3.3.0&opencv;_contrib-3.3.0 编译成功后
- 机票管理系统程序
- STL源码剖析 高清 带目录电子书+源代
- opencv310 release Win32 Dll Lib
- 【OpenCV3版】《OpenCV3编程入门》书本配
- opencv车辆识别、标记并计数
- OpenCV中文参考手册
- 人脸检测exe程序可直接运行
- Opencv中查找轮廓,并用直线拟合,检
- opencv需要的常用dllcv100、cv200.dll、ml
- VS2010基于TWAIN协议实现对扫描仪的控制
- 基于QT开发CAN总线上位机
- opencv彩色三通道图片反色
- 使用libxl库读取excel文件
- 车牌识别opencv
- OpenCV教程--基础篇
- win32画图程序 可保存bmp 截图
- 可用于基于VTK的Marching Cubes算法的DI
- 人脸识别+opencv
- OpenGL三维图形系统开发与实用技术.
评论
共有 条评论