/*
* cl_video_stabilizer.h - Digital Video Stabilization using IMU (Gyroscope, Accelerometer)
*
* 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 <wei.zong@intel.com>
*/
#ifndef XCAM_CL_VIDEO_STABILIZER_H
#define XCAM_CL_VIDEO_STABILIZER_H
#include <xcam_std.h>
#include <meta_data.h>
#include <vec_mat.h>
#include <image_projector.h>
#include <ocl/cl_image_warp_handler.h>
namespace XCam {
class MotionFilter;
class ImageProjector;
class CLVideoStabilizer;
class CLImageWarpKernel;
class CLImageWarpHandler;
class CLVideoStabilizerKernel
: public CLImageWarpKernel
{
public:
explicit CLVideoStabilizerKernel (
const SmartPtr<CLContext> &context,
const char *name,
uint32_t channel,
SmartPtr<CLImageHandler> &handler);
private:
XCAM_DEAD_COPY (CLVideoStabilizerKernel);
SmartPtr<CLVideoStabilizer> _handler;
};
class CLVideoStabilizer
: public CLImageWarpHandler
{
typedef std::list<SmartPtr<VideoBuffer>> CLImageBufferList;
public:
explicit CLVideoStabilizer (
const SmartPtr<CLContext> &context,
const char *name = "CLVideoStabilizer");
virtual ~CLVideoStabilizer () {
_input_buf_list.clear ();
}
virtual SmartPtr<VideoBuffer> get_warp_input_buf ();
virtual bool is_ready ();
void reset_counter ();
XCamReturn set_sensor_calibration (CalibrationParams ¶ms);
XCamReturn set_camera_intrinsics (
double focal_x,
double focal_y,
double offset_x,
double offset_y,
double skew);
XCamReturn align_coordinate_system (
CoordinateSystemConv& world_to_device,
CoordinateSystemConv& device_to_image);
XCamReturn set_motion_filter (uint32_t radius, float stdev);
uint32_t filter_radius () const {
return _filter_radius;
};
Mat3d analyze_motion (
int64_t frame0_ts,
DevicePoseList pose0_list,
int64_t frame1_ts,
DevicePoseList pose1_list);
Mat3d stabilize_motion (int32_t stab_frame_id, std::list<Mat3d> &motions);
protected:
virtual XCamReturn prepare_parameters (SmartPtr<VideoBuffer> &input, SmartPtr<VideoBuffer> &output);
virtual XCamReturn execute_done (SmartPtr<VideoBuffer> &output);
private:
XCAM_DEAD_COPY (CLVideoStabilizer);
private:
Mat3d _intrinsics;
CalibrationParams _calib_params;
SmartPtr<ImageProjector> _projector;
SmartPtr<MotionFilter> _motion_filter;
CoordinateSystemConv _world_to_device;
CoordinateSystemConv _device_to_image;
int64_t _input_frame_id;
int64_t _frame_ts[2];
int64_t _stabilized_frame_id;
DevicePoseList _device_pose[2];
std::list<Mat3d> _motions; //motions[i] calculated from frame i to i+1
uint32_t _filter_radius;
CLImageBufferList _input_buf_list;
};
SmartPtr<CLImageHandler>
create_cl_video_stab_handler (const SmartPtr<CLContext> &context);
class MotionFilter
{
public:
MotionFilter (uint32_t radius = 15, float stdev = 10);
virtual ~MotionFilter ();
void set_filters (uint32_t radius, float stdev);
uint32_t radius () const {
return _radius;
};
float stdev () const {
return _stdev;
};
Mat3d stabilize (int32_t index,
std::list<Mat3d> &motions,
int32_t max);
protected:
Mat3d cumulate_motion (uint32_t index, uint32_t from, std::list<Mat3d> &motions);
private:
XCAM_DEAD_COPY (MotionFilter);
private:
int32_t _radius;
float _stdev;
std::vector<float> _weight;
};
}
#endif