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 基于 ...
随机推荐
- Docker的基本构架
不多说,直接上干货! Docker的基本构架 Docker基于Client-Server架构,Docker daemon是服务端,Docker client是客户端. Docker的基本架构,如下图所 ...
- Fragment、Activity比较——Android碎片介绍
Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...
- Mixamo Fuse10分钟创建角色
http://edu.manew.com/course/132 太6了
- jquery点击事件后增加克隆的标签,并改变克隆的属性加入
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Codeforces 975D. Ghosts
Description 给出一条直线 \(a*x+b\) 上的 \(n\) 个点,每一个点有一个速度 \((v_x,v_y)\),求 \(T=[-oo,oo]\) 相交的次数乘以 \(2\) 题面 S ...
- openLayers3 中实现多个Overlay
此篇的目的是为了记录下用Overlay的一些操作. 其实实现多个就是创建多个div,然后给每个div绑定Overlay. //页面加载完函数 --显示个关键点的名称 window.onload = f ...
- Google Kickstart在线测试规则以及注意事项
谷歌招聘在如火如荼的进行中,进谷歌都需要经过谷歌kickstart在线测试,然后过了之后还有五轮的面试- -.好吧毕竟你待遇高,你强你有理.. 下面介绍一下进谷歌的第一关google kickstar ...
- 基于Ajax与用户认证系统的登录验证
一.登录页面 from django.contrib import admin from django.urls import path from blog import views urlpatte ...
- linux常用指令集-持续更新...
0.查看所有java进程GC情况:for i in `jps|egrep -v "Jps|Launcher" |cut -d" " -f1`;do pwdx $ ...
- web.xml中不同版本的servlet头以及版本控制
参考文章: http://www.cnblogs.com/beijingstruggle/p/5461146.html http://blog.csdn.net/z69183787/article/d ...