| /* |
| * 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 <[email protected]> |
| */ |
| |
| #ifndef XCAM_IMAGE_PROJECTIVE_2D_H |
| #define XCAM_IMAGE_PROJECTIVE_2D_H |
| |
| #include <xcam_std.h> |
| #include <meta_data.h> |
| #include <vec_mat.h> |
| #include <vector> |
| |
| 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<int64_t> &pose_ts, |
| const std::vector<Vec4d> &orientation, |
| const std::vector<Vec3d> &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<Vec4d> &orientation, |
| const std::vector<int64_t> &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 |