|
|
|
@ -15,11 +15,6 @@ MapBlend::MapBlend(FileCache<FrameCache>* cache, UPanInfo upan_info)
|
|
|
|
_panMask = cv::Mat::zeros(upan_info.m_pan_height, upan_info.m_pan_width, CV_8UC1);
|
|
|
|
_panMask = cv::Mat::zeros(upan_info.m_pan_height, upan_info.m_pan_width, CV_8UC1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 临时空间
|
|
|
|
|
|
|
|
_panTmp = cv::Mat(upan_info.m_pan_height, upan_info.m_pan_width, CV_8UC4, cv::Scalar(0, 0, 0, 0));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_maskTmp = cv::Mat::zeros(upan_info.m_pan_height, upan_info.m_pan_width, CV_8UC1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_upan_info = upan_info;
|
|
|
|
_upan_info = upan_info;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -38,19 +33,34 @@ cv::Mat MapBlend::getPanMaskMat()
|
|
|
|
return _panMask;
|
|
|
|
return _panMask;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 超大图幅的局部投影
|
|
|
|
|
|
|
|
void warpPerspectiveROI(const Mat& src, Mat& pano, const Mat& H, const cv::Rect& roi)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// 1. 修正H矩阵
|
|
|
|
|
|
|
|
Mat H_adj = H.clone();
|
|
|
|
|
|
|
|
H_adj.at<double>(0, 2) -= roi.x;
|
|
|
|
|
|
|
|
H_adj.at<double>(1, 2) -= roi.y;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 2. ROI视图
|
|
|
|
|
|
|
|
Mat pano_roi = pano(roi);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 局部warp
|
|
|
|
|
|
|
|
warpPerspective(src, pano_roi, H_adj, roi.size(),
|
|
|
|
|
|
|
|
cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void MapBlend::FrameMap(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE blendType)
|
|
|
|
void MapBlend::FrameMap(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE blendType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//return FrameMap_1(src, H_Geo, mapH);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
// 与全景图的H相乘
|
|
|
|
cv::Mat H = mapH * H_Geo;
|
|
|
|
cv::Mat H = mapH * H_Geo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算当前处理的全景图包围框
|
|
|
|
|
|
|
|
cv::Rect2f box = warpRectWithH_2Rect(H, src.size());
|
|
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
//cv::Mat imagetmp(_panImage.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
warpPerspectiveROI(src, _panImage, H, box);
|
|
|
|
_panTmp.setTo(0);
|
|
|
|
|
|
|
|
cv::warpPerspective(src, _panTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_TRANSPARENT);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1);
|
|
|
|
cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1);
|
|
|
|
|
|
|
|
|
|
|
|
@ -62,8 +72,10 @@ void MapBlend::FrameMap(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE ble
|
|
|
|
mask(cv::Rect(mask.cols - margin, margin, margin, mask.rows - 2 * margin)) = 0; // 右边
|
|
|
|
mask(cv::Rect(mask.cols - margin, margin, margin, mask.rows - 2 * margin)) = 0; // 右边
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_maskTmp.setTo(0);
|
|
|
|
// 当前帧的mask
|
|
|
|
cv::warpPerspective(mask, _maskTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0));
|
|
|
|
warpPerspectiveROI(mask, _panMask, H, box);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 收缩一圈消除虚线
|
|
|
|
// 收缩一圈消除虚线
|
|
|
|
//cv::erode(_maskTmp, _maskTmp,
|
|
|
|
//cv::erode(_maskTmp, _maskTmp,
|
|
|
|
@ -76,7 +88,7 @@ void MapBlend::FrameMap(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE ble
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (blendType == INCREASE)
|
|
|
|
else if (blendType == INCREASE)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_maskTmp = _maskTmp & (~_panMask); //只拷贝未覆盖区域
|
|
|
|
//_maskTmp = _maskTmp & (~_panMask); //只拷贝未覆盖区域
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (blendType == DIS_BLEND)
|
|
|
|
else if (blendType == DIS_BLEND)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -132,18 +144,12 @@ void MapBlend::FrameMap(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE ble
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//// 显示mask
|
|
|
|
////// 显示mask
|
|
|
|
//cv::Mat maskshow;
|
|
|
|
//cv::Mat maskshow;
|
|
|
|
//cv::resize(warped_mask, maskshow, cv::Size(warped_mask.rows / 8, warped_mask.cols / 8));
|
|
|
|
//cv::resize(_panMask, maskshow, cv::Size(_panMask.rows / 8, _panMask.cols / 8));
|
|
|
|
//imshow("warped_mask", maskshow *255);
|
|
|
|
//imshow("warped_mask", maskshow *255);
|
|
|
|
//cv::waitKey(1);
|
|
|
|
//cv::waitKey(1);
|
|
|
|
|
|
|
|
|
|
|
|
_panTmp.copyTo(_panImage, _maskTmp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 保存遮罩
|
|
|
|
|
|
|
|
_maskTmp.copyTo(_panMask, _maskTmp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#include <omp.h>
|
|
|
|
#include <omp.h>
|
|
|
|
void MapBlend::FrameMap_1(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH)
|
|
|
|
void MapBlend::FrameMap_1(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH)
|
|
|
|
@ -223,18 +229,20 @@ void MapBlend::BatchMap(vector<KeyType> frameInd, cv::Mat mapH, BLEND_TYPE blend
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取图像数据
|
|
|
|
|
|
|
|
cv::Mat src = getRGBAMatFromGDFrame(_t_frame_cache->_frame_info, _t_frame_cache->_data);
|
|
|
|
|
|
|
|
|
|
|
|
// 读取当前H
|
|
|
|
// 读取当前H
|
|
|
|
cv::Mat H1 = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H);
|
|
|
|
cv::Mat H1 = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H);
|
|
|
|
|
|
|
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
// 与全景图的H相乘
|
|
|
|
cv::Mat H = mapH * H1;
|
|
|
|
cv::Mat H = mapH * H1;
|
|
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
// 计算当前处理的全景图包围框
|
|
|
|
//cv::Mat imagetmp(_panImage.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
cv::Rect2f box = warpRectWithH_2Rect(H, src.size());
|
|
|
|
|
|
|
|
|
|
|
|
// 获取图像数据
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
cv::Mat src = getRGBAMatFromGDFrame(_t_frame_cache->_frame_info, _t_frame_cache->_data);
|
|
|
|
warpPerspectiveROI(src, _panImage, H, box);
|
|
|
|
cv::warpPerspective(src, _panTmp, H, _panTmp.size(), cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1);
|
|
|
|
cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1);
|
|
|
|
|
|
|
|
|
|
|
|
@ -245,17 +253,13 @@ void MapBlend::BatchMap(vector<KeyType> frameInd, cv::Mat mapH, BLEND_TYPE blend
|
|
|
|
mask(cv::Rect(0, margin, margin, mask.rows - 2 * margin)) = 0; // 左边
|
|
|
|
mask(cv::Rect(0, margin, margin, mask.rows - 2 * margin)) = 0; // 左边
|
|
|
|
mask(cv::Rect(mask.cols - margin, margin, margin, mask.rows - 2 * margin)) = 0; // 右边
|
|
|
|
mask(cv::Rect(mask.cols - margin, margin, margin, mask.rows - 2 * margin)) = 0; // 右边
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 当前帧的mask
|
|
|
|
cv::warpPerspective(mask, _maskTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0));
|
|
|
|
warpPerspectiveROI(mask, _panMask, H, box);
|
|
|
|
|
|
|
|
|
|
|
|
//// 收缩一圈消除虚线
|
|
|
|
//// 收缩一圈消除虚线
|
|
|
|
//cv::erode(warped_mask, warped_mask,
|
|
|
|
//cv::erode(warped_mask, warped_mask,
|
|
|
|
// cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
|
|
|
|
// cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
|
|
|
|
|
|
|
|
|
|
|
|
_panTmp.copyTo(_panImage, _maskTmp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 保存遮罩
|
|
|
|
|
|
|
|
_maskTmp.copyTo(_panMask, _maskTmp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//imshow("mask", pan_mask);
|
|
|
|
//imshow("mask", pan_mask);
|
|
|
|
//waitKey(1);
|
|
|
|
//waitKey(1);
|
|
|
|
|