#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的更多相关文章

  1. 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...

  2. Json CPP 中文支持与入门示例

    在每一个Json Cpp自带*.cpp文件头加上: #include "stdafx.h" 将Json Cpp对自带的头文件的引用修改为单引号方式,例如json_reader.cp ...

  3. cpp 调用python

    在用cpp调用python时, 出现致命错误: no module named site  ,  原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...

  4. nginx+fastcgi+c/cpp

    参考:http://github.tiankonguse.com/blog/2015/01/19/cgi-nginx-three/ 跟着做了一遍,然后根据记忆写的,不清楚有没错漏步骤,希望多多评论多多 ...

  5. APM程序分析-ArduCopter.cpp

    该文件是APM的主文件. #define SCHED_TASK(func, rate_hz, max_time_micros) SCHED_TASK_CLASS(Copter, &copter ...

  6. APM程序分析-AC_WPNav.cpp

    APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...

  7. Dev Cpp 输出中文字符问题

    最近 c++ 上机作业,vc++6.0 挂了没法用,只好用 Dev Cpp 先顶替一下,然而在遇到输出中文字符的时候出现了乱码的情况,但这种情况又非常诡异.于是简单了解了一下写成此博客. [写在前面] ...

  8. 【安卓】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 ...

  9. Identify Memory Leaks in Visual CPP Applications —— VLD内存泄漏检测工具

    原文地址:http://www.codeproject.com/Articles/1045847/Identify-Memory-Leaks-in-Visual-CPP-Applications 基于 ...

随机推荐

  1. MySQL 常用show 语句

    1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. 2. show databases; -- 显示mysql中所有数据 ...

  2. 重拾简单的linux指令之info 【转】

    info命令 可以利用该命令获取帮助 1. 语法格式:info <command> 2. 语法简述: 类似于man命令的获取帮助信息,比较于man命令更容易读.是以网页的结构来显示内容.而 ...

  3. Iterator遍历 (遍历集合)

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  4. Java入门系列-06-运算符

    这篇文章为你搞懂2个问题 java 中的常用运算符有哪些?如何使用? 这些运算符的运算优先级是怎样的? 算数运算符 明显是做数学运算的,包括以下符号: + 加法运算 敲一敲: public class ...

  5. LeetCode 319 ——Bulb Switcher——————【数学技巧】

    319. Bulb Switcher My Submissions QuestionEditorial Solution Total Accepted: 15915 Total Submissions ...

  6. 0、安装Ionic2

    1.安装ionic2 $ npm install -g ionic@beta 2.创建项目 $ ionic start 项目名称 --v2 //  默认tabs的模板 $ ionic start 项目 ...

  7. File 类 的基本操作

    //  File 类(静态类)   File 的缺点:只能用来读小文件 (它是一下子全都读进去) //创建一个文件 // File.Create(@"C:\Users\wbrm\Deskto ...

  8. jstl标注标签库

    1.  常用标签 引入标签库: <%@ taglib prefix=”c” uri=”” %> 1.      C 标签   (1)<c:out value=”” default=” ...

  9. concat、concat_ws、group_concat函数用法

    一.concat()函数可以连接一个或者多个字符串 CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. select conc ...

  10. mysql应用学习-解决数据乱码

    原因 mysql数据库character_set_database和character_set_server默认编码是latin1,所以导致乱码: 修改步骤 step1. 修改my.ini配置 在[m ...