立体匹配:关于OpenCV读写middlebury网站的给定的视差并恢复三维场景的代码
Middlebury是每个研究立体匹配算法的人不可能不使用的网站,Middlebury提供了许多标准的测试库,这极大地推进了立体匹配算法的进展。Middlebury提供的标准库,其计算出的视差保存在后缀名为.pfm的文件中,Middlebury本身也提供了读取.pfm文件中C++源码和Matlab源码。尽管如此,将源码写成与OpenCV结合的形式是我们更期望的,以下我写的读写.pfm文件的源码。相对于Middlebury给定的源码,更简洁易懂。
#include "CCC/COMCV.h"
#include <fstream>
void writPFM(Mat_<float> &disp, float &scale, string path)
{
ofstream out(path, ios_base::binary);
out << "Pf" << endl << disp.cols << " " << disp.rows << endl << scale << endl;
; i >= ; i--)//因为存储是从最后行开始存储的
; j < disp.cols; j++)
out.write((const char*)(&disp(i, j)), sizeof(float));
out.close();
}
void readPFM(Mat_<float> &disp, float &scale, string path)
{
ifstream in(path, ios_base::binary);
int cols;
int rows;
];
, '\n'); in.get();//文件头
, ' '); in.get(); cols = atoi(tmp);//列数
, '\n'); in.get(); rows = atoi(tmp); //行数
, '\n'); in.get(); scale = atof(tmp);//缩放因子
disp.create(rows, cols);
; i >= ; i--)//因为存储是从最后行开始存储的
; j < disp.cols; j++)
in.read((char*)(&disp(i, j)), sizeof(float));
in.close();
}
void calcXYZ(Mat_<float> &disp, float f, float cx, float cy, float doffs, float baseline, Mat_<Vec3f> xyz)
{
; i < disp.rows; i++)
; j < disp.cols; j++)
{
float x = baseline*(j - cx) / (disp(i, j) + doffs);
float y = baseline*(i - cy) / (disp(i, j) + doffs);
float z = baseline*f / (disp(i, j) + doffs);
xyz(i, j) = Vec3f(x, y, z);
}
}
void writPLY(Mat_<Vec3f> &xyz, Mat_<Vec3b> &img,string path)
{
ofstream out(path);
out << "ply";
out << endl << "format ascii 1.0";
out << endl << "element vertex " << xyz.total();
out << endl << "property float32 x";
out << endl << "property float32 y";
out << endl << "property float32 z"; out << endl << "property uchar red"; out << endl << "property uchar green"; out << endl << "property uchar blue";
out << endl << "end_header";
; i < xyz.rows; i++)
; j < xyz.cols; j++)
] << ] << ] << " " << (int)img(i, j)[2] << " " << (int)img(i, j)[1] << " " << (int)img(i,j)[0];
out.close();
}
void PFM2XML(string pfmpath, string xmlpath)
{
Mat_<float> pfm;
float scale;
readPFM(pfm, scale, pfmpath);
saveXML(xmlpath, pfm);
writPFM(pfm, scale, pfmpath + "_verify.pfm");
}
void PFM2PLY(string pfmpath, string calibpath, string imgpath, string plypath)
{
Mat_<float> pfm;
float scale;
readPFM(pfm, scale, pfmpath);
ifstream in(calibpath);
string cxstr, cystr, fstr, doffsstr, baselinestr, tmp;
in >> fstr >> tmp >> cxstr >> tmp >> tmp >> cystr >> tmp >> tmp >> tmp;
in >> tmp >> tmp >> tmp >> tmp >> tmp >> tmp >> tmp >> tmp >> tmp;
in >> doffsstr >> baselinestr;
in.close();
//cout << endl << fstr << endl << cxstr << endl << cystr << endl << doffsstr << endl << baselinestr;
).c_str());
, cxstr.length() - ).c_str());
, cystr.length() - ).c_str());
).c_str());
).c_str());
//cout << endl << f << endl << cx << endl << cy << endl << doffs << endl << baseline;getchar();
Mat_<Vec3f> xyz(pfm.rows, pfm.cols);
calcXYZ(pfm, f, cx, cy, doffs, baseline, xyz); Mat_<Vec3b> img = imread(imgpath,1);
writPLY(xyz, img, plypath);
}
void PFM2XM2LPLY_DIR()
{
string dir = "./../TestData";
vector<string> dirs = cv_GetListFolders(dir);
; k < dirs.size(); k++)
{
string pfmpath = dirs[k] + "/disp0GT.pfm";
string xmlpath = dirs[k] + "/disp0GT.xml";
string calibpath = dirs[k] + "/calib.txt"; string imgpath = dirs[k] + "/im0.png";
string plypath = dirs[k] + "/0xyz.ply";
PFM2XML(pfmpath, xmlpath);
PFM2PLY(pfmpath, calibpath, imgpath, plypath);
}
}
立体匹配:关于OpenCV读写middlebury网站的给定的视差并恢复三维场景的代码的更多相关文章
- 光流算法:关于OpenCV读写middlebury网站给定的光流的代码
Middlebury是每个研究光流算法的人不可能不使用的网站,Middlebury提供了许多标准的测试库,这极大地推进了光流算法的进展.Middlebury提供的标准库,其计算出的光流保存在后缀名为. ...
- OpenCV读写视频文件解析(二)
OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...
- OpenCV读写图像文件解析
OpenCV读写图像文件解析 imdecode 从内存中的缓冲区读取图像. C++:Mat imdecode(InputArray buf, int flags) C++:Mat imdecode(I ...
- OpenCV读写视频文件解析
OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...
- 如何在一个网站或者一个页面,去书写你的JS代码
// JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...
- 立体匹配:关于用OpenCV彩色化middlebury网站给定的视差
#include "XYZ.h" void readPFM(Mat_<float> &disp, float &scale, string path) ...
- 立体匹配:关于理解middlebury提供的立体匹配代码后的精减
Middlebury立体匹配源码总结 优化方法 图像可否预处理 代价计算可否采用BT方式 可选代价计算方法 可否代价聚合 可否MinFilter优化原始代价 WTA-Box 可以 可以 AD/SD 可 ...
- Python文件读写及网站显示
一.关于文件读写的笔记 (一) 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容 文件都是按照2进制进行存储的,但在表现形式上有2种:文本文件和二进制文件. 1. 文本文件 文本 ...
- 【VS开发】【计算机视觉】OpenCV读写xml文件《C版本》
一些简单的XML读写操作,记之于笔记以备忘 主要功能: 1. 创建XML 2. 向XML中存储或者是读取Int float型基本数据 3. 通过创建XML元素,存取复杂的结构如:结构体.矩阵 代码如下 ...
随机推荐
- MVC2、MVC3、MVC4、MVC5之间的区别 以及Entity Framework 6 Code First using MVC 5官方介绍教程
现在MVC的技术日趋成熟,面对着不同版本的MVC大家不免有所迷惑 -- 它们之间有什么不同呢?下面我把我搜集的信息汇总一下,以便大家能更好的认识不同版本MVC的功能,也便于自己查阅. View Eng ...
- 关于ExpandableListView用法的一个简单小例子
喜欢显示好友QQ那样的列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到an ...
- IE7中line-height垂直居中问题
line-height:24px; *+line-height:24px; //针对ie7 height:24px
- oracle定时任务JOB
在jobs上点新建 what值:statisticsToDay; 这个是存储过程的名字间隔:sysdate+1/24 表示每个小时运行一次 1:每分钟执行 Interval ...
- C#文本文件(.txt)读写
目录 前言 读取txt文件 写入txt文件 前言 计算机在最初只支持ASCII编码,但是后来为了支持其他语言中的字符(比如汉字)以及一些特殊字符(比如€),就引入了Unicode字符集.基于Unico ...
- Request Session生命周期及struts1 中service的编写
现在接手的项目是一个早期的struts1框架的项目.同时也是刚开始接触web 以及struts1架构. 在处理多个action时,有一个tab子页面需要每5s自动刷新一次. 然后在测试过程中发现,点击 ...
- oracle数据库数据导出和导入
oracle的客户端里面的bin下面有两个可执行文件,名称分别为exp.exe和imp.exe. 他俩的用途就是导出和导入数据用的. 全库 导出:exp 用户名/密码@数据库名 full=y file ...
- phpstorm 配置自带webserver ,配置根目录
版权声明:本文为博主原创文章,未经博主允许不得转载. from http://blog.csdn.net/pony_maggie/article/details/52367093 目录(?)[-] ...
- 【Spring-AOP-学习笔记-7】@Around增强处理简单示例
阅读目录 简单介绍 章节1:项目结构 章节2:定义切面类.连接点注解类 章节3:为待增强的方法--添加注解声明 章节4:AspectJ配置文件 章节5:测试类xxx 章节6:测试结果 Around 增 ...
- 【转】8张图理解Java
一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选.如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟. 1.字符串不变性 下面这张图展示了这段代码做 ...