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.

102 lines
2.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*********版权所有C2025武汉高德红外股份有限公司***************************************
* 文件名称: Arith_GeoStitcher.h
* 文件标识:吊舱视频帧外参拼接
* 内容摘要:基于机载下视外部参数的几何校正,支持独立工作,也可以作为特征拼接的外参初始值
* 其它说明:【注意:为了便于推导,局部地理坐标系采用的是东-北-地坐标系,使用大地坐标转换工具时注意转换。】
* 当前版本V0.5
* 创建作者04046wcw
* 创建日期2025/01/15
* 包含关系:
*****************************************************************************************/
#pragma once
#include "StitchStruct.h"
// 像方-物方转换关系
struct TForm
{
cv::Mat R;
cv::Mat T;
};
// 投影关系,描述反算过程
struct Proj
{
TForm tf_p2g;//从帧到地理坐标系的Rt矩阵
TForm tf_g2p;//从地理坐标系到帧的Rt矩阵
};
class GeoSolver
{
public:
// 构造函数
GeoSolver();
~GeoSolver();
// 建立全景图与归一化地理系的H矩阵解析出H
cv::Mat findHomography(FrameInfo info);
// 测试
cv::Mat findHomography2(FrameInfo info);
// 设置起始拼接点外参,返回当前光轴大地指向
ANGLE32F SetOriginPoint(FrameInfo info);
// 根据H计算原始像方的经纬度
PointBLH getBLHFromFrame(cv::Mat H, cv::Point2f ptInFrame);
// 计算局部地理系下目标的经纬度
PointBLH getBLHFromGeo(cv::Point2f ptInGeo);
// 经纬度转换为局部地理系坐标
cv::Point2f getGeoFromBLH(PointBLH ptPos);
private:
// 计算当前帧像方-地理坐标系R t反投影关系
Proj AnlayseTform(FrameInfo info);
// 帧像方-地理坐标
cv::Point2f Trans_uv2Geo(cv::Point2f pos_frame, TForm form);
// 地理坐标-帧像方
cv::Point2f Trans_Geo2uv(cv::Point2f pos_geo, TForm form);
// 平移矩阵,以初始化点为基准,计算当前位置在初始点的地理坐标,那么当前帧所有点的坐标做此平移
cv::Mat Mat_TransENGMove(FrameInfo info);
// 机体ENG(东北地)到像方的 旋转矩阵
cv::Mat Mat_TransENG2uv(FrameInfo info);
private:
PointXYZ originPoint;//成图初始点的地心地固坐标,作为拼接参考
FrameInfo origininfo;
};
// 多边形面积
double polygonArea(const vector<cv::Point2f>& points);
// 计算两个四边形的 IOU
double computeQuadrilateralIOU(const vector<cv::Point2f>& quad1, const vector<cv::Point2f>& quad2);
// H映射点
cv::Point2f warpPointWithH(cv::Mat H,cv::Point2f srcPt);
// H映射多边形按照顺时针
vector<cv::Point2f> warpRectWithH(cv::Mat H,cv::Size size);
// 坐标系统转换
PointXYZ getNUEFromENG(PointXYZ p);
PointXYZ getENGFromNUE(PointXYZ p);