diff --git a/include/vision/sensor/sensor_camera.h b/include/vision/sensor/sensor_camera.h index 107ec7d06a0840d96d1baf86ec80bbd7adc2bb53..42c11f80164e02422415ea9fac20e724e8769dec 100644 --- a/include/vision/sensor/sensor_camera.h +++ b/include/vision/sensor/sensor_camera.h @@ -34,64 +34,89 @@ WOLF_STRUCT_PTR_TYPEDEFS(ParamsSensorCamera); */ struct ParamsSensorCamera : public ParamsSensorBase { - unsigned int width; ///< Image width in pixels - unsigned int height; ///< Image height in pixels + unsigned int width; ///< Image width in pixels + unsigned int height; ///< Image height in pixels + bool using_raw; ///< Use raw images? Eigen::Vector4d pinhole_model_raw; ///< k = [u_0, v_0, alpha_u, alpha_v] vector of pinhole intrinsic parameters Eigen::Vector4d pinhole_model_rectified;///< k = [u_0, v_0, alpha_u, alpha_v] vector of pinhole intrinsic parameters Eigen::VectorXd distortion; ///< d = [d_1, d_2, d_3, ...] radial distortion coefficients - ParamsSensorCamera() - { - //DEFINED FOR COMPATIBILITY PURPOSES. TO BE REMOVED IN THE FUTURE. - } + ParamsSensorCamera() : + width(0), + height(0), + using_raw(true) + { + // + }; + ParamsSensorCamera(std::string _unique_name, const ParamsServer& _server): ParamsSensorBase(_unique_name, _server) { - width = _server.getParam<unsigned int>(prefix + _unique_name + "/width"); - height = _server.getParam<unsigned int>(prefix + _unique_name + "/height"); - VectorXd distortion = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/distortion_coefficients/data"); - VectorXd intrinsic = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/camera_matrix/data"); - VectorXd projection = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/projection_matrix/data"); - - pinhole_model_raw[0] = intrinsic[2]; - pinhole_model_raw[1] = intrinsic[5]; - pinhole_model_raw[2] = intrinsic[0]; - pinhole_model_raw[3] = intrinsic[4]; - - pinhole_model_rectified[0] = projection[2]; - pinhole_model_rectified[1] = projection[6]; - pinhole_model_rectified[2] = projection[0]; - pinhole_model_rectified[3] = projection[5]; - - assert (distortion.size() == 5 && "Distortion size must be size 5!"); - - WOLF_WARN_COND( distortion(2) != 0 || distortion(3) != 0 , "Wolf does not handle tangential distortion. Please consider re-calibrating without tangential distortion!"); - - if (distortion(4) == 0) - if (distortion(1) == 0) - if (distortion(0) == 0) + width = _server.getParam<unsigned int>(prefix + _unique_name + "/width"); + height = _server.getParam<unsigned int>(prefix + _unique_name + "/height"); + using_raw = _server.getParam<bool> (prefix + _unique_name + "/using_raw"); + VectorXd distort = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/distortion_coefficients/data"); + VectorXd intrinsic = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/camera_matrix/data"); + VectorXd projection = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/projection_matrix/data"); + + /* Get raw params from K matrix in camera_info: + * + * | au 0 u0 | + * K = | 0 av v0 | + * | 0 0 1 | + */ + pinhole_model_raw[0] = intrinsic[2]; // u0 + pinhole_model_raw[1] = intrinsic[5]; // v0 + pinhole_model_raw[2] = intrinsic[0]; // au + pinhole_model_raw[3] = intrinsic[4]; // av + + /* Get rectified params from P matrix in camera_info: + * + * | au 0 u0 tx | + * P = | 0 av v0 ty | + * | 0 0 1 0 | + */ + pinhole_model_rectified[0] = projection[2]; // u0 + pinhole_model_rectified[1] = projection[6]; // v0 + pinhole_model_rectified[2] = projection[0]; // au + pinhole_model_rectified[3] = projection[5]; // av + + /* Get distortion params from vector D in camera_info: + * + * D = [ r1 r2 t1 t2 r3 ], with ri: dadial params; ti: tangential params + * + * NOTE: Wolf ignores tangential params!!! + */ + assert (distort.size() == 5 && "Distortion size must be size 5!"); + + WOLF_WARN_COND( distort(2) != 0 || distort(3) != 0 , "Wolf does not handle tangential distortion. Please consider re-calibrating without tangential distortion!"); + + if (distort(4) == 0) + if (distort(1) == 0) + if (distort(0) == 0) distortion.resize(0); else { distortion.resize(1); - distortion = distortion.head<1>(); + distortion = distort.head<1>(); } else { distortion.resize(2); - distortion = distortion.head<2>(); + distortion = distort.head<2>(); } else { distortion.resize(3); - distortion.head<2>() = distortion.head<2>(); - distortion.tail<1>() = distortion.tail<1>(); + distortion.head<2>() = distort.head<2>(); + distortion.tail<1>() = distort.tail<1>(); } } std::string print() const override { - return ParamsSensorBase::print() + "\n" + return ParamsSensorBase::print() + "\n" + "width: " + std::to_string(width) + "\n" + "height: " + std::to_string(height) + "\n" + + "using_raw: " + std::to_string(using_raw) + "\n" + "pinhole: " + converter<std::string>::convert(pinhole_model_raw) + "\n" + "pinhole rect.: " + converter<std::string>::convert(pinhole_model_rectified) + "\n" + "distortion: " + converter<std::string>::convert(distortion) + "\n"; @@ -115,16 +140,16 @@ class SensorCamera : public SensorBase Eigen::VectorXd getDistortionVector() { return distortion_; } Eigen::VectorXd getCorrectionVector() { return correction_; } Eigen::Matrix3d getIntrinsicMatrix() { return K_; } - Eigen::Vector4d getPinholeModel() { return pinhole_model_raw_; } + Eigen::Vector4d getPinholeModel() { if (using_raw_) return pinhole_model_raw_; else return pinhole_model_rectified_;} bool isUsingRawImages() { return using_raw_; } bool useRawImages(); bool useRectifiedImages(); - int getImgWidth(){return img_width_;} - int getImgHeight(){return img_height_;} - void setImgWidth(int _w){img_width_ = _w;} - void setImgHeight(int _h){img_height_ = _h;} + int getImgWidth() {return img_width_;} + int getImgHeight() {return img_height_;} + void setImgWidth(int _w) {img_width_ = _w;} + void setImgHeight(int _h) {img_height_ = _h;} private: int img_width_; diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp index 8c57c542eae854c48476ad4caf1023fc7bac1ec0..3ecb7d08418bc68bcc43990f53b0a313ac017076 100644 --- a/src/sensor/sensor_camera.cpp +++ b/src/sensor/sensor_camera.cpp @@ -41,10 +41,13 @@ SensorCamera::SensorCamera(const Eigen::VectorXd& _extrinsics, const ParamsSenso correction_(distortion_.size()==0 ? 0 : distortion_.size() + 1), // make correction vector slightly larger in size than the distortion vector pinhole_model_raw_(_intrinsics.pinhole_model_raw), // pinhole_model_rectified_(_intrinsics.pinhole_model_rectified), // - using_raw_(true) + using_raw_(_intrinsics.using_raw) { assert(_extrinsics.size() == 7 && "Wrong intrinsics vector size. Should be 7 for 3d"); - useRawImages(); + if (using_raw_) + useRawImages(); + else + useRectifiedImages(); pinhole::computeCorrectionModel(getIntrinsic()->getState(), distortion_, correction_); }