diff --git a/applications/calibration-multi/src/main.cpp b/applications/calibration-multi/src/main.cpp index 7a89a400ae254fda9e611e6fcb4fe2baf2b975da..c45bb27cb552dd2fb557e7346f5cd3bbef3712ca 100644 --- a/applications/calibration-multi/src/main.cpp +++ b/applications/calibration-multi/src/main.cpp @@ -127,20 +127,25 @@ vector<Mat> getDistortionParametersRPC(ftl::net::Universe* net, ftl::stream::Net return net->call<vector<Mat>>(nstream->getPeer(), "get_distortion"); } -bool setRectifyRPC(ftl::net::Universe* net, ftl::stream::Net* nstream, bool enabled) { +bool setRectifyRPC( ftl::net::Universe* net, ftl::stream::Net* nstream, + bool enabled) { return net->call<bool>(nstream->getPeer(), "set_rectify", enabled); } -bool setIntrinsicsRPC(ftl::net::Universe* net, ftl::stream::Net* nstream, Size size, vector<Mat> K, vector<Mat> D) { +bool setIntrinsicsRPC( ftl::net::Universe* net, ftl::stream::Net* nstream, + const Size &size, const vector<Mat> &K, const vector<Mat> &D) { + return net->call<bool>(nstream->getPeer(), "set_intrinsics", size, K[0], D[0], K[1], D[1] ); } -bool setExtrinsicsRPC(ftl::net::Universe* net, ftl::stream::Net* nstream, Mat R, Mat t) { +bool setExtrinsicsRPC( ftl::net::Universe* net, ftl::stream::Net* nstream, + const Mat &R, const Mat &t) { return net->call<bool>(nstream->getPeer(), "set_extrinsics", R, t); } -bool setPoseRPC(ftl::net::Universe* net, ftl::stream::Net* nstream, Mat pose) { +bool setPoseRPC(ftl::net::Universe* net, ftl::stream::Net* nstream, + const Mat &pose) { return net->call<bool>(nstream->getPeer(), "set_pose", pose); } @@ -252,12 +257,14 @@ void runCameraCalibration( ftl::Configurable* root, ftl::stream::Receiver *gen = ftl::create<ftl::stream::Receiver>(root, "receiver"); gen->setStream(stream); auto stream_uris = net->findAll<std::string>("list_streams"); + std::sort(stream_uris.begin(), stream_uris.end()); std::vector<ftl::stream::Net*> nstreams; int count = 0; for (auto &s : stream_uris) { LOG(INFO) << " --- found stream: " << s; auto *nstream = ftl::create<ftl::stream::Net>(stream, std::to_string(count), net); + std::string name = *(nstream->get<std::string>("name")); nstream->set("uri", s); nstreams.push_back(nstream); stream->add(nstream); @@ -277,18 +284,47 @@ void runCameraCalibration( ftl::Configurable* root, gen->onFrameSet([stream, &mutex, &new_frames, &rgb_new, &camera_parameters, &res](ftl::rgbd::FrameSet &fs) { stream->select(fs.id, Channel::Left + Channel::Right); + if (fs.frames.size() != (rgb_new.size()/2)) { + // nstreams.size() == (rgb_new.size()/2) + LOG(ERROR) << "frames.size() != nstreams.size(), " + << fs.frames.size() << " != " << (rgb_new.size()/2); + } + UNIQUE_LOCK(mutex, CALLBACK); bool good = true; try { - for (size_t i = 0; i < fs.frames.size(); i ++) { + for (size_t i = 0; i < fs.frames.size(); i ++) { + if (!fs.frames[i].hasChannel(Channel::Left)) { + good = false; + LOG(ERROR) << "No left channel"; + break; + } + + if (!fs.frames[i].hasChannel(Channel::Right)) { + good = false; + LOG(ERROR) << "No right channel"; + break; + } + auto idx = stream->originStream(0, i); - if (idx < 0) { LOG(ERROR) << "negative index"; } + CHECK(idx >= 0) << "negative index"; + fs.frames[i].download(Channel::Left+Channel::Right); + Mat &left = fs.frames[i].get<Mat>(Channel::Left); + Mat &right = fs.frames[i].get<Mat>(Channel::Right); + + /* + // note: also returns empty sometimes + fs.frames[i].upload(Channel::Left+Channel::Right); + Mat left, right; + fs.frames[i].get<cv::cuda::GpuMat>(Channel::Left).download(left); + fs.frames[i].get<cv::cuda::GpuMat>(Channel::Right).download(right); + */ - //fs.frames[i].get<Mat>(Channel::Left).copyTo(rgb_new[2*i]); - //fs.frames[i].get<Mat>(Channel::Right).copyTo(rgb_new[2*i+1]); - cv::cvtColor(fs.frames[i].get<Mat>(Channel::Left), rgb_new[2*idx], cv::COLOR_BGRA2BGR); - cv::cvtColor(fs.frames[i].get<Mat>(Channel::Right), rgb_new[2*idx+1], cv::COLOR_BGRA2BGR); + CHECK(!left.empty() && !right.empty()); + + cv::cvtColor(left, rgb_new[2*idx], cv::COLOR_BGRA2BGR); + cv::cvtColor(right, rgb_new[2*idx+1], cv::COLOR_BGRA2BGR); camera_parameters[2*idx] = createCameraMatrix(fs.frames[i].getLeftCamera()); camera_parameters[2*idx+1] = createCameraMatrix(fs.frames[i].getRightCamera()); @@ -296,7 +332,11 @@ void runCameraCalibration( ftl::Configurable* root, } } catch (std::exception ex) { - LOG(ERROR) << ex.what(); + LOG(ERROR) << "exception: " << ex.what(); + good = false; + } + catch (...) { + LOG(ERROR) << "unknown exception"; good = false; } new_frames = good; @@ -305,7 +345,6 @@ void runCameraCalibration( ftl::Configurable* root, stream->begin(); ftl::timer::start(false); - sleep(5); while(true) { if (!res.empty()) { @@ -331,9 +370,6 @@ void runCameraCalibration( ftl::Configurable* root, } } } - - params.idx_cameras.resize(n_cameras); - std::iota(params.idx_cameras.begin(), params.idx_cameras.end(), 0); // TODO: parameter for calibration target type auto calib = MultiCameraCalibrationNew( n_cameras, reference_camera, @@ -347,7 +383,7 @@ void runCameraCalibration( ftl::Configurable* root, vector<vector<Point2d>> points(n_cameras); vector<Mat> rgb(n_cameras); - sleep(3); + sleep(3); // rectification disabled, has some delay while(calib.getMinVisibility() < n_views) { loop: @@ -404,10 +440,16 @@ void runCameraCalibration( ftl::Configurable* root, Point2i(rgb[i].size().width-150, 30), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.0, Scalar(64, 64, 255), 1); + // uri + cv::putText(rgb[i], + stream_uris[i/2], + Point2i(10, rgb[i].rows-10), + cv::FONT_HERSHEY_COMPLEX_SMALL, 1.0, Scalar(64, 64, 255), 1); + // remaining frames cv::putText(rgb[i], std::to_string(std::max(0, (int) (n_views - calib.getViewsCount(i)))), - Point2i(10, rgb[i].rows-10), + Point2i(rgb[i].size().width-150, rgb[i].rows-10), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.0, Scalar(64, 64, 255), 1); } diff --git a/applications/calibration-multi/src/multicalibrate.cpp b/applications/calibration-multi/src/multicalibrate.cpp index 40c7e0bb313a753d2a847b38fae3ad2b7d027dd7..071b6778d29fe1795621dc502244286ebab2637b 100644 --- a/applications/calibration-multi/src/multicalibrate.cpp +++ b/applications/calibration-multi/src/multicalibrate.cpp @@ -492,7 +492,7 @@ double MultiCameraCalibrationNew::calibratePair(size_t camera_from, size_t camer // vector<Point3d> points3d_triangulated; // points3d_triangulated.insert(points3d_triangulated.begin(), points3d.begin(), points3d.end()); - double err; + double err = INFINITY; cvsba::Sba sba; { sba.setParams(cvsba::Sba::Params(cvsba::Sba::TYPE::MOTIONSTRUCTURE, 200, 1.0e-30, 5, 5, false)); diff --git a/applications/calibration-multi/src/multicalibrate.hpp b/applications/calibration-multi/src/multicalibrate.hpp index 0168e107d69730e72bcd60790e550c19ca16439a..707e9d4e7739f81f969ed212685c7157f0166555 100644 --- a/applications/calibration-multi/src/multicalibrate.hpp +++ b/applications/calibration-multi/src/multicalibrate.hpp @@ -17,10 +17,11 @@ using std::pair; class CalibrationTarget { public: - CalibrationTarget(double length) : + explicit CalibrationTarget(double length): n_points(2), calibration_bar_length_(length) {} + /* @brief Estimate scale factor. * @param 3D points (can pass n views) */ diff --git a/applications/calibration-multi/src/visibility.cpp b/applications/calibration-multi/src/visibility.cpp index a4c16165b47decadfa9ca18ccf641a32b1cb16c1..256de5333450f062f760d7ff0309dfe04e800d1d 100644 --- a/applications/calibration-multi/src/visibility.cpp +++ b/applications/calibration-multi/src/visibility.cpp @@ -56,12 +56,10 @@ void Visibility::deleteEdge(int camera1, int camera2) } int Visibility::getMinVisibility() { - int min_i; int min_count = INT_MAX; for (int i = 0; i < n_cameras_; i++) { if (count_[i] < min_count) { - min_i = i; min_count = count_[i]; } } diff --git a/applications/calibration-multi/src/visibility.hpp b/applications/calibration-multi/src/visibility.hpp index 3521435dd62e2cd6eeea417f926b02f8049eb560..0ac8d3a802fc402a53ca16b78f6a733a6c7d77dc 100644 --- a/applications/calibration-multi/src/visibility.hpp +++ b/applications/calibration-multi/src/visibility.hpp @@ -8,14 +8,16 @@ using std::pair; class Visibility { public: - Visibility(int n_cameras); + explicit Visibility(int n_cameras); - /* @breif Update visibility graph. + /** + * @breif Update visibility graph. * @param Which cameras see the feature(s) in this iteration */ void update(vector<int> &visible); - /* @brief For all cameras, find shortest (optimal) paths to reference + /** + * @brief For all cameras, find shortest (optimal) paths to reference * camera * @param Id of reference camera * @@ -28,12 +30,20 @@ public: vector<int> getClosestCameras(int c); void deleteEdge(int camera1, int camera2); + int getOptimalCamera(); + + /** @brief Returns the smallest visibility count (any camera) + */ int getMinVisibility(); + + /** @brief Returns the visibility camera's value + */ int getViewsCount(int camera); protected: - /* @brief Find shortest path between nodes + /** + * @brief Find shortest path between nodes * @param Source node id * @param Destination node id */