diff --git a/main.cpp b/main.cpp index 751e237..a4e7300 100644 --- a/main.cpp +++ b/main.cpp @@ -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) diff --git a/stitch/src/Arith_BATask.cpp b/stitch/src/Arith_BATask.cpp index 114109d..b5c6a51 100644 --- a/stitch/src/Arith_BATask.cpp +++ b/stitch/src/Arith_BATask.cpp @@ -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) diff --git a/stitch/src/Arith_BATask.h b/stitch/src/Arith_BATask.h index 50889f2..29c8d48 100644 --- a/stitch/src/Arith_BATask.h +++ b/stitch/src/Arith_BATask.h @@ -33,7 +33,6 @@ public: // 设置全景参数 void setPanPara(PanInfo info); - void Test(); // BA优化 void optimizeBA(cv::Mat H_pan); diff --git a/stitch/src/Arith_GeoSolver.cpp b/stitch/src/Arith_GeoSolver.cpp index cfb494b..4c7f5b1 100644 --- a/stitch/src/Arith_GeoSolver.cpp +++ b/stitch/src/Arith_GeoSolver.cpp @@ -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); -} diff --git a/stitch/src/Arith_GeoSolver.h b/stitch/src/Arith_GeoSolver.h index ce8617b..75a3ad7 100644 --- a/stitch/src/Arith_GeoSolver.h +++ b/stitch/src/Arith_GeoSolver.h @@ -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); diff --git a/stitch/src/Arith_VideoStitch.cpp b/stitch/src/Arith_VideoStitch.cpp index fc05887..726a8b5 100644 --- a/stitch/src/Arith_VideoStitch.cpp +++ b/stitch/src/Arith_VideoStitch.cpp @@ -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_(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; diff --git a/stitch/src/Arith_VideoStitch.h b/stitch/src/Arith_VideoStitch.h index 129496b..2dea4cb 100644 --- a/stitch/src/Arith_VideoStitch.h +++ b/stitch/src/Arith_VideoStitch.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);//计算全景图投影,从地理系到全景地图,统一计算