/*********版权所有（C）2025，武汉高德红外股份有限公司***************************************
* 文件名称：Arith_FrontStitch.h
* 文件标识：前视拼接
* 内容摘要：
* 其它说明：
* 当前版本：V0.5
* 创建作者：04046wcw
* 创建日期：2025/02/17
* 包含关系：
*****************************************************************************************/
#pragma once

#ifndef _FRONTSTITCH_H
#define _FRONTSTITCH_H
#include "API_FrontStitch.h"
#include "Arith_GeoSolver.h"
#ifdef ENABLE_CUDA
#include <cuda_runtime.h>
#endif

#include "opencv2/opencv.hpp"
#include "Arith_BATask.h"
#include <map>
#include "Arith_FrontSolver.h"
#include "Arith_BlendMap.h"


class FrontStitch:public API_FrontStitch
{
public:
	FrontStitch(std::string cachedir = "./cache");
	~FrontStitch();

    // 初始化拼接
    FPanInfo		Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRange);

    // 运行前视拼接
    BYTE8       Run(GD_VIDEO_FRAME_S img, FrameInfo para);

    // 立即优化并输出当前全景图
    SINT32 OptAndOutCurrPan();

    // 获取全景图
    GD_VIDEO_FRAME_S ExportPanAddr();

private:
    // 极坐标快拼
    BYTE8 PoleStitch(GD_VIDEO_FRAME_S img, FrameInfo para);


    // 缓存接收帧
    SINT32 ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para);

    // 处理帧
    SINT32 ProcessFrame(vector<KeyType> keys);


private:
    GeoSolver* _GeoSolver;//外参计算

    FeatureMatcher* _FeaMatcher;//特征匹配

    BA_Task* _BATask;//BA

    FrontMapBlend* _FBlendTask;// 前视融合模块


    vector<KeyType> _recvFrameKey;// 接收帧总表
    std::map<KeyType, int> _recvFrameOptFlag;//接收帧的优化标记

    FileCache<FrameCache>* _cache;//文件缓存，存储外部传入的原始帧信息以及预处理结果

    int _totalFrameCnt;//处理帧计数

private:
    FPanInfo _panPara;//全景配置
    cv::Mat _panImage;
    cv::Mat _panMask; //覆盖区域遮罩
    // device mem
private:
    cuda_Mem _cuda_mem;

};

void UpdatePan_CPU(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat h_inv, FPanInfo _panPara, float dep);

#ifdef ENABLE_CUDA
void UpdatePan_CUDA(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat h_inv, FPanInfo _panPara, float dep, cuda_Mem cuda_resor);
#endif




#endif