|
|
|
@ -27,11 +27,11 @@ VideoStitch::VideoStitch(SINT32 nWidth, SINT32 nHeight)
|
|
|
|
|
|
|
|
|
|
_FeaMatcher = new FeatureMatcher(DetectorType::SIFT, MatcherType::FLANN);
|
|
|
|
|
|
|
|
|
|
_cache = new FileCache<FrameCache>(100,"./cache");
|
|
|
|
|
_cache = new FileCache<FrameCache>(50,"./cache");
|
|
|
|
|
|
|
|
|
|
_BATask = new BA_Task(_cache);
|
|
|
|
|
|
|
|
|
|
_fusionTask = new MapFusion(_cache);
|
|
|
|
|
_BlendTask = new MapBlend(_cache);
|
|
|
|
|
|
|
|
|
|
_panPara = { 0 };
|
|
|
|
|
|
|
|
|
@ -51,21 +51,28 @@ PanInfo VideoStitch::InitMap(FrameInfo info)
|
|
|
|
|
// 设置拼接原点
|
|
|
|
|
_GeoSolver->SetOriginPoint(info);
|
|
|
|
|
|
|
|
|
|
cv::Point2f ct_geo = warpPointWithH(_GeoSolver->findHomography(info), cv::Point2f(info.nWidth / 2, info.nHeight / 2));
|
|
|
|
|
cv::Mat H0 = _GeoSolver->findHomography(info);
|
|
|
|
|
|
|
|
|
|
cv::Point2f ct_geo = warpPointWithH(H0, cv::Point2f(info.nWidth / 2, info.nHeight / 2));// 视场中心的地理坐标
|
|
|
|
|
|
|
|
|
|
// 中心原始空间分辨率 P/m
|
|
|
|
|
double gsd = (info.nEvHeight * info.camInfo.fPixelSize) / (info.camInfo.nFocus * 1000);
|
|
|
|
|
|
|
|
|
|
// 全景图初始化
|
|
|
|
|
PanInfo panPara = { 0 };
|
|
|
|
|
panPara.m_pan_width = 1500;//全景宽
|
|
|
|
|
panPara.m_pan_height = 1500;//全景高
|
|
|
|
|
panPara.scale = 0.6;//比例尺,1m = ?pix
|
|
|
|
|
panPara.m_pan_width = MIN(info.nWidth * 5,5000);//全景宽
|
|
|
|
|
panPara.m_pan_height = MIN(info.nWidth * 5,5000);//全景高
|
|
|
|
|
panPara.scale = gsd / 2 ;//比例尺,1m = ?pix
|
|
|
|
|
|
|
|
|
|
int zoom = _googleProduct.getZoomLevel(panPara.scale);
|
|
|
|
|
|
|
|
|
|
// 直接无平移解算
|
|
|
|
|
cv::Mat H_0 = getAffineFromGeo2Pan(panPara);
|
|
|
|
|
auto cur = warpPointWithH(H_0, ct_geo);
|
|
|
|
|
|
|
|
|
|
// 计算平移到全景图固定点的平移量,从此处开始拼接
|
|
|
|
|
int planX = 500;
|
|
|
|
|
int planY = 500;
|
|
|
|
|
int planX = panPara.m_pan_width/2;
|
|
|
|
|
int planY = panPara.m_pan_height/2;
|
|
|
|
|
|
|
|
|
|
panPara.map_shiftX = planX - (cur.x);//平移X
|
|
|
|
|
panPara.map_shiftY = planY - (cur.y);//平移Y
|
|
|
|
@ -88,8 +95,6 @@ PanInfo VideoStitch::Init(FrameInfo info)
|
|
|
|
|
|
|
|
|
|
_panMask = cv::Mat::zeros(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC1);
|
|
|
|
|
|
|
|
|
|
//auto p1 = getBLHFromPan(cv::Point2f(7420, 2800), _H_pan);
|
|
|
|
|
//auto p2 = getPanXYFromBLH(p1, _H_pan);
|
|
|
|
|
|
|
|
|
|
return _panPara;
|
|
|
|
|
}
|
|
|
|
@ -166,7 +171,6 @@ BYTE8 VideoStitch::GeoStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
cv::Mat warped_mask;
|
|
|
|
|
cv::warpPerspective(mask, warped_mask, H, imagetmp.size(), cv::INTER_LINEAR);
|
|
|
|
|
imagetmp.copyTo(_panImage, warped_mask);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -240,15 +244,13 @@ SINT32 VideoStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
|
|
|
|
|
SINT32 VideoStitch::ProcessFrame()
|
|
|
|
|
{
|
|
|
|
|
vector<KeyType> vec;
|
|
|
|
|
|
|
|
|
|
vector<KeyType> vec_opt;
|
|
|
|
|
|
|
|
|
|
// 优化所有帧
|
|
|
|
|
//_BATask->OptFrame(_recvFrameKey, _H_pan);
|
|
|
|
|
_BATask->OptFrame(_recvFrameKey, _H_pan);
|
|
|
|
|
|
|
|
|
|
// 重投影所有帧到全景
|
|
|
|
|
_fusionTask->DirectMap(_recvFrameKey, _H_pan, _panImage,_panMask);
|
|
|
|
|
_BlendTask->DirectMap(_recvFrameKey, _H_pan, _panImage,_panMask);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@ -278,7 +280,7 @@ bool VideoStitch::ExportGeoPng(std::string dir, std::string name)
|
|
|
|
|
info.box.west = minL;
|
|
|
|
|
info.box.east = maxL;
|
|
|
|
|
info.tileName = name;
|
|
|
|
|
info.href = name + ".png";
|
|
|
|
|
info.href = name + "_pan.png";
|
|
|
|
|
|
|
|
|
|
// 输出谷歌地图产品
|
|
|
|
|
_googleProduct.ExportGeoPng(_panImage, info, dir);
|
|
|
|
@ -309,9 +311,9 @@ bool VideoStitch::ExportGoogleTile(std::string dir, std::string name)
|
|
|
|
|
info.box.south = minB;
|
|
|
|
|
info.box.west = minL;
|
|
|
|
|
info.box.east = maxL;
|
|
|
|
|
info.ind.z = 16;
|
|
|
|
|
info.ind.z = _googleProduct.getZoomLevel(_panPara.scale);
|
|
|
|
|
|
|
|
|
|
_googleProduct.ExportTile(_panImage, info, dir);
|
|
|
|
|
_googleProduct.ExportTile(_panImage, info, dir, name);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|