/* * 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 <feng.yuan@intel.com> * Author: Yinhang Liu <yinhangx.liu@intel.com> */ #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