立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码相关的知识,希望对你有一定的参考价值。

立体匹配:关于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;
}

 

以上是关于立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码的主要内容,如果未能解决你的问题,请参考以下文章

基于Opencv的几种立体匹配算法+ELAS

OpenCV 立体匹配/校准

OpenCV 立体匹配

使用 OpenCV 描述符与 findFundamentalMat 匹配

OpenCV立体匹配算法 StereoBM/StereoSGBM/StereoVar

FlannBasedMatcher 立体匹配