DisparityCostVolumeEstimator.cpp
#include "DisparityCostVolumeEstimator.hpp" #include "DisparityCostVolume.hpp" #include "stereo_matching/cost_functions.hpp" #include "helpers/get_option_value.hpp"
#include "helpers/fill_multi_array.hpp" #include <boost/gil/image_view_factory.hpp> namespace doppia
{ using namespace boost;
using namespace boost::gil;
using namespace std; typedef DisparityCostVolume::range_t range_t;
typedef DisparityCostVolume::const_data_2d_view_t const_data_2d_view_t;
typedef DisparityCostVolume::const_data_1d_view_t const_data_1d_view_t;
typedef DisparityCostVolume::const_data_2d_subarray_t const_data_2d_subarray_t;
typedef DisparityCostVolume::const_data_1d_subarray_t const_data_1d_subarray_t;
typedef DisparityCostVolume::data_3d_view_t data_3d_view_t; program_options::options_description DisparityCostVolumeEstimator::get_args_options()
{
program_options::options_description desc("DisparityCostVolumeEstimator options"); const bool simple_block_matcher_options_are_included = true; if(not simple_block_matcher_options_are_included)
{
desc.add_options() ("pixels_matching",
program_options::value<string>()->default_value("sad"),
"pixels matching method: sad, ssd, census or gradient") ("threshold",
program_options::value<float>()->default_value(0.5),
"minimum percent of pixels required to declare a match value between [0,1]") ;
} return desc;
} DisparityCostVolumeEstimator::DisparityCostVolumeEstimator()
: AbstractDisparityCostVolumeEstimator()
{
// this constructor should only be used for unit testing
return;
} DisparityCostVolumeEstimator::DisparityCostVolumeEstimator(const program_options::variables_map &options)
: AbstractDisparityCostVolumeEstimator(options)
{ threshold_percent = get_option_value<float>(options,"threshold"); assert(threshold_percent > 0.0f);
assert(threshold_percent <= 1.0f); return;
} DisparityCostVolumeEstimator::~DisparityCostVolumeEstimator()
{
// nothing to do here
return;
} void DisparityCostVolumeEstimator::compute(gil::gray8c_view_t &left,
gil::gray8c_view_t &right,
DisparityCostVolume &cost_volume)
{
compute_impl(left, right, cost_volume);
return;
} void DisparityCostVolumeEstimator::compute(gil::rgb8c_view_t &left,
gil::rgb8c_view_t &right,
DisparityCostVolume &cost_volume)
{
compute_impl(left, right, cost_volume);
return;
} template <typename ImgView>
void DisparityCostVolumeEstimator::compute_impl( ImgView &left, ImgView &right, DisparityCostVolume &cost_volume)
{ if (pixels_matching_method == "sad")
{
if(first_computation)
{
printf("DisparityCostVolumeEstimator::compute_impl will use sad matching over %zi disparities\n\n",
max_disparity);
}
SadCostFunctionT<uint8_t> pixels_distance;
compute_costs_impl(left, right, pixels_distance, cost_volume);
}
else if (pixels_matching_method == "ssd")
{
if(first_computation)
{
printf("DisparityCostVolumeEstimator::compute_impl will use ssd matching over %zi disparities\n\n",
max_disparity);
}
SsdCostFunction pixels_distance;
compute_costs_impl(left, right, pixels_distance, cost_volume);
}
else
{
printf("DisparityCostVolumeEstimator::compute_impl received an unknow pixels_matching_method value == %s\n",
pixels_matching_method.c_str()); throw std::invalid_argument("DisparityCostVolumeEstimator::compute_impl received an unknow pixels_matching_method");
} first_computation = false; return;
} template <typename ImgView, typename PixelsCostType>
inline void compute_costs_for_disparity(const ImgView &left, const ImgView &right,
PixelsCostType &pixels_distance,
const int disparity,
DisparityCostVolume::data_2d_view_t &disparity_cost_view)
{
typedef typename ImgView::value_type pixel_t;
typedef DisparityCostVolume::data_1d_subarray_t data_1d_subarray_t; // a pixel (x,y) on the left image should be matched on the right image on the range ([0,x],y)
//const int first_right_x = first_left_x - disparity; for(int y=; y < left.height(); y+=)
{
typename ImgView::x_iterator left_row_it = left.x_at(disparity, y);
typename ImgView::x_iterator right_row_it = right.row_begin(y);
data_1d_subarray_t cost_row_subarray = disparity_cost_view[y];
data_1d_subarray_t::iterator cost_it = cost_row_subarray.begin() + disparity;
for(int left_x=disparity; left_x < left.width(); left_x+=, ++left_row_it, ++right_row_it, ++cost_it)
{
const DisparityCostVolume::cost_t pixel_cost = pixels_distance(*left_row_it, *right_row_it);
*cost_it = pixel_cost;
} // end of 'for each row'
} // end of 'for each column' return;
} template <typename ImgView, typename PixelsCostType>
void DisparityCostVolumeEstimator::compute_costs_impl(const ImgView &left, const ImgView &right,
PixelsCostType &pixels_distance,
DisparityCostVolume &cost_volume)
{ typedef typename ImgView::value_type pixel_t;
maximum_cost_per_pixel = pixels_distance.template get_maximum_cost_per_pixel<pixel_t>(); // lazy initialization
this->resize_cost_volume(left.dimensions(), cost_volume); const bool crop_borders = false; if(crop_borders)
{
// FIXME hardcoded values
const int top_bottom_margin = ; // 20 // 10 // pixels
const int left_right_margin = ; //left.width()*0.1; // *0.05 // pixels const int
sub_width = left.width() - *left_right_margin,
sub_height = left.height() - *top_bottom_margin;
const ImgView
left_subview = boost::gil::subimage_view(left,
left_right_margin, top_bottom_margin,
sub_width, sub_height),
right_subview = boost::gil::subimage_view(right,
left_right_margin,top_bottom_margin,
sub_width, sub_height); const int y_min = top_bottom_margin, y_max = left.height() - top_bottom_margin;
const int x_min = left_right_margin, x_max = left.width() - left_right_margin;
data_3d_view_t data = cost_volume.get_costs_views();
data_3d_view_t
data_subview = data[ boost::indices[range_t(y_min, y_max)][range_t(x_min, x_max)][range_t()] ]; // fill the original volumn with zero
fill(cost_volume.get_costs_views(), ); #pragma omp parallel for
for(size_t disparity=; disparity < max_disparity; disparity +=)
{
DisparityCostVolume::data_2d_view_t disparity_slice = data_subview[ boost::indices[range_t()][range_t()][disparity] ];
compute_costs_for_disparity(left_subview, right_subview, pixels_distance, disparity, disparity_slice);
} }
else
{ // for each pixel and each disparity value
#pragma omp parallel for
for(size_t disparity=; disparity < max_disparity; disparity +=)
{
data_3d_view_t data = cost_volume.get_costs_views();
DisparityCostVolume::data_2d_view_t disparity_slice = data[ boost::indices[range_t()][range_t()][disparity] ];
compute_costs_for_disparity(left, right, pixels_distance, disparity, disparity_slice);
} } // end of "if else crop_borders" return;
} } // end of namespace doppia
ImgView这个模版类没有找到
SsdCostFunction、SadCostFunctionT来自cost_functions.hpp,实际上就是具体值怎么计算
DisparityCostVolumeEstimator.cpp的更多相关文章
- 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码
前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...
- Json CPP 中文支持与入门示例
在每一个Json Cpp自带*.cpp文件头加上: #include "stdafx.h" 将Json Cpp对自带的头文件的引用修改为单引号方式,例如json_reader.cp ...
- cpp 调用python
在用cpp调用python时, 出现致命错误: no module named site , 原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...
- nginx+fastcgi+c/cpp
参考:http://github.tiankonguse.com/blog/2015/01/19/cgi-nginx-three/ 跟着做了一遍,然后根据记忆写的,不清楚有没错漏步骤,希望多多评论多多 ...
- APM程序分析-ArduCopter.cpp
该文件是APM的主文件. #define SCHED_TASK(func, rate_hz, max_time_micros) SCHED_TASK_CLASS(Copter, &copter ...
- APM程序分析-AC_WPNav.cpp
APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...
- Dev Cpp 输出中文字符问题
最近 c++ 上机作业,vc++6.0 挂了没法用,只好用 Dev Cpp 先顶替一下,然而在遇到输出中文字符的时候出现了乱码的情况,但这种情况又非常诡异.于是简单了解了一下写成此博客. [写在前面] ...
- 【安卓】aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creating directories: Invalid argument
这几天在使用.aidl文件的时候eclipse的控制台总是爆出如下提示: aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creatin ...
- Identify Memory Leaks in Visual CPP Applications —— VLD内存泄漏检测工具
原文地址:http://www.codeproject.com/Articles/1045847/Identify-Memory-Leaks-in-Visual-CPP-Applications 基于 ...
随机推荐
- Reading a IMU Without Kalman: The Complementary Filter
目标是将惯性测量元件(IMU)之中陀螺仪.加速计的数据结合使用.Kalman filter太复杂,在微机上倾向用一种更简单的方法:Complementary filter 姿态估计(获得3个角度,俯仰 ...
- SSH Intro - Remove entry
ssh-keygen -f "/home/frank/.ssh/known_hosts" -R ec2-54-222-218-195.cn-north-1.compute.amaz ...
- Java基础25-静态代码块
/* 静态代码块 格式: static{ 静态代码块中执行语句 } 特点:随着类的加载而执行,并且只会执行一次,并且还优先于主函数. 作用:用于给类进行初始化 */ public class Test ...
- File upload error - unable to create a temporary file
php上传图片的时候会报错: File upload error - unable to create a temporary file 文件上传错误 - 无法创建一个临时文件 你只需要打开你的php ...
- FontAwesome 图标 class="fa fa-home"
本文转自:http://www.yeahzan.com/fa/facss.html 引用方式: class="fa fa-home" 注意:每个图标的引用都必须要添加 fa fa- ...
- python学习(七)--豆瓣爬取电影名,评分以及演员
import requestsimport re #爬取豆瓣电影排名pageNum = int(input("要查看第几页电影分数:"))#已知豆瓣默认每页展示20条#url= & ...
- 【学习笔记】关于DOM4J:使用DOM4J解析XML文档
一.概述 DOM4J是一个易用的.开源的库,用于XML.XPath和XSLT中.采用了Java集合框架并完全支持DOM.SAX.和JAXP. DOM4J最大的特色是使用大量的接口,主要接口都在org. ...
- eclipse spring boot项目部署
选中项目------>右键----->Run As------>Manven bulid-->填写Name:XXX; Goals:clean package -Dmaven.t ...
- (转)防止ViewPager中的Fragment被销毁的方法
在使用ViewPager与Fragment的时候,ViewPager会自动缓存1页内的数据,如下图: 当我们当前处在页面2的时候,页面1和页面3的View实际上已经创建好了,所以在我们拖动的时候是可以 ...
- Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项怎么办?
在Jenkins中,打开“系统管理”→“管理节点”→“新建节点”页面时,“启动方式”选项没有“通过Java Web启动代理”,怎么办? 打开“系统管理”,进入“全局安全配置”页面. 1. “JNLP代 ...