立体匹配:关于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元素,存取复杂的结构如:结构体.矩阵 代码如下 ...
随机推荐
- JavaScript遍历table的行和列
来源:http://blog.csdn.net/bobwu/article/details/7497412 <HTML> <head> <SCRIPT LANGUAGE= ...
- c# 调用MD5CryptoServiceProvider出现 System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
进注册表按Win+R运行regedit修改下面的值为0就可以了 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorith ...
- 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)
问题描述: 一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”.从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚.但是, ...
- MATLAB中trapz和cumtrapz函数
这两个函数都是MATLAB中的内置函数,是基于梯形法则的数值积分公式 例如我们有函数y=x^3-2x-3,为了计算在[0,1]上的积分,可以这么做: 其中x和y分别是自变量和对应的值,trapz其实就 ...
- Struts2 - Study 1
领略下传说中的Struts2,写了个小例子,有点意思.比起.net中的MVC有意思的在于它是你自己一步步去配置实现,想怎么搞就怎么搞,.net的MVC,它干了什么事你完全不知,只不过知道怎么用而已. ...
- 剑指offer系列43---判断平衡二叉树
[题目]判断一颗二叉树是不是平衡二叉树. * 平衡二叉树定义:任意子节点深度相差不超过1.[思路]由上题,利用递归得到二叉树每个结点的深度同时比较. package com.exe9.offer; i ...
- RDP setting group policy
RDP setting group policy 1.Login to domain controller and go to Group Policy Management tool2.Click ...
- foxmail 6.5升级到7.0版本后,旧邮件的导入处理
随着foxmail 7.0版的火热升级,部分从foxmial 6.5版升级到7.0版的用户可能会出现旧邮件丢失的困扰.这里,foxmail为大家提供的解决方案如下: 打开Foxmail,点击 文件 ...
- 获取URL参数
function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...
- 我的Android最佳实践之—— Android启动画面的实现方法
本文实例讲述了Android启动画面的实现方法.分享给大家供大家参考.具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源.Android要实现启动画面可以这样做: ...