
/*********版权所有（C）2025，武汉高德红外股份有限公司***************************************
* 文件名称： Arith_ExtrinsicStitcher.h
* 文件标识：吊舱视频帧外参拼接
* 内容摘要：基于机载下视外部参数的几何校正,支持独立工作,也可以作为特征拼接的外参初始值
* 其它说明：
* 当前版本：V0.5
* 创建作者：04046wcw
* 创建日期：2025/01/15
* 包含关系：
*****************************************************************************************/
#pragma once
#include <opencv2/opencv.hpp>
#include "Arith_CommonDef.h"
#include "API_VideoStitch.h"


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


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

class ExtrinsicStitcher 
{
public:
    // 构造函数
    ExtrinsicStitcher();
	~ExtrinsicStitcher();

	// 初始化地理参数和全景图参数
    PanInfo InitMap(FrameInfo info);

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

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

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

public:


    // 帧像方-地理坐标
    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);


private:
    // 设置起始拼接点外参
    void SetOriginPoint(FrameInfo info);

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