重构完成。

main
wangchongwu 5 months ago
parent b1b59a6e07
commit fdd364253d

@ -187,10 +187,10 @@ int main(int, char**)
<< std::endl;
// 基于地理系的拼接
stitcher->GeoStitch(frame,info);
//stitcher->GeoStitch(frame,info);
// 基于地理+BA拼接
//auto nNum = stitcher->BAStitch(frame,info);
auto nNum = stitcher->BAStitch(frame,info);
// test接口
//if (info.nFrmID == 30 || info.nFrmID == 40)

@ -120,10 +120,7 @@ void BA_Task::setPanPara(PanInfo info)
}
void BA_Task::Test()
{
}
//#define SHOW_MATCH
void BA_Task::optimizeBA(cv::Mat H_pan)

@ -33,7 +33,6 @@ public:
// 设置全景参数
void setPanPara(PanInfo info);
void Test();
// BA优化
void optimizeBA(cv::Mat H_pan);

@ -67,20 +67,7 @@ cv::Point2f GeoSolver::Trans_Geo2uv(cv::Point2f pos_geo, TForm form_inv)
return cv::Point2f(warpedX, warpedY);
}
cv::Point2f GeoSolver::Trans_pan2Geo(cv::Point2f pos_pan, PanInfo panPara)
{
double x = (pos_pan.x - panPara.map_shiftX) / panPara.scale;
double y = (panPara.m_pan_height - (pos_pan.y - panPara.map_shiftY)) / panPara.scale;
return cv::Point2f(x, y);
}
cv::Point2f GeoSolver::Trans_Geo2pan(cv::Point2f pos_geo, PanInfo panPara)
{
double pan_x = pos_geo.x * panPara.scale + panPara.map_shiftX;
double pan_y = (panPara.m_pan_height - pos_geo.y * panPara.scale) + panPara.map_shiftY;
return cv::Point2f(pan_x, pan_y);
}

@ -39,16 +39,13 @@ public:
GeoSolver();
~GeoSolver();
// 建立全景图与归一化地理系的H矩阵
cv::Mat findHomography(FrameInfo info);
// 设置起始拼接点外参
void SetOriginPoint(FrameInfo info);
public:
private:
// 计算当前帧像方-地理坐标系R t反投影关系
Proj AnlayseTform(FrameInfo info);
@ -58,11 +55,6 @@ public:
// 地理坐标-帧像方
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);

@ -22,16 +22,20 @@ void API_VideoStitch::Destroy(API_VideoStitch * obj)
VideoStitch::VideoStitch(SINT32 nWidth, SINT32 nHeight)
{
_GeoStitcher = new GeoSolver();
_GeoSolver = new GeoSolver();
_BATask = new BA_Task(_GeoStitcher);
_BATask = new BA_Task(_GeoSolver);
_cache = new FileCache(5,"./cache");
_panPara = { 0 };
}
VideoStitch::~VideoStitch()
{
delete _GeoStitcher;
delete _GeoSolver;
delete _BATask;
delete _cache;
}
@ -39,28 +43,19 @@ VideoStitch::~VideoStitch()
PanInfo VideoStitch::InitMap(FrameInfo info)
{
// 设置拼接原点
_GeoStitcher->SetOriginPoint(info);
// 转换关系计算
Proj t_Proj = _GeoStitcher->AnlayseTform(info);
_GeoSolver->SetOriginPoint(info);
// 帧中心的大地坐标,将其平移到全景图中心
cv::Point2f ct_geo = _GeoStitcher->Trans_uv2Geo(cv::Point2f(info.nWidth / 2, info.nHeight / 2), t_Proj.tf_p2g);
cv::Point2f ct_geo = warpPointWithH(_GeoSolver->findHomography(info), cv::Point2f(info.nWidth / 2, info.nHeight / 2));
// 全景图初始化
PanInfo panPara = { 0 };
panPara.m_pan_width = 1000;//全景宽
panPara.m_pan_height = 1000;//全景高
panPara.scale = 0.5;//比例尺,1m = ?pix
panPara.scale = 1;//比例尺,1m = ?pix
// 直接无平移解算
auto cur = _GeoStitcher->Trans_Geo2pan(ct_geo, panPara);
auto cur2 = warpPointWithH(getAffineFromGeo2Pan(panPara), cv::Point2f(info.nWidth / 2, info.nHeight / 2));
_H_pan = getAffineFromGeo2Pan(panPara);
auto cur = warpPointWithH(_H_pan, ct_geo);
// 计算平移到全景图固定点的平移量,从此处开始拼接
int planX = 200;
@ -147,7 +142,7 @@ BYTE8 VideoStitch::GeoStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
{
// uv2Geo H
cv::Mat H1 = _GeoStitcher->findHomography(para);
cv::Mat H1 = _GeoSolver->findHomography(para);
// Geo2Pan H
cv::Mat H2 = getAffineFromGeo2Pan(_panPara);
@ -209,22 +204,13 @@ SINT32 VideoStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para)
// 深拷贝图像数据
memcpy(_t_frame_cache->_data,img.u64VirAddr[0],imgSize);
// 加入文件缓存
_cache->set(para.nFrmID,_t_frame_cache);
return SINT32();
}
GD_VIDEO_FRAME_S VideoStitch::ExportPanAddr()
{
GD_VIDEO_FRAME_S pan_out;
@ -240,7 +226,7 @@ GD_VIDEO_FRAME_S VideoStitch::ExportPanAddr()
cv::Mat VideoStitch::getAffineFromGeo2Pan(PanInfo _pan)
{
Mat H = (Mat_<double>(3, 3) << _pan.scale, 0, _pan.map_shiftX,
0, -_pan.scale, _panPara.m_pan_height + _pan.map_shiftY,
0, -_pan.scale, _pan.m_pan_height + _pan.map_shiftY,
0, 0, 1
);
return H;

@ -36,7 +36,7 @@ private:
private:
GeoSolver* _GeoStitcher;//外参计算
GeoSolver* _GeoSolver;//外参计算
@ -44,6 +44,8 @@ private:
PanInfo _panPara;//全景图配置
cv::Mat _H_pan;//全景图投影矩阵:从地理系到全景地图
cv::Mat getAffineFromGeo2Pan(PanInfo _pan);//计算全景图投影,从地理系到全景地图,统一计算

Loading…
Cancel
Save