|
|
|
@ -2,6 +2,7 @@
|
|
|
|
|
#include "Arith_VideoStitch.h"
|
|
|
|
|
#include "Arith_Utils.h"
|
|
|
|
|
#include "Arith_CoordModule.h"
|
|
|
|
|
#include "Arith_FeaMatch.h"
|
|
|
|
|
#include <opencv2/opencv.hpp>
|
|
|
|
|
#include <omp.h>
|
|
|
|
|
|
|
|
|
@ -26,9 +27,13 @@ VideoStitch::VideoStitch(SINT32 nWidth, SINT32 nHeight)
|
|
|
|
|
|
|
|
|
|
_BATask = new BA_Task(_GeoSolver);
|
|
|
|
|
|
|
|
|
|
_cache = new FileCache(5,"./cache");
|
|
|
|
|
_FeaMatcher = new FeatureMatcher(DetectorType::SIFT, MatcherType::FLANN);
|
|
|
|
|
|
|
|
|
|
_cache = new FileCache<FrameCache>(50,"./cache");
|
|
|
|
|
|
|
|
|
|
_panPara = { 0 };
|
|
|
|
|
|
|
|
|
|
_totalFrameCnt = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VideoStitch::~VideoStitch()
|
|
|
|
@ -51,11 +56,11 @@ PanInfo VideoStitch::InitMap(FrameInfo info)
|
|
|
|
|
PanInfo panPara = { 0 };
|
|
|
|
|
panPara.m_pan_width = 1000;//全景宽
|
|
|
|
|
panPara.m_pan_height = 1000;//全景高
|
|
|
|
|
panPara.scale = 1;//比例尺,1m = ?pix
|
|
|
|
|
panPara.scale = 0.3;//比例尺,1m = ?pix
|
|
|
|
|
|
|
|
|
|
// 直接无平移解算
|
|
|
|
|
_H_pan = getAffineFromGeo2Pan(panPara);
|
|
|
|
|
auto cur = warpPointWithH(_H_pan, ct_geo);
|
|
|
|
|
cv::Mat H_0 = getAffineFromGeo2Pan(panPara);
|
|
|
|
|
auto cur = warpPointWithH(H_0, ct_geo);
|
|
|
|
|
|
|
|
|
|
// 计算平移到全景图固定点的平移量,从此处开始拼接
|
|
|
|
|
int planX = 200;
|
|
|
|
@ -64,20 +69,21 @@ PanInfo VideoStitch::InitMap(FrameInfo info)
|
|
|
|
|
panPara.map_shiftX = planX - (cur.x);//平移X
|
|
|
|
|
panPara.map_shiftY = planY - (cur.y);//平移Y
|
|
|
|
|
|
|
|
|
|
// 获取全景图的投影矩阵,全景图配置更新前保持不变
|
|
|
|
|
_H_pan = getAffineFromGeo2Pan(panPara);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return panPara;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void VideoStitch::Test()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PanInfo VideoStitch::Init(FrameInfo info)
|
|
|
|
|
{
|
|
|
|
|
_panPara = InitMap(info);
|
|
|
|
|
|
|
|
|
|
_BATask->setPanPara(_panPara);
|
|
|
|
|
//_BATask->setPanPara(_panPara);
|
|
|
|
|
|
|
|
|
|
_pan = cv::Mat::zeros(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC1);
|
|
|
|
|
|
|
|
|
@ -140,14 +146,10 @@ PanInfo VideoStitch::Init(FrameInfo info)
|
|
|
|
|
|
|
|
|
|
BYTE8 VideoStitch::GeoStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// uv2Geo H
|
|
|
|
|
cv::Mat H1 = _GeoSolver->findHomography(para);
|
|
|
|
|
|
|
|
|
|
// Geo2Pan H
|
|
|
|
|
cv::Mat H2 = getAffineFromGeo2Pan(_panPara);
|
|
|
|
|
|
|
|
|
|
cv::Mat H = H2 * H1;
|
|
|
|
|
cv::Mat H = _H_pan * H1;
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
cv::Mat imagetmp(_pan.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
@ -166,10 +168,7 @@ BYTE8 VideoStitch::GeoStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
|
|
|
|
|
SINT32 VideoStitch::BAStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
SINT32 nFrameCnt = _BATask->addFrame(img,para);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -180,10 +179,7 @@ SINT32 VideoStitch::BAOpt()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SINT32 VideoStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
{
|
|
|
|
|
cout << "recv:" << para.nFrmID << endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
// 构造单帧缓存
|
|
|
|
|
auto _t_frame_cache = std::make_shared<FrameCache>();
|
|
|
|
|
|
|
|
|
@ -204,12 +200,101 @@ SINT32 VideoStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
// 深拷贝图像数据
|
|
|
|
|
memcpy(_t_frame_cache->_data,img.u64VirAddr[0],imgSize);
|
|
|
|
|
|
|
|
|
|
// 加入文件缓存
|
|
|
|
|
// 提取特征点
|
|
|
|
|
std::vector<cv::KeyPoint> keypoints;
|
|
|
|
|
cv::Mat descriptors;
|
|
|
|
|
_FeaMatcher->extractFeatures(cv::Mat(img.u32Height, img.u32Width,CV_8UC1, _t_frame_cache->_data), keypoints, descriptors);
|
|
|
|
|
|
|
|
|
|
size_t keyNum = MIN(keypoints.size(), FEA_NUM_MAX);
|
|
|
|
|
// 保存特征点
|
|
|
|
|
memcpy(_t_frame_cache->_pt, keypoints.data(), sizeof(cv::KeyPoint) * keyNum);
|
|
|
|
|
|
|
|
|
|
// 保存描述子
|
|
|
|
|
memcpy(_t_frame_cache->_desp, descriptors.data, sizeof(float) * keyNum * FEA_DES_SIZE);
|
|
|
|
|
|
|
|
|
|
cv::Mat_<double> H0 = _GeoSolver->findHomography(para);
|
|
|
|
|
|
|
|
|
|
// 保存初始H
|
|
|
|
|
memcpy(_t_frame_cache->H, H0.data, sizeof(double) * 9);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 预处理结果加入文件缓存
|
|
|
|
|
_cache->set(para.nFrmID,_t_frame_cache);
|
|
|
|
|
|
|
|
|
|
_totalFrameCnt++;
|
|
|
|
|
|
|
|
|
|
return _totalFrameCnt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SINT32 VideoStitch::ProcessFrame()
|
|
|
|
|
{
|
|
|
|
|
vector<KeyType> vec;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vec.push_back(10);
|
|
|
|
|
vec.push_back(20);
|
|
|
|
|
//vec.push_back(50);
|
|
|
|
|
//vec.push_back(70);
|
|
|
|
|
vec.push_back(120);
|
|
|
|
|
vec.push_back(220);
|
|
|
|
|
//vec.push_back(320);
|
|
|
|
|
//vec.push_back(420);
|
|
|
|
|
//vec.push_back(520);
|
|
|
|
|
|
|
|
|
|
mapFrame(vec);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return SINT32();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VideoStitch::mapFrame(vector<KeyType> frameInd)
|
|
|
|
|
{
|
|
|
|
|
// 从文件缓存获取帧
|
|
|
|
|
auto _t_frame_cache = std::make_shared<FrameCache>();
|
|
|
|
|
for (size_t i = 0; i < frameInd.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
KeyType key = frameInd[i];
|
|
|
|
|
bool flag = _cache->get(key, _t_frame_cache);
|
|
|
|
|
|
|
|
|
|
if (!flag)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 读取当前H
|
|
|
|
|
cv::Mat H1 = cv::Mat(3,3,CV_64FC1,_t_frame_cache->H);
|
|
|
|
|
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
|
cv::Mat H = _H_pan * H1;
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
cv::Mat imagetmp(_pan.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
|
|
|
|
|
// 获取图像数据
|
|
|
|
|
cv::Mat src(_t_frame_cache->_frame_info.u32Height, _t_frame_cache->_frame_info.u32Width, CV_8UC1,
|
|
|
|
|
_t_frame_cache->_data);
|
|
|
|
|
|
|
|
|
|
cv::warpPerspective(src, imagetmp, H, imagetmp.size());
|
|
|
|
|
|
|
|
|
|
cv::Mat mask = cv::Mat::ones(src.size(), CV_8UC1) * 255;
|
|
|
|
|
cv::Mat warped_mask;
|
|
|
|
|
cv::warpPerspective(mask, warped_mask, H, imagetmp.size());
|
|
|
|
|
imagetmp.copyTo(_pan, warped_mask);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VideoStitch::OptFrame(vector<KeyType> frameInd)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GD_VIDEO_FRAME_S VideoStitch::ExportPanAddr()
|
|
|
|
|
{
|
|
|
|
|