This commit is contained in:
Christian Forster
2014-04-01 16:32:14 +02:00
parent 4c722969a9
commit cc38295405
2 changed files with 23 additions and 28 deletions
+1 -1
View File
@@ -60,7 +60,7 @@ protected:
int min_level_; //!< finest pyramid level for the alignment. int min_level_; //!< finest pyramid level for the alignment.
// cache: // cache:
Matrix<double, 6, Dynamic, ColMajor> jacobian_cache_; //!< the first row is a flag whether the jacobian has been computed. Matrix<double, 6, Dynamic, ColMajor> jacobian_cache_;
bool have_ref_patch_cache_; bool have_ref_patch_cache_;
cv::Mat ref_patch_cache_; cv::Mat ref_patch_cache_;
std::vector<bool> visible_fts_; std::vector<bool> visible_fts_;
+22 -27
View File
@@ -26,12 +26,12 @@
namespace svo { namespace svo {
SparseImgAlign:: SparseImgAlign::SparseImgAlign(
SparseImgAlign(int max_level, int min_level, int n_iter, int max_level, int min_level, int n_iter,
Method method, bool display, bool verbose) : Method method, bool display, bool verbose) :
display_(display), display_(display),
max_level_(max_level), max_level_(max_level),
min_level_(min_level) min_level_(min_level)
{ {
n_iter_ = n_iter; n_iter_ = n_iter;
n_iter_init_ = n_iter_; n_iter_init_ = n_iter_;
@@ -40,8 +40,7 @@ SparseImgAlign(int max_level, int min_level, int n_iter,
eps_ = 0.000001; eps_ = 0.000001;
} }
size_t SparseImgAlign:: size_t SparseImgAlign::run(FramePtr ref_frame, FramePtr cur_frame)
run(FramePtr ref_frame, FramePtr cur_frame)
{ {
reset(); reset();
@@ -55,7 +54,7 @@ run(FramePtr ref_frame, FramePtr cur_frame)
cur_frame_ = cur_frame; cur_frame_ = cur_frame;
ref_patch_cache_ = cv::Mat(ref_frame_->fts_.size(), patch_area_, CV_32F); ref_patch_cache_ = cv::Mat(ref_frame_->fts_.size(), patch_area_, CV_32F);
jacobian_cache_.resize(Eigen::NoChange, ref_patch_cache_.rows*patch_area_); jacobian_cache_.resize(Eigen::NoChange, ref_patch_cache_.rows*patch_area_);
visible_fts_.resize(ref_patch_cache_.rows, false); visible_fts_.resize(ref_patch_cache_.rows, false); // TODO: should it be reset at each level?
SE3 T_cur_from_ref(cur_frame_->T_f_w_ * ref_frame_->T_f_w_.inverse()); SE3 T_cur_from_ref(cur_frame_->T_f_w_ * ref_frame_->T_f_w_.inverse());
@@ -74,9 +73,7 @@ run(FramePtr ref_frame, FramePtr cur_frame)
} }
// TODO take jacobian from Frame Class! // TODO take jacobian from Frame Class!
void void frameJac(const Vector3d & xyz, Matrix<double,2,6> & J)
frameJac(const Vector3d & xyz,
Matrix<double,2,6> & J)
{ {
const double x = xyz[0]; const double x = xyz[0];
const double y = xyz[1]; const double y = xyz[1];
@@ -98,8 +95,7 @@ frameJac(const Vector3d & xyz,
J(1,5) = x*z_inv; // x/z J(1,5) = x*z_inv; // x/z
} }
void SparseImgAlign:: void SparseImgAlign::precomputeReferencePatches()
precomputeReferencePatches()
{ {
const int border = patch_halfsize_+1; const int border = patch_halfsize_+1;
const cv::Mat& ref_img = ref_frame_->img_pyr_.at(level_); const cv::Mat& ref_img = ref_frame_->img_pyr_.at(level_);
@@ -162,15 +158,16 @@ precomputeReferencePatches()
have_ref_patch_cache_ = true; have_ref_patch_cache_ = true;
} }
double SparseImgAlign:: double SparseImgAlign::computeResiduals(
computeResiduals(const SE3& T_cur_from_ref, bool linearize_system, bool compute_weight_scale) const SE3& T_cur_from_ref,
bool linearize_system,
bool compute_weight_scale)
{ {
// Warp the (cur)rent image such that it aligns with the (ref)erence image // Warp the (cur)rent image such that it aligns with the (ref)erence image
const cv::Mat& ref_img = ref_frame_->img_pyr_.at(level_);
const cv::Mat& cur_img = cur_frame_->img_pyr_.at(level_); const cv::Mat& cur_img = cur_frame_->img_pyr_.at(level_);
if(linearize_system && display_) if(linearize_system && display_)
resimg_ = cv::Mat(ref_img.size(), CV_32F, cv::Scalar(0)); resimg_ = cv::Mat(cur_img.size(), CV_32F, cv::Scalar(0));
if(have_ref_patch_cache_ == false) if(have_ref_patch_cache_ == false)
precomputeReferencePatches(); precomputeReferencePatches();
@@ -179,7 +176,7 @@ computeResiduals(const SE3& T_cur_from_ref, bool linearize_system, bool compute_
std::vector<float> errors; std::vector<float> errors;
if(compute_weight_scale) if(compute_weight_scale)
errors.reserve(visible_fts_.size()); errors.reserve(visible_fts_.size());
const int stride = ref_img.cols; const int stride = cur_img.cols;
const int border = patch_halfsize_+1; const int border = patch_halfsize_+1;
const float scale = 1.0f/(1<<level_); const float scale = 1.0f/(1<<level_);
const Vector3d ref_pos(ref_frame_->pos()); const Vector3d ref_pos(ref_frame_->pos());
@@ -259,8 +256,7 @@ computeResiduals(const SE3& T_cur_from_ref, bool linearize_system, bool compute_
return chi2/n_meas_; return chi2/n_meas_;
} }
int SparseImgAlign:: int SparseImgAlign::solve()
solve()
{ {
x_ = H_.ldlt().solve(Jres_); x_ = H_.ldlt().solve(Jres_);
if((bool) std::isnan((double) x_[0])) if((bool) std::isnan((double) x_[0]))
@@ -268,8 +264,9 @@ solve()
return 1; return 1;
} }
void SparseImgAlign:: void SparseImgAlign::update(
update(const ModelType& T_curold_from_ref, ModelType& T_curnew_from_ref) const ModelType& T_curold_from_ref,
ModelType& T_curnew_from_ref)
{ {
// the jacobian is computed in the coordinate frame of the reference image // the jacobian is computed in the coordinate frame of the reference image
// T_ref_from_curnew = T_ref_from_curold * SE3::exp(x_).inverse(); // T_ref_from_curnew = T_ref_from_curold * SE3::exp(x_).inverse();
@@ -277,12 +274,10 @@ update(const ModelType& T_curold_from_ref, ModelType& T_curnew_from_ref)
T_curnew_from_ref = SE3::exp(x_) * T_curold_from_ref; T_curnew_from_ref = SE3::exp(x_) * T_curold_from_ref;
} }
void SparseImgAlign:: void SparseImgAlign::startIteration()
startIteration()
{} {}
void SparseImgAlign:: void SparseImgAlign::finishIteration()
finishIteration()
{ {
if(display_) if(display_)
{ {