Skip to content
Snippets Groups Projects
calibrate.hpp 1.76 KiB
Newer Older
Nicolas Pope's avatar
Nicolas Pope committed
/*
 * Copyright 2019 Nicolas Pope
 */

#ifndef _FTL_CALIBRATION_HPP_
#define _FTL_CALIBRATION_HPP_

#include <opencv2/opencv.hpp>
Nicolas Pope's avatar
Nicolas Pope committed
#include "local.hpp"
#include <vector>
#include <nlohmann/json.hpp>
Nicolas Pope's avatar
Nicolas Pope committed
#include <ftl/rgbd/camera.hpp>

namespace cv {
class FileStorage;
class FileNode;
};
namespace rgbd {
namespace detail {
 * Manage local calibration details: undistortion, rectification and camera parameters.
 * Calibration parameters can be acquired using ftl-calibrate app.
Nicolas Pope's avatar
Nicolas Pope committed
class Calibrate : public ftl::Configurable {
	Calibrate(nlohmann::json &config, cv::Size image_size, cv::cuda::Stream &stream);
Nicolas Pope's avatar
Nicolas Pope committed
	/**
	 * Get both left and right images from local source, but with intrinsic
	 * and extrinsic stereo calibration already applied.
	 */
	bool rectified(cv::cuda::GpuMat &l, cv::cuda::GpuMat &r, cv::cuda::Stream &stream);
	/**
	 * Rectify and remove distortions from from images l and r using cv::remap()
	 */
	void rectifyStereo(cv::cuda::GpuMat &l, cv::cuda::GpuMat &r, cv::cuda::Stream &stream);
Nicolas Pope's avatar
Nicolas Pope committed
	bool isCalibrated();

	void updateCalibration(const ftl::rgbd::Camera &p);
Nicolas Pope's avatar
Nicolas Pope committed
	/**
	 * Get the camera matrix. Used to convert disparity map back to depth and
	 * a 3D point cloud.
	 */
	const cv::Mat &getQ() const { return Q_; }
	const cv::Mat &getCameraMatrix() const { return P_; }
Sebastian Hahta's avatar
Sebastian Hahta committed
	void _updateIntrinsics();
	bool _loadCalibration(cv::Size img_size, std::pair<cv::Mat, cv::Mat> &map1, std::pair<cv::Mat, cv::Mat> &map2);
	bool calibrated_;

	std::pair<cv::cuda::GpuMat, cv::cuda::GpuMat> map1_gpu_;
	std::pair<cv::cuda::GpuMat, cv::cuda::GpuMat> map2_gpu_;

	cv::Mat P_;
Nicolas Pope's avatar
Nicolas Pope committed
	cv::Mat R_, T_, R1_, P1_, R2_, P2_;
	cv::Mat M1_, D1_, M2_, D2_;
	cv::Size img_size_;