From 9312b369b91e6788136b7470268971f2f0d4b790 Mon Sep 17 00:00:00 2001 From: Sebastian Hahta <joseha@utu.fi> Date: Wed, 5 Aug 2020 13:16:25 +0300 Subject: [PATCH] ui to use existing extrinsic params --- .../src/modules/calibration/calibration.hpp | 2 +- .../src/modules/calibration/extrinsic.cpp | 2 +- .../src/views/calibration/extrinsicview.cpp | 76 +++++++++++++++++++ .../include/ftl/calibration/extrinsic.hpp | 18 ++--- .../include/ftl/calibration/optimize.hpp | 4 +- components/calibration/src/extrinsic.cpp | 8 +- 6 files changed, 92 insertions(+), 18 deletions(-) diff --git a/applications/gui2/src/modules/calibration/calibration.hpp b/applications/gui2/src/modules/calibration/calibration.hpp index 00b33b3ec..d98be6023 100644 --- a/applications/gui2/src/modules/calibration/calibration.hpp +++ b/applications/gui2/src/modules/calibration/calibration.hpp @@ -264,7 +264,7 @@ public: std::string cameraName(int camera); std::vector<std::string> cameraNames(); - ftl::calibration::ExtrinsicCalibration& calib(); + ftl::calibration::ExtrinsicCalibration& calib() { return state_.calib; } // should avoid /** hasFrame(int) must be true before calling getFrame() **/ bool hasFrame(int camera); diff --git a/applications/gui2/src/modules/calibration/extrinsic.cpp b/applications/gui2/src/modules/calibration/extrinsic.cpp index c1e4c07e3..9ed307139 100644 --- a/applications/gui2/src/modules/calibration/extrinsic.cpp +++ b/applications/gui2/src/modules/calibration/extrinsic.cpp @@ -83,7 +83,7 @@ void ExtrinsicCalibration::start(unsigned int fsid, std::vector<FrameID> sources calibr.intrinsic = CalibrationData::Intrinsic(calibr.intrinsic, sz); // Scale intrinsics - state_.calib.addStereoCamera(calibl.intrinsic, calibr.intrinsic); + state_.calib.addStereoCamera(calibl, calibr); // Update rectification unsigned int idx = state_.cameras.size() - 2; diff --git a/applications/gui2/src/views/calibration/extrinsicview.cpp b/applications/gui2/src/views/calibration/extrinsicview.cpp index b59f2ffa4..d2f9f64dd 100644 --- a/applications/gui2/src/views/calibration/extrinsicview.cpp +++ b/applications/gui2/src/views/calibration/extrinsicview.cpp @@ -368,6 +368,82 @@ void ExtrinsicCalibrationView::CalibrationWindow::build() { else { flags &= ~ExtrinsicCalibration::Flags::RATIONAL_MODEL; } }); + //////////////////////////////////////////////////////////////////////////// + + new nanogui::Label(wfreeze, "Use available (calibrated) extrinsics for cameras: "); + auto* use_extrinsics = new nanogui::Widget(wfreeze); + use_extrinsics->setLayout(new nanogui::BoxLayout + (nanogui::Orientation::Horizontal, nanogui::Alignment::Minimum)); + for (int n = 0; n < ctrl_->cameraCount(); n++) { + auto* b = new nanogui::Button(use_extrinsics, std::to_string(n)); + b->setFlags(nanogui::Button::Flags::ToggleButton); + b->setPushed(ctrl_->calib().useExtrinsic(n)); + b->setChangeCallback([this, n](bool v){ + LOG(INFO) << "CHANGED"; + ctrl_->calib().setUseExtrinsic(n, v); + }); + } + { + auto* b = new nanogui::Button(use_extrinsics, "All"); + b->setCallback([this, use_extrinsics](){ + for (int i = 0; i < use_extrinsics->childCount() - 2; i ++) { + auto* b = dynamic_cast<nanogui::Button*>(use_extrinsics->childAt(i)); + b->setPushed(true); + b->changeCallback()(true); + } + }); + } + { + auto* b = new nanogui::Button(use_extrinsics, "None"); + b->setCallback([this, use_extrinsics](){ + for (int i = 0; i < use_extrinsics->childCount() - 2; i ++) { + auto* b = dynamic_cast<nanogui::Button*>(use_extrinsics->childAt(i)); + b->setPushed(false); + b->changeCallback()(false); + } + }); + } + + //////////////////////////////////////////////////////////////////////////// + + new nanogui::Label(wfreeze, "Fix extrinsics for cameras: "); + auto* fix_extrinsics = new nanogui::Widget(wfreeze); + fix_extrinsics->setLayout(new nanogui::BoxLayout + (nanogui::Orientation::Horizontal, nanogui::Alignment::Minimum)); + for (int n = 0; n < ctrl_->cameraCount(); n++) { + auto* b = new nanogui::Button(fix_extrinsics, std::to_string(n)); + b->setFlags(nanogui::Button::Flags::ToggleButton); + b->setPushed(ctrl_->calib().options().fix_camera_extrinsic.count(n)); + b->setChangeCallback([this, n](bool v){ + if (v) { + ctrl_->calib().options().fix_camera_extrinsic.insert(n); + } + else { + ctrl_->calib().options().fix_camera_extrinsic.erase(n); + } + }); + } + { + auto* b = new nanogui::Button(fix_extrinsics, "All"); + b->setCallback([this, fix_extrinsics](){ + for (int i = 0; i < fix_extrinsics->childCount() - 2; i ++) { + auto* b = dynamic_cast<nanogui::Button*>(fix_extrinsics->childAt(i)); + b->setPushed(true); + b->changeCallback()(true); + } + }); + } + { + auto* b = new nanogui::Button(fix_extrinsics, "None"); + b->setCallback([this, fix_extrinsics](){ + for (int i = 0; i < fix_extrinsics->childCount() - 2; i ++) { + auto* b = dynamic_cast<nanogui::Button*>(fix_extrinsics->childAt(i)); + b->setPushed(false); + b->changeCallback()(false); + } + }); + } + /* Needs thinking: visualize visibility graph? Use earlier alignment (if * some of the cameras already calibrated), do elsewhere? */ diff --git a/components/calibration/include/ftl/calibration/extrinsic.hpp b/components/calibration/include/ftl/calibration/extrinsic.hpp index a9f7208e3..185a45c17 100644 --- a/components/calibration/include/ftl/calibration/extrinsic.hpp +++ b/components/calibration/include/ftl/calibration/extrinsic.hpp @@ -158,17 +158,10 @@ double calibratePair(const cv::Mat &K1, const cv::Mat &D1, class ExtrinsicCalibration { public: - /** add a single (uncalibrated) camera. Returns index of camera. */ - unsigned int addCamera(const CalibrationData::Intrinsic &); - - /** add a single calibrated camera (if valid calibration). Returns index of camera. */ + /** add a single camera (if valid calibration). Returns index of camera. */ unsigned int addCamera(const CalibrationData::Calibration &); - /** Add a stereo camera pair. Pairs always use other cameras to estimate - * initial pose. Returns index of first camera. */ - unsigned int addStereoCamera(const CalibrationData::Intrinsic &, const CalibrationData::Intrinsic &); - - /** Add calibrated stereo camera (if contains valid calibration) */ + /** Add stereo camera */ unsigned int addStereoCamera(const CalibrationData::Calibration &, const CalibrationData::Calibration &); const CalibrationData::Intrinsic& intrinsic(unsigned int c); @@ -187,11 +180,16 @@ public: /* set bundle adjustment options */ void setOptions(ftl::calibration::BundleAdjustment::Options options) { options_ = options; } - ftl::calibration::BundleAdjustment::Options options() { return options_; } + ftl::calibration::BundleAdjustment::Options& options() { return options_; } /** Number of cameras added */ unsigned int camerasCount() { return calib_.size(); } + /** use existing extrinsic calibration for camera */ + void setUseExtrinsic(unsigned int c, bool v) { is_calibrated_.at(c) = v; } + /** is existing extrinsic parameters used for given camera */ + bool useExtrinsic(unsigned int c) { return is_calibrated_.at(c); }; + /** status message */ std::string status(); diff --git a/components/calibration/include/ftl/calibration/optimize.hpp b/components/calibration/include/ftl/calibration/optimize.hpp index 2e694cd9d..5a2911732 100644 --- a/components/calibration/include/ftl/calibration/optimize.hpp +++ b/components/calibration/include/ftl/calibration/optimize.hpp @@ -143,10 +143,10 @@ public: // specific extrinsic/intrinsic options are applied on top of those. // fix extrinsic paramters for cameras - std::vector<int> fix_camera_extrinsic = {}; + std::set<int> fix_camera_extrinsic = {}; // fix intrinsic paramters for cameras - std::vector<int> fix_camera_intrinsic = {}; + std::set<int> fix_camera_intrinsic = {}; bool fix_focal = false; bool fix_principal_point = false; diff --git a/components/calibration/src/extrinsic.cpp b/components/calibration/src/extrinsic.cpp index d32961040..ac8c037a5 100644 --- a/components/calibration/src/extrinsic.cpp +++ b/components/calibration/src/extrinsic.cpp @@ -353,13 +353,13 @@ double calibratePair(const cv::Mat &K1, const cv::Mat &D1, // ==== Extrinsic Calibration ================================================== -unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Intrinsic &c) { +/*unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Intrinsic &c) { unsigned int idx = calib_.size(); calib_.push_back({c, {}}); calib_optimized_.push_back(calib_.back()); is_calibrated_.push_back(false); return idx; -} +}*/ unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Calibration &c) { unsigned int idx = calib_.size(); @@ -369,7 +369,7 @@ unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Calibration return idx; } -unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Intrinsic &c1, const CalibrationData::Intrinsic &c2) { +/*unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Intrinsic &c1, const CalibrationData::Intrinsic &c2) { unsigned int idx = calib_.size(); calib_.push_back({c1, {}}); calib_optimized_.push_back(calib_.back()); @@ -379,7 +379,7 @@ unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Intrin is_calibrated_.push_back(false); mask_.insert({idx, idx + 1}); return idx; -} +}*/ unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Calibration &c1, const CalibrationData::Calibration &c2) { unsigned int idx = calib_.size(); -- GitLab