You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.7 KiB

6 months ago
/*********版权所有C2025武汉高德红外股份有限公司***************************************
6 months ago
* Arith_GeoStitcher.h
6 months ago
*
* ,,
*
* V0.5
* 04046wcw
* 2025/01/15
*
*****************************************************************************************/
#pragma once
6 months ago
#include "StitchStruct.h"
6 months ago
// 像方-物方转换关系
struct TForm
{
cv::Mat R;
cv::Mat T;
};
// 投影关系,描述反算过程
struct Proj
{
TForm tf_p2g;//从帧到地理坐标系的Rt矩阵
TForm tf_g2p;//从地理坐标系到帧的Rt矩阵
};
6 months ago
5 months ago
class GeoSolver
6 months ago
{
public:
// 构造函数
5 months ago
GeoSolver();
~GeoSolver();
6 months ago
// 投影:从全景图到帧
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反投影关系
6 months ago
Proj AnlayseTform(FrameInfo info);
6 months ago
// 建立H矩阵,经验证与上述反投影过程完全等效,该过程应该可以通过解析直接获得,此处不再深入研究
cv::Mat findHomography(Proj proj,PanInfo pan);
// 建立全景图与归一化地理系的H矩阵
cv::Mat findHomography(Proj proj);
5 months ago
// 设置起始拼接点外参
void SetOriginPoint(FrameInfo info);
6 months ago
5 months ago
public:
6 months ago
// 帧像方-地理坐标
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:
5 months ago
6 months ago
PointXYZ originPoint;//成图初始点的地心地固坐标,作为拼接参考
6 months ago
};
// 多边形面积
double polygonArea(const vector<cv::Point2f>& points);
// 计算两个四边形的 IOU
double computeQuadrilateralIOU(const vector<cv::Point2f>& quad1, const vector<cv::Point2f>& quad2);
6 months ago
// H映射点
cv::Point2f warpPointWithH(cv::Mat H,cv::Point2f srcPt);
// H映射多边形按照顺时针
vector<cv::Point2f> warpRectWithH(cv::Mat H,cv::Size size);