// 全局BA
/*********版权所有（C）2025，武汉高德红外股份有限公司***************************************
* 文件名称： Arith_BAProc.h
* 文件标识：BA
* 内容摘要：光束平差
* 其它说明：
* 当前版本：V0.5
* 创建作者：04046wcw
* 创建日期：2025/01/15
* 包含关系：
*****************************************************************************************/

#pragma once

#include "FileCache.h"
#include "Arith_FeaMatch.h"


//#define SHOW_MATCH


class  BA_Task
{
public:
	BA_Task(FileCache<FrameCache>* cache);
	~BA_Task();

	// 初始化BA任务
	void InitTask();


	// 优化指定帧，并更新H到缓存中,H_map用于优化过程可视化
	void OptFrame(vector<KeyType> frameInd, cv::Mat H_map);

	// 更新缓存中的帧H矩阵，并存储
	bool updateCacheH(KeyType Key, cv::Mat H);




private:

	// 从缓存读取指定帧信息（不需要图像）
	int readFrameInfo(vector<KeyType> frameInd);

	// 输出优化结果到cache
	int writeFrameInfo();

	SINT32 CalMatchMat();//计算匹配性矩阵

	// 调试图像
	vector<cv::Mat> _imgVec;//图像缓存

	vector<KeyType> _frameInd;//帧索引,BA模块按照线性存储，完成后利用索引更新实际帧。注意传入的索引有可能是空的，需要处理


	FeatureMatcher* _FeaMatcher;//特征匹配


	FileCache<FrameCache>* _cache;

	Mat_<int> _MatchMat;//配准点邻接表
	Mat_<float> _IOUMat;//交汇邻接表

	vector<cv::Mat_<double>> _origMatrix;//初始H矩阵
	vector<cv::Mat_<double>> _currMatrix;//当前H矩阵


	vector<vector<cv::Point2f>> _polygon;//帧包围四边形
	vector<vector<cv::KeyPoint>> _FeaPtVec;//特征点缓存
	vector<cv::Mat> _FeaDespVec;//特征点描述子
	vector<FrameInfo> _paraVec;

private:

	// 调试：绘制匹配关系
	void drawMatch(int i, int j, std::vector<cv::DMatch> match,cv::Mat H_map);

};


void drawPolygons(cv::Mat& image, const std::vector<std::vector<cv::Point2f>>& polygons);