|
|
|
@ -55,7 +55,7 @@ PanInfo VideoStitch::InitMap(FrameInfo info)
|
|
|
|
|
PanInfo panPara = { 0 };
|
|
|
|
|
panPara.m_pan_width = 1000;//全景宽
|
|
|
|
|
panPara.m_pan_height = 1000;//全景高
|
|
|
|
|
panPara.scale = 0.3;//比例尺,1m = ?pix
|
|
|
|
|
panPara.scale = 0.5;//比例尺,1m = ?pix
|
|
|
|
|
|
|
|
|
|
// 直接无平移解算
|
|
|
|
|
cv::Mat H_0 = getAffineFromGeo2Pan(panPara);
|
|
|
|
@ -82,7 +82,7 @@ PanInfo VideoStitch::Init(FrameInfo info)
|
|
|
|
|
{
|
|
|
|
|
_panPara = InitMap(info);
|
|
|
|
|
|
|
|
|
|
_pan = cv::Mat::zeros(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC1);
|
|
|
|
|
_panImage = cv::Mat::zeros(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC1);
|
|
|
|
|
|
|
|
|
|
return _panPara;
|
|
|
|
|
}
|
|
|
|
@ -149,7 +149,7 @@ BYTE8 VideoStitch::GeoStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
cv::Mat H = _H_pan * H1;
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
cv::Mat imagetmp(_pan.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
cv::Mat imagetmp(_panImage.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
|
|
|
|
|
cv::Mat src(img.u32Height, img.u32Width, CV_8UC1, img.u64VirAddr[0]);
|
|
|
|
|
|
|
|
|
@ -158,7 +158,7 @@ BYTE8 VideoStitch::GeoStitch(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
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);
|
|
|
|
|
imagetmp.copyTo(_panImage, warped_mask);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -192,7 +192,9 @@ SINT32 VideoStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
// 提取特征点
|
|
|
|
|
std::vector<cv::KeyPoint> keypoints;
|
|
|
|
|
cv::Mat descriptors;
|
|
|
|
|
_FeaMatcher->extractFeatures(cv::Mat(img.u32Height, img.u32Width,CV_8UC1, _t_frame_cache->_data), keypoints, descriptors);
|
|
|
|
|
|
|
|
|
|
cv::Mat src(img.u32Height, img.u32Width,CV_8UC1, _t_frame_cache->_data);
|
|
|
|
|
_FeaMatcher->extractFeatures(src, keypoints, descriptors);
|
|
|
|
|
|
|
|
|
|
size_t keyNum = MIN(keypoints.size(), FEA_NUM_MAX);
|
|
|
|
|
|
|
|
|
@ -213,6 +215,8 @@ SINT32 VideoStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para)
|
|
|
|
|
// 预处理结果加入文件缓存
|
|
|
|
|
_cache->set(para.nFrmID,_t_frame_cache);
|
|
|
|
|
|
|
|
|
|
_recvFrameKey.push_back(para.nFrmID);
|
|
|
|
|
|
|
|
|
|
_totalFrameCnt++;
|
|
|
|
|
|
|
|
|
|
return _totalFrameCnt;
|
|
|
|
@ -222,20 +226,21 @@ SINT32 VideoStitch::ProcessFrame()
|
|
|
|
|
{
|
|
|
|
|
vector<KeyType> vec;
|
|
|
|
|
|
|
|
|
|
for (size_t i = 10; i < 300; i+=10)
|
|
|
|
|
{
|
|
|
|
|
vec.push_back(i);
|
|
|
|
|
}
|
|
|
|
|
vector<KeyType> vec_opt;
|
|
|
|
|
|
|
|
|
|
_BATask->OptFrame(vec, _H_pan);
|
|
|
|
|
// 优化所有帧
|
|
|
|
|
_BATask->OptFrame(_recvFrameKey, _H_pan);
|
|
|
|
|
|
|
|
|
|
mapFrame(vec);
|
|
|
|
|
// 重投影所有帧到全景
|
|
|
|
|
mapFrame(_recvFrameKey);
|
|
|
|
|
|
|
|
|
|
return SINT32();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VideoStitch::mapFrame(vector<KeyType> frameInd)
|
|
|
|
|
{
|
|
|
|
|
_panImage.setTo(255);
|
|
|
|
|
|
|
|
|
|
// 从文件缓存获取帧
|
|
|
|
|
auto _t_frame_cache = std::make_shared<FrameCache>();
|
|
|
|
|
for (size_t i = 0; i < frameInd.size(); i++)
|
|
|
|
@ -255,7 +260,7 @@ void VideoStitch::mapFrame(vector<KeyType> frameInd)
|
|
|
|
|
cv::Mat H = _H_pan * H1;
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
cv::Mat imagetmp(_pan.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
cv::Mat imagetmp(_panImage.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,
|
|
|
|
@ -266,10 +271,7 @@ void VideoStitch::mapFrame(vector<KeyType> frameInd)
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
imagetmp.copyTo(_panImage, warped_mask);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -285,7 +287,7 @@ GD_VIDEO_FRAME_S VideoStitch::ExportPanAddr()
|
|
|
|
|
pan_out.enPixelFormat = GD_PIXEL_FORMAT_GRAY_Y8;
|
|
|
|
|
pan_out.u32Width = _panPara.m_pan_width;
|
|
|
|
|
pan_out.u32Height = _panPara.m_pan_height;
|
|
|
|
|
pan_out.u64VirAddr[0] = _pan.data;
|
|
|
|
|
pan_out.u64VirAddr[0] = _panImage.data;
|
|
|
|
|
|
|
|
|
|
return pan_out;
|
|
|
|
|
}
|
|
|
|
|