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

6 months ago
/*********版权所有C2025武汉高德红外股份有限公司***************************************
6 months ago
* Arith_GeoStitcher.h
6 months ago
*
* ,,
* 便--使
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();
// 建立全景图与归一化地理系的H矩阵解析出H
5 months ago
cv::Mat findHomography(FrameInfo info);
// 测试
cv::Mat findHomography2(FrameInfo info);
// 设置起始拼接点外参,返回当前光轴大地指向
ANGLE32F SetOriginPoint(FrameInfo info);
6 months ago
// 根据H计算原始像方的经纬度
PointBLH getBLHFromFrame(cv::Mat H, cv::Point2f ptInFrame);
// 计算局部地理系下目标的经纬度
PointBLH getBLHFromGeo(cv::Point2f ptInGeo);
// 经纬度转换为局部地理系坐标
cv::Point2f getGeoFromBLH(PointBLH ptPos);
5 months ago
private:
5 months ago
// 计算当前帧像方-地理坐标系R t反投影关系
Proj AnlayseTform(FrameInfo info);
6 months ago
// 帧像方-地理坐标
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:
5 months ago
PointXYZ originPoint;//成图初始点的地心地固坐标,作为拼接参考
FrameInfo origininfo;
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);
// 坐标系统转换
PointXYZ getNUEFromENG(PointXYZ p);
PointXYZ getENGFromNUE(PointXYZ p);