#include "API_VideoStitch.h"
#include "opencv2/opencv.hpp"


// 全景图配置
struct PanInfo
{
    int m_pan_width;
    int m_pan_height;
    float scale;// 比例尺
    float map_shiftX;// 平移X
    float map_shiftY;// 平移Y
};

// 像方-物方转换关系
struct TForm
{
    cv::Mat R;
    cv::Mat T;
};


// 投影关系,描述反算过程
struct Proj
{
	TForm tf_p2g;//从帧到地理坐标系的Rt矩阵
    TForm tf_g2p;//从地理坐标系到帧的Rt矩阵
	PanInfo panPara;//全景图配置
};

class VideoStitch:public API_VideoStitch 
{
public:
    VideoStitch(SINT32 nWidth, SINT32 nHeight);
    ~VideoStitch();

	void Test();


public:
    BBOOL Init(FrameInfo info);

    BYTE8 Updata(cv::Mat img, FrameInfo para);

    // 投影：从全景图到帧
    cv::Point2f project(cv::Point2f pos_pan, Proj m_Proj);

	// 反投影：从帧到全景图
    cv::Point2f back_project(cv::Point2f pos_frame, Proj m_Proj);

private:

    FrameInfo originPoint;//成图初始点，作为拼接参考

    // 帧像方-地理坐标
    cv::Point2f Trans_uv2Geo(cv::Point2f pos_frame, TForm form);

	// 地理坐标-帧像方
    cv::Point2f Trans_Geo2uv(cv::Point2f pos_geo, TForm form);

    // 从全景图->地理
	cv::Point2f Trans_pan2Geo(cv::Point2f pos_pan, PanInfo panPara);

	// 地理->全景图
    cv::Point2f Trans_Geo2pan(cv::Point2f pos_geo, PanInfo panPara);


    // 平移矩阵，以初始化点为基准，计算当前位置在初始点的地理坐标，那么当前帧所有点的坐标做此平移
    cv::Mat Mat_TransENGMove(FrameInfo info);

    // 机体ENG(东北地)到像方的 旋转矩阵
    cv::Mat Mat_TransENG2uv(FrameInfo info);

    // 计算当前帧像方-成图坐标系R t（反投影关系）
    void AnlayseTform(FrameInfo info);

private:

    Proj m_Proj;// 当前帧投影矩阵集合

    cv::Mat m_pan;//全景图


};