立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码
时间:2016-02-23 20:56:22
收藏:0
阅读:1646
立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码
Middlebury是每个研究立体匹配算法的人不可能不使用的网站,Middlebury提供了许多标准的测试库,这极大地推进了立体匹配算法的进展。Middlebury提供的标准库,其计算出的视差保存在后缀名为.pfm的文件中,Middlebury本身也提供了读取.pfm文件中C++源码和Matlab源码。尽管如此,将源码写成与OpenCV结合的形式是我们更期望的,以下我写的读写.pfm文件的源码。相对于Middlebury给定的源码,更简洁易懂。
#include "CCC/COMCV.h"
#include <fstream>
void writePFM(Mat_<float> &pfm, string path, float scale = - 1 / 255.0)
{
ofstream out("./../TestData/2.pfm", ios_base::binary);
out << "Pf" << endl << pfm.cols << " " << pfm.rows << endl << scale << endl;
for (int i = pfm.rows - 1; i >= 0; i--)//因为存储是从最后行开始存储的
for (int j = 0; j < pfm.cols; j++)
out.write((const char*)(&pfm(i, j)), sizeof(float));
out.close();
}
float readPFM(Mat_<float> &pfm, string path)
{
ifstream in(path, ios_base::binary);
int cols;
int rows;
float scale;
char tmp[10];
in.get(tmp, 10, ‘\n‘); in.get();//文件头
in.get(tmp, 10, ‘ ‘); in.get(); cols = atoi(tmp);//列数
in.get(tmp, 10, ‘\n‘); in.get(); rows = atoi(tmp); //行数
in.get(tmp, 10, ‘\n‘); in.get(); scale = atof(tmp);//缩放因子
pfm.create(rows, cols);
for (int i = pfm.rows - 1; i >= 0; i--)//因为存储是从最后行开始存储的
for (int j = 0; j < pfm.cols; j++)
in.read((char*)(&pfm(i, j)), sizeof(float));
in.close();
return scale;
}
评论(1)
共0条