diff --git a/components/rgbd-sources/src/calibrate.cpp b/components/rgbd-sources/src/calibrate.cpp index 17090992f36bebe355144e4ce714acf891005463..acc580e2aefdd63a3531e168e02b69c06aa855ca 100644 --- a/components/rgbd-sources/src/calibrate.cpp +++ b/components/rgbd-sources/src/calibrate.cpp @@ -53,7 +53,7 @@ Calibrate::Calibrate(nlohmann::json &config, cv::Size image_size, cv::cuda::Stre else { LOG(WARNING) << "Calibration not loaded"; } - + this->on("use_intrinsics", [this](const ftl::config::Event &e) { _updateIntrinsics(); }); @@ -70,7 +70,7 @@ bool Calibrate::_loadCalibration(cv::Size img_size, std::pair<Mat, Mat> &map1, s LOG(WARNING) << "Could not open intrinsics file"; return false; } - + LOG(INFO) << "Intrinsics from: " << *ifile; } else { @@ -82,7 +82,7 @@ bool Calibrate::_loadCalibration(cv::Size img_size, std::pair<Mat, Mat> &map1, s vector<Mat> K, D; fs["K"] >> K; fs["D"] >> D; - + K[0].copyTo(M1_); K[1].copyTo(M2_); D[0].copyTo(D1_); @@ -101,9 +101,10 @@ bool Calibrate::_loadCalibration(cv::Size img_size, std::pair<Mat, Mat> &map1, s LOG(WARNING) << "Could not open extrinsics file"; return false; } - + LOG(INFO) << "Extrinsics from: " << *efile; - } else { + } + else { LOG(WARNING) << "Calibration extrinsics file not found"; return false; } @@ -115,9 +116,26 @@ bool Calibrate::_loadCalibration(cv::Size img_size, std::pair<Mat, Mat> &map1, s fs["P1"] >> P1_; fs["P2"] >> P2_; fs["Q"] >> Q_; - img_size_ = img_size; + // TODO: normalize calibration + double scale_x = 1.0 / 1280.0; + double scale_y = 1.0 / 720.0; + + Mat scale(cv::Size(3, 3), CV_64F, 0.0); + scale.at<double>(0, 0) = (double) img_size.width * scale_x; + scale.at<double>(1, 1) = (double) img_size.height * scale_y; + scale.at<double>(2, 2) = 1.0; + + M1_ = scale * M1_; + M2_ = scale * M2_; + P1_ = scale * P1_; + P2_ = scale * P2_; + + Q_.at<double>(0, 3) = Q_.at<double>(3, 2) * (double) img_size.width * scale_x; + Q_.at<double>(1, 3) = Q_.at<double>(3, 2) * (double) img_size.height * scale_y; + Q_.at<double>(3, 3) = Q_.at<double>(3, 3) * (double) img_size.width * scale_x; + // cv::cuda::remap() works only with CV_32FC1 initUndistortRectifyMap(M1_, D1_, R1_, P1_, img_size_, CV_32FC1, map1.first, map2.first); initUndistortRectifyMap(M2_, D2_, R2_, P2_, img_size_, CV_32FC1, map1.second, map2.second); @@ -128,10 +146,10 @@ bool Calibrate::_loadCalibration(cv::Size img_size, std::pair<Mat, Mat> &map1, s void Calibrate::updateCalibration(const ftl::rgbd::Camera &p) { std::pair<Mat, Mat> map1, map2; - Q_.at<double>(3,2) = 1.0 / p.baseline; - Q_.at<double>(2,3) = p.fx; - Q_.at<double>(0,3) = p.cx; - Q_.at<double>(1,3) = p.cy; + Q_.at<double>(3, 2) = 1.0 / p.baseline; + Q_.at<double>(2, 3) = p.fx; + Q_.at<double>(0, 3) = p.cx; + Q_.at<double>(1, 3) = p.cy; // FIXME:(Nick) Update camera matrix also... _updateIntrinsics(); @@ -166,7 +184,7 @@ void Calibrate::_updateIntrinsics() { initUndistortRectifyMap(M1_, D1_, R1, P1, img_size_, CV_32FC1, map1.first, map2.first); initUndistortRectifyMap(M2_, D2_, R2, P2, img_size_, CV_32FC1, map1.second, map2.second); - + // CHECK Is this thread safe!!!! map1_gpu_.first.upload(map1.first); map1_gpu_.second.upload(map1.second); @@ -176,7 +194,7 @@ void Calibrate::_updateIntrinsics() { void Calibrate::rectifyStereo(GpuMat &l, GpuMat &r, Stream &stream) { // cv::cuda::remap() can not use same Mat for input and output - + GpuMat l_tmp(l.size(), l.type()); GpuMat r_tmp(r.size(), r.type()); cv::cuda::remap(l, l_tmp, map1_gpu_.first, map2_gpu_.first, cv::INTER_LINEAR, 0, cv::Scalar(), stream);