| /* |
| * stitcher.h - stitcher interface |
| * |
| * 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: Wind Yuan <[email protected]> |
| * Author: Yinhang Liu <[email protected]> |
| */ |
| |
| #ifndef XCAM_INTERFACE_STITCHER_H |
| #define XCAM_INTERFACE_STITCHER_H |
| |
| #include <xcam_std.h> |
| #include <interface/data_types.h> |
| #include <vector> |
| #include <video_buffer.h> |
| |
| #define XCAM_STITCH_FISHEYE_MAX_NUM 6 |
| #define XCAM_STITCH_MAX_CAMERAS XCAM_STITCH_FISHEYE_MAX_NUM |
| #define XCAM_STITCH_MIN_SEAM_WIDTH 56 |
| |
| #define INVALID_INDEX (uint32_t)(-1) |
| |
| namespace XCam { |
| |
| enum StitchResMode { |
| StitchRes1080P, |
| StitchRes1080P4, |
| StitchRes4K |
| }; |
| |
| struct StitchInfo { |
| uint32_t merge_width[XCAM_STITCH_FISHEYE_MAX_NUM]; |
| |
| ImageCropInfo crop[XCAM_STITCH_FISHEYE_MAX_NUM]; |
| FisheyeInfo fisheye_info[XCAM_STITCH_FISHEYE_MAX_NUM]; |
| |
| StitchInfo () { |
| xcam_mem_clear (merge_width); |
| } |
| }; |
| |
| struct ImageMergeInfo { |
| Rect left; |
| Rect right; |
| }; |
| |
| class Stitcher; |
| |
| struct CalibrationInfo { |
| ExtrinsicParameter extrinsic; |
| IntrinsicParameter intrinsic; |
| }; |
| |
| struct CameraInfo { |
| CalibrationInfo calibration; |
| float round_angle_start; |
| float angle_range;; |
| }; |
| |
| class Stitcher |
| { |
| public: |
| struct RoundViewSlice { |
| float hori_angle_start; |
| float hori_angle_range; |
| uint32_t width; |
| uint32_t height; |
| |
| RoundViewSlice () |
| : hori_angle_start (0.0f), hori_angle_range (0.0f) |
| , width (0), height (0) |
| {} |
| }; |
| |
| struct CenterMark { |
| uint32_t slice_center_x; |
| uint32_t out_center_x; |
| CenterMark () |
| : slice_center_x (0) |
| , out_center_x (0) |
| {} |
| }; |
| |
| struct ScaleFactor { |
| float left_scale; |
| float right_scale; |
| |
| ScaleFactor () |
| : left_scale (1.0f) |
| , right_scale (1.0f) |
| {} |
| }; |
| |
| struct ImageOverlapInfo { |
| Rect left; |
| Rect right; |
| Rect out_area; |
| }; |
| |
| struct CopyArea { |
| uint32_t in_idx; |
| Rect in_area; |
| Rect out_area; |
| |
| CopyArea () |
| : in_idx (INVALID_INDEX) |
| {} |
| }; |
| typedef std::vector<CopyArea> CopyAreaArray; |
| |
| public: |
| explicit Stitcher (uint32_t align_x, uint32_t align_y = 1); |
| virtual ~Stitcher (); |
| static SmartPtr<Stitcher> create_ocl_stitcher (); |
| static SmartPtr<Stitcher> create_soft_stitcher (); |
| |
| bool set_bowl_config (const BowlDataConfig &config); |
| const BowlDataConfig &get_bowl_config () { |
| return _bowl_config; |
| } |
| bool set_camera_num (uint32_t num); |
| uint32_t get_camera_num () const { |
| return _camera_num; |
| } |
| bool set_camera_info (uint32_t index, const CameraInfo &info); |
| bool get_camera_info (uint32_t index, CameraInfo &info) const; |
| |
| bool set_crop_info (uint32_t index, const ImageCropInfo &info); |
| bool get_crop_info (uint32_t index, ImageCropInfo &info) const; |
| bool is_crop_info_set () const { |
| return _is_crop_set; |
| } |
| //bool set_overlap_info (uint32_t index, const ImageOverlapInfo &info); |
| bool is_overlap_info_set () const { |
| return _is_overlap_set; |
| } |
| |
| //bool set_stitch_info (const StitchInfo &stitch_info); |
| void set_output_size (uint32_t width, uint32_t height) { |
| _output_width = width; //XCAM_ALIGN_UP (width, XCAM_BLENDER_ALIGNED_WIDTH); |
| _output_height = height; |
| } |
| |
| void get_output_size (uint32_t &width, uint32_t &height) const { |
| width = _output_width; |
| height = _output_height; |
| } |
| virtual XCamReturn stitch_buffers (const VideoBufferList &in_bufs, SmartPtr<VideoBuffer> &out_buf) = 0; |
| |
| protected: |
| XCamReturn estimate_round_slices (); |
| virtual XCamReturn estimate_coarse_crops (); |
| XCamReturn mark_centers (); |
| XCamReturn estimate_overlap (); |
| XCamReturn update_copy_areas (); |
| |
| const CenterMark &get_center (uint32_t idx) const { |
| return _center_marks[idx]; |
| } |
| const RoundViewSlice &get_round_view_slice (uint32_t idx) const { |
| return _round_view_slices[idx]; |
| } |
| const ImageOverlapInfo &get_overlap (uint32_t idx) const { |
| return _overlap_info[idx]; |
| } |
| const ImageCropInfo &get_crop (uint32_t idx) const { |
| return _crop_info[idx]; |
| } |
| const CopyAreaArray &get_copy_area () const { |
| return _copy_areas; |
| } |
| |
| private: |
| XCAM_DEAD_COPY (Stitcher); |
| |
| protected: |
| ImageCropInfo _crop_info[XCAM_STITCH_MAX_CAMERAS]; |
| bool _is_crop_set; |
| //update after each feature match |
| ScaleFactor _scale_factors[XCAM_STITCH_MAX_CAMERAS]; |
| |
| private: |
| uint32_t _alignment_x, _alignment_y; |
| uint32_t _output_width, _output_height; |
| float _out_start_angle; |
| uint32_t _camera_num; |
| CameraInfo _camera_info[XCAM_STITCH_MAX_CAMERAS]; |
| RoundViewSlice _round_view_slices[XCAM_STITCH_MAX_CAMERAS]; |
| bool _is_round_view_set; |
| |
| ImageOverlapInfo _overlap_info[XCAM_STITCH_MAX_CAMERAS]; |
| BowlDataConfig _bowl_config; |
| bool _is_overlap_set; |
| |
| //auto calculation |
| CenterMark _center_marks[XCAM_STITCH_MAX_CAMERAS]; |
| bool _is_center_marked; |
| CopyAreaArray _copy_areas; |
| }; |
| |
| class BowlModel { |
| public: |
| typedef std::vector<PointFloat3> VertexMap; |
| typedef std::vector<PointFloat2> PointMap; |
| typedef std::vector<int32_t> IndexVector; |
| |
| public: |
| BowlModel (const BowlDataConfig &config, const uint32_t image_width, const uint32_t image_height); |
| bool get_max_topview_area_mm (float &length_mm, float &width_mm); |
| bool get_topview_rect_map ( |
| PointMap &texture_points, |
| uint32_t res_width, uint32_t res_height, |
| float length_mm = 0.0f, float width_mm = 0.0f); |
| |
| bool get_stitch_image_vertex_model ( |
| VertexMap &vertices, PointMap &texture_points, IndexVector &indeices, |
| uint32_t res_width, uint32_t res_height, float vertex_height); |
| |
| bool get_bowlview_vertex_model ( |
| VertexMap &vertices, PointMap &texture_points, IndexVector &indeices, |
| uint32_t res_width, uint32_t res_height); |
| |
| bool get_topview_vertex_model ( |
| VertexMap &vertices, PointMap &texture_points, IndexVector &indeices, |
| uint32_t res_width, uint32_t res_height); |
| |
| private: |
| BowlDataConfig _config; |
| uint32_t _bowl_img_width, _bowl_img_height; |
| float _max_topview_width_mm; |
| float _max_topview_length_mm; |
| }; |
| |
| } |
| |
| #endif //XCAM_INTERFACE_STITCHER_H |