|
|
|
@ -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;
|
|
|
|
|