diff --git a/applications/gui2/src/modules/calibration/calibration.hpp b/applications/gui2/src/modules/calibration/calibration.hpp index 00b33b3ec5288c7f49469f8c51002e2a33efa372..d98be60232d45202c262bf764815ebd516d87ef6 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 c1e4c07e3764bcfe62f9eadf50952b81f0cc7c8d..9ed307139e212e633a5f847505db45508c4a5df1 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 b59f2ffa46b31802a5fa7b60c757439575324f29..d2f9f64dd2069ac36b59f50bc1fe6a40e61b5221 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 a9f7208e39ff158cb830e0e8900b5d263defe2b6..185a45c174842b61454541822ce39e042babb4db 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 2e694cd9d7d7d77197543ba8ad7d9e097bf49f53..5a2911732d76f31bf3f53ea868ed8b5cc9c7e753 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 d32961040338efec217048c1017b84588b12d443..ac8c037a578f14b1afaeacfe31a5da2aaa295d42 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();