/* * image_projector.h - Calculate 2D image projective matrix * * Copyright (c) 2017 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Author: Zong Wei */ #ifndef XCAM_IMAGE_PROJECTIVE_2D_H #define XCAM_IMAGE_PROJECTIVE_2D_H #include #include #include #include namespace XCam { struct CalibrationParams { double focal_x; //Focal length, x axis, in pixels double focal_y; //Focal length, y axis, in pixels double offset_x; //Principal point x coordinate on the image, in pixels double offset_y; //Principal point y coordinate on the image, in pixels double skew; //in case if the image coordinate axes u and v are not orthogonal to each other double readout_time; double gyro_delay; Vec4d gyro_drift; CalibrationParams () : focal_x (0) , focal_y (0) , offset_x (0) , offset_y (0) , skew (0) , readout_time (0) , gyro_delay (0) { gyro_drift.zeros(); } }; enum CoordinateAxisType { AXIS_X = 0, AXIS_MINUS_X, AXIS_Y, AXIS_MINUS_Y, AXIS_Z, AXIS_MINUS_Z, AXIS_NONE, }; struct CoordinateSystemConv { CoordinateAxisType axis_to_x; CoordinateAxisType axis_to_y; CoordinateAxisType axis_mirror; CoordinateSystemConv () { axis_to_x = AXIS_X; axis_to_y = AXIS_Y; axis_mirror = AXIS_NONE; } CoordinateSystemConv ( CoordinateAxisType to_x, CoordinateAxisType to_y, CoordinateAxisType mirror) { axis_to_x = to_x; axis_to_y = to_y; axis_mirror = mirror; } }; class ImageProjector { public: explicit ImageProjector () {}; explicit ImageProjector (CalibrationParams ¶ms); explicit ImageProjector ( double focal_x, double focal_y, double offset_x, double offset_y, double skew); virtual ~ImageProjector () {}; XCamReturn set_sensor_calibration (CalibrationParams ¶ms); XCamReturn set_camera_intrinsics ( double focal_x, double focal_y, double offset_x, double offset_y, double skew); Mat3d get_camera_intrinsics () { return _intrinsics; } Mat3d calc_camera_extrinsics ( const int64_t frame_ts, const std::vector &pose_ts, const std::vector &orientation, const std::vector &translation); Mat3d calc_camera_extrinsics ( const int64_t frame_ts, DevicePoseList &pose_list); Mat3d calc_projective ( Mat3d &extrinsic0, Mat3d &extrinsic1); Mat3d align_coordinate_system ( CoordinateSystemConv &world_to_device, Mat3d &extrinsics, CoordinateSystemConv &device_to_image); protected: Quaternd interp_orientation ( int64_t ts, const std::vector &orientation, const std::vector &orient_ts, int& index); Mat3d rotate_coordinate_system ( CoordinateAxisType axis_to_x, CoordinateAxisType axis_to_y); Mat3d mirror_coordinate_system (CoordinateAxisType axis_mirror); Mat3d transform_coordinate_system (CoordinateSystemConv &transform); private: XCAM_DEAD_COPY (ImageProjector); private: Mat3d _intrinsics; CalibrationParams _calib_params; }; } #endif //XCAM_IMAGE_PROJECTIVE_2D_H