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网站的给定的视差并恢复三维场景的代码的更多相关文章

  1. 光流算法:关于OpenCV读写middlebury网站给定的光流的代码

    Middlebury是每个研究光流算法的人不可能不使用的网站,Middlebury提供了许多标准的测试库,这极大地推进了光流算法的进展.Middlebury提供的标准库,其计算出的光流保存在后缀名为. ...

  2. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...

  3. OpenCV读写图像文件解析

    OpenCV读写图像文件解析 imdecode 从内存中的缓冲区读取图像. C++:Mat imdecode(InputArray buf, int flags) C++:Mat imdecode(I ...

  4. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...

  5. 如何在一个网站或者一个页面,去书写你的JS代码

    // JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...

  6. 立体匹配:关于用OpenCV彩色化middlebury网站给定的视差

    #include "XYZ.h" void readPFM(Mat_<float> &disp, float &scale, string path) ...

  7. 立体匹配:关于理解middlebury提供的立体匹配代码后的精减

    Middlebury立体匹配源码总结 优化方法 图像可否预处理 代价计算可否采用BT方式 可选代价计算方法 可否代价聚合 可否MinFilter优化原始代价 WTA-Box 可以 可以 AD/SD 可 ...

  8. Python文件读写及网站显示

    一.关于文件读写的笔记 (一) 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容 文件都是按照2进制进行存储的,但在表现形式上有2种:文本文件和二进制文件. 1. 文本文件 文本 ...

  9. 【VS开发】【计算机视觉】OpenCV读写xml文件《C版本》

    一些简单的XML读写操作,记之于笔记以备忘 主要功能: 1. 创建XML 2. 向XML中存储或者是读取Int float型基本数据 3. 通过创建XML元素,存取复杂的结构如:结构体.矩阵 代码如下 ...

随机推荐

  1. LINUX系统下PHP显示空白页

    因为手工转移,文件所属用户及用户组是root,所以需要把网站程序及数据库都改成对应用户组:如www和mysql. 更改目录所属用户执行命令: chown -R 用户.用户组 目录名, 如:chown ...

  2. 如何用js检查浏览器是否安装flash插件

    <script type="text/javascript" language="JavaScript"> //Powered By smvv @h ...

  3. hadoop spark学习笔记

    http://www.csdn.net/article/2015-06-08/2824889 hive:是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sq ...

  4. Centos Mysql 升级

    如何升级CentOS 6.5下的MySQL CentOS 6.5自带安装了MySQL 5.1,但5.1有诸多限制,而实际开发中,我们也已经使用MySQL 5.6,这导致部分脚本在MySQL 5.1中执 ...

  5. hadoop(二):hdfs HA原理及安装

    早期的hadoop版本,NN是HDFS集群的单点故障点,每一个集群只有一个NN,如果这个机器或进程不可用,整个集群就无法使用.为了解决这个问题,出现了一堆针对HDFS HA的解决方案(如:Linux ...

  6. javascript 与和非

    || :  在javascript中,返回第一个真值,除非都是假值返回最后一个值(也是假值). 1 || 0; 0 || 1; 0 || 0; 0 || undefined; // undefined ...

  7. TextArea限制输入长度

    cs文件中添加文本框属性this.TextBox.Attributes.Add("MaxLength", "200"); $(document).ready(f ...

  8. 【转】Asp.Net MVC3 简单入门详解过滤器Filter

    原文地址:http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html 前言 在开发大项目的时候总会有相关的AOP面向切面编程的组 ...

  9. HttpWebRequest 注意

    使用HttpWebRequest 一定要保证GetRequestStream和GetResponse对象关闭,否则容易造成连接处于CLOSE_WAIT状态 using (Stream stream = ...

  10. fiddler Android下https抓包全攻略

    fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP ...