|
|
|
|
@ -1,28 +1,56 @@
|
|
|
|
|
#include "Arith_BlendMap.h"
|
|
|
|
|
#include "Arith_Utils.h"
|
|
|
|
|
#include "Arith_FrontStitch.h"
|
|
|
|
|
|
|
|
|
|
#include "Arith_GeoSolver.h"
|
|
|
|
|
using std::max;
|
|
|
|
|
using std::min;
|
|
|
|
|
|
|
|
|
|
MapBlend::MapBlend(FileCache<FrameCache>* cache)
|
|
|
|
|
MapBlend::MapBlend(FileCache<FrameCache>* cache, UPanInfo upan_info)
|
|
|
|
|
{
|
|
|
|
|
_cache = cache;
|
|
|
|
|
|
|
|
|
|
// 创建底图
|
|
|
|
|
_panImage = cv::Mat(upan_info.m_pan_height, upan_info.m_pan_width, CV_8UC4, cv::Scalar(0, 0, 0, 0));
|
|
|
|
|
|
|
|
|
|
// 创建覆盖标记mask
|
|
|
|
|
_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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MapBlend::~MapBlend()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MapBlend::MapFrame(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask)
|
|
|
|
|
cv::Mat MapBlend::getPanImageMat()
|
|
|
|
|
{
|
|
|
|
|
return _panImage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cv::Mat MapBlend::getPanMaskMat()
|
|
|
|
|
{
|
|
|
|
|
return _panMask;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void MapBlend::FrameMap(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE blendType)
|
|
|
|
|
{
|
|
|
|
|
//return FrameMap_1(src, H_Geo, mapH);
|
|
|
|
|
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
|
cv::Mat H = mapH * H_Geo;
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
cv::Mat imagetmp(pan.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
|
|
|
|
|
cv::warpPerspective(src, imagetmp, H, imagetmp.size(), cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
|
|
|
|
|
//cv::Mat imagetmp(_panImage.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
_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);
|
|
|
|
|
|
|
|
|
|
@ -34,97 +62,155 @@ void MapBlend::MapFrame(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH, cv::Mat pan, c
|
|
|
|
|
mask(cv::Rect(mask.cols - margin, margin, margin, mask.rows - 2 * margin)) = 0; // 右边
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::Mat warped_mask;
|
|
|
|
|
cv::warpPerspective(mask, warped_mask, H, imagetmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0));
|
|
|
|
|
_maskTmp.setTo(0);
|
|
|
|
|
cv::warpPerspective(mask, _maskTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0));
|
|
|
|
|
|
|
|
|
|
// 收缩一圈消除虚线
|
|
|
|
|
//cv::erode(warped_mask, warped_mask,
|
|
|
|
|
//cv::erode(_maskTmp, _maskTmp,
|
|
|
|
|
// cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
|
|
|
|
|
blendType = DIRECT;
|
|
|
|
|
// 增量拼接
|
|
|
|
|
if (blendType == DIRECT)
|
|
|
|
|
{
|
|
|
|
|
//
|
|
|
|
|
}
|
|
|
|
|
else if (blendType == INCREASE)
|
|
|
|
|
{
|
|
|
|
|
_maskTmp = _maskTmp & (~_panMask); //只拷贝未覆盖区域
|
|
|
|
|
}
|
|
|
|
|
else if (blendType == DIS_BLEND)
|
|
|
|
|
{
|
|
|
|
|
//cv::Mat dist1, dist2;
|
|
|
|
|
//cv::distanceTransform(_maskTmp, dist1, cv::DIST_L2, 3); //当前帧
|
|
|
|
|
//cv::distanceTransform(_panMask, dist2, cv::DIST_L2, 3); //底图
|
|
|
|
|
//dist1.convertTo(dist1, CV_32FC1);
|
|
|
|
|
//dist2.convertTo(dist2, CV_32FC1);
|
|
|
|
|
|
|
|
|
|
//// 限制最大距离,比如只在 30 像素内有效
|
|
|
|
|
//double maxDist = 30.0;
|
|
|
|
|
//dist1 = cv::min(dist1, maxDist);
|
|
|
|
|
//dist2 = cv::min(dist1, maxDist);
|
|
|
|
|
|
|
|
|
|
imagetmp.copyTo(pan, warped_mask);
|
|
|
|
|
//// 归一化到 0~1 之间(越靠近边界权重越小)
|
|
|
|
|
//cv::normalize(dist1, dist1, 0.0, 1.0, cv::NORM_MINMAX);
|
|
|
|
|
//cv::normalize(dist2, dist2, 0.0, 1.0, cv::NORM_MINMAX);
|
|
|
|
|
|
|
|
|
|
// 保存遮罩
|
|
|
|
|
warped_mask.copyTo(pan_mask, warped_mask);
|
|
|
|
|
}
|
|
|
|
|
//cv::Mat weight1 = dist1 / (dist1 + dist2 + 1e-6);
|
|
|
|
|
//cv::Mat weight2 = 1.0f - weight1;
|
|
|
|
|
|
|
|
|
|
void MapBlend::DirectMap(vector<KeyType> frameInd, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask)
|
|
|
|
|
{
|
|
|
|
|
// 从文件缓存获取帧
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
//cv::Mat img1f, img2f;
|
|
|
|
|
//_panTmp.convertTo(img1f, CV_32FC4, 1.0 / 255.0);
|
|
|
|
|
//_panImage.convertTo(img2f, CV_32FC4, 1.0 / 255.0);
|
|
|
|
|
|
|
|
|
|
// 读取当前H
|
|
|
|
|
cv::Mat H1 = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H);
|
|
|
|
|
//std::vector<cv::Mat> c1, c2;
|
|
|
|
|
//cv::split(img1f, c1);
|
|
|
|
|
//cv::split(img2f, c2);
|
|
|
|
|
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
|
cv::Mat H = mapH * H1;
|
|
|
|
|
//for (int i = 0; i < 4; ++i) {
|
|
|
|
|
// c1[i] = c1[i].mul(weight1) + c2[i].mul(weight2);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
cv::Mat imagetmp(pan.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
//cv::Mat blended;
|
|
|
|
|
//cv::merge(c1, blended);
|
|
|
|
|
//blended.convertTo(blended, CV_8UC4, 255.0);
|
|
|
|
|
|
|
|
|
|
// 获取图像数据
|
|
|
|
|
cv::Mat src = getRGBAMatFromGDFrame(_t_frame_cache->_frame_info, _t_frame_cache->_data);
|
|
|
|
|
cv::warpPerspective(src, imagetmp, H, imagetmp.size(), cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
|
|
|
|
|
|
|
|
|
|
cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1);
|
|
|
|
|
//cv::Mat blended_show;
|
|
|
|
|
//cv::resize(blended, blended_show, cv::Size(weight1.rows / 8, weight1.cols / 8));
|
|
|
|
|
//imshow("blended", blended_show);
|
|
|
|
|
//cv::waitKey(1);
|
|
|
|
|
|
|
|
|
|
// 设置上下左右边缘区域为 0
|
|
|
|
|
int margin = 5; // 可根据实际需求调整,5 像素作为边缘区域
|
|
|
|
|
mask(cv::Rect(0, 0, mask.cols, margin)) = 0; // 上边
|
|
|
|
|
mask(cv::Rect(0, mask.rows - margin, mask.cols, 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; // 右边
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::Mat warped_mask;
|
|
|
|
|
cv::warpPerspective(mask, warped_mask, H, imagetmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0));
|
|
|
|
|
//cv::Mat disshow;
|
|
|
|
|
//cv::resize(dis, disshow, cv::Size(warped_mask.rows / 8, warped_mask.cols / 8));
|
|
|
|
|
//
|
|
|
|
|
//imshow("dis", disshow);
|
|
|
|
|
//cv::waitKey(1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//// 收缩一圈消除虚线
|
|
|
|
|
//cv::erode(warped_mask, warped_mask,
|
|
|
|
|
// cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
imagetmp.copyTo(pan, warped_mask);
|
|
|
|
|
//// 显示mask
|
|
|
|
|
//cv::Mat maskshow;
|
|
|
|
|
//cv::resize(warped_mask, maskshow, cv::Size(warped_mask.rows / 8, warped_mask.cols / 8));
|
|
|
|
|
//imshow("warped_mask", maskshow *255);
|
|
|
|
|
//cv::waitKey(1);
|
|
|
|
|
|
|
|
|
|
_panTmp.copyTo(_panImage, _maskTmp);
|
|
|
|
|
|
|
|
|
|
// 保存遮罩
|
|
|
|
|
warped_mask.copyTo(pan_mask, warped_mask);
|
|
|
|
|
_maskTmp.copyTo(_panMask, _maskTmp);
|
|
|
|
|
|
|
|
|
|
//imshow("mask", pan_mask);
|
|
|
|
|
//waitKey(1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#include <omp.h>
|
|
|
|
|
void MapBlend::FrameMap_1(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH)
|
|
|
|
|
{
|
|
|
|
|
//#pragma omp parallel
|
|
|
|
|
// {
|
|
|
|
|
// printf("Thread %d of %d\n",
|
|
|
|
|
// omp_get_thread_num(), omp_get_num_threads());
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
|
cv::Mat H = mapH * H_Geo;
|
|
|
|
|
|
|
|
|
|
void MapBlend::BlendMap(vector<KeyType> frameInd, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
cv::Point2f leftTop_map = warpPointWithH(H,cv::Point2f(0,0));
|
|
|
|
|
cv::Point2f rightTop_map = warpPointWithH(H,cv::Point2f(src.cols,0));
|
|
|
|
|
cv::Point2f rightBottom_map = warpPointWithH(H,cv::Point2f(src.cols,src.rows));
|
|
|
|
|
cv::Point2f leftBottom_map = warpPointWithH(H,cv::Point2f(0,src.rows));
|
|
|
|
|
|
|
|
|
|
// 计算全景图的范围
|
|
|
|
|
int right = max(max(max(leftTop_map.x, leftBottom_map.x), rightTop_map.x), rightBottom_map.x);
|
|
|
|
|
int left = min(min(min(leftTop_map.x, leftBottom_map.x), rightTop_map.x), rightBottom_map.x);
|
|
|
|
|
int top = min(min(min(leftTop_map.y, leftBottom_map.y), rightTop_map.y), rightBottom_map.y);
|
|
|
|
|
int bottom = max(max(max(leftTop_map.y, leftBottom_map.y), rightTop_map.y), rightBottom_map.y);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FrontMapBlend::FrontMapBlend(FileCache<FrameCache>* cache)
|
|
|
|
|
{
|
|
|
|
|
_cache = cache;
|
|
|
|
|
}
|
|
|
|
|
int xRange = right - left;
|
|
|
|
|
int yRnage = bottom - top;
|
|
|
|
|
|
|
|
|
|
//反映射到像素坐标
|
|
|
|
|
int valid_top = std::max(0, top);
|
|
|
|
|
int valid_bottom = std::min(_panImage.rows, bottom);
|
|
|
|
|
int valid_left = std::max(0, left);
|
|
|
|
|
int valid_right = std::min(_panImage.cols, right);
|
|
|
|
|
|
|
|
|
|
cv::Mat H_inv = H.inv();
|
|
|
|
|
|
|
|
|
|
#pragma omp parallel for
|
|
|
|
|
for (int i = valid_top; i < valid_bottom; i++)
|
|
|
|
|
{
|
|
|
|
|
uchar* row = _panImage.ptr<uchar>(i);
|
|
|
|
|
for (int j = valid_left; j < valid_right; j++)
|
|
|
|
|
{
|
|
|
|
|
//转换为pixel坐标
|
|
|
|
|
auto p_img = warpPointWithH(H_inv,Point2f(j, i));
|
|
|
|
|
|
|
|
|
|
if (p_img.x >= 0 && p_img.y >= 0 && p_img.x < src.cols && p_img.y < src.rows)
|
|
|
|
|
{
|
|
|
|
|
auto rgbVal = Interpolation_RGBA32(src.data, src.cols, src.rows, p_img.x, p_img.y);
|
|
|
|
|
|
|
|
|
|
row[4 * j + 0] = rgbVal.R;
|
|
|
|
|
row[4 * j + 1] = rgbVal.G;
|
|
|
|
|
row[4 * j + 2] = rgbVal.B;
|
|
|
|
|
row[4 * j + 3] = rgbVal.A;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
FrontMapBlend::~FrontMapBlend()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FrontMapBlend::DirectMap(vector<KeyType> frameInd, FPanInfo _panPara, cv::Mat _panImage, cv::Mat pan_mask, cuda_Mem cuda_resor)
|
|
|
|
|
void MapBlend::BatchMap(vector<KeyType> frameInd, cv::Mat mapH, BLEND_TYPE blendType)
|
|
|
|
|
{
|
|
|
|
|
_panImage.setTo(0);
|
|
|
|
|
|
|
|
|
|
// 从文件缓存获取帧
|
|
|
|
|
auto _t_frame_cache = std::make_shared<FrameCache>();
|
|
|
|
|
for (size_t i = 0; i < frameInd.size(); i++)
|
|
|
|
|
@ -138,71 +224,47 @@ void FrontMapBlend::DirectMap(vector<KeyType> frameInd, FPanInfo _panPara, cv::M
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 读取当前H
|
|
|
|
|
cv::Mat H = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H);
|
|
|
|
|
|
|
|
|
|
auto info = _t_frame_cache->_para;
|
|
|
|
|
cv::Mat H1 = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H);
|
|
|
|
|
|
|
|
|
|
float dep = info.nEvHeight;
|
|
|
|
|
// 与全景图的H相乘
|
|
|
|
|
cv::Mat H = mapH * H1;
|
|
|
|
|
|
|
|
|
|
GD_VIDEO_FRAME_S img = _t_frame_cache->_frame_info;
|
|
|
|
|
// 利用H投影当前帧到全景
|
|
|
|
|
//cv::Mat imagetmp(_panImage.size(), CV_8UC3, cv::Scalar(0, 0, 0));
|
|
|
|
|
|
|
|
|
|
// 获取图像数据
|
|
|
|
|
cv::Mat rgb = getRGBMatFromGDFrame(_t_frame_cache->_frame_info, _t_frame_cache->_data);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Pole CT_map = getPoleFromImgWithH(H, cv::Point2f(img.u32Width/2, img.u32Height/2), info.nEvHeight);
|
|
|
|
|
cv::Mat src = getRGBAMatFromGDFrame(_t_frame_cache->_frame_info, _t_frame_cache->_data);
|
|
|
|
|
cv::warpPerspective(src, _panTmp, H, _panTmp.size(), cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
|
|
|
|
|
|
|
|
|
|
// 计算帧的map四至,注意这里不是线性变化,不能完全保证四至约束下的原图能完全覆盖,即反采样后图像可能不完整
|
|
|
|
|
Pole leftTop_map = getPoleFromImgWithH(H, cv::Point2f(0, 0), info.nEvHeight);
|
|
|
|
|
Pole rightTop_map = getPoleFromImgWithH(H, cv::Point2f(img.u32Width, 0), info.nEvHeight);
|
|
|
|
|
Pole rightBottom_map = getPoleFromImgWithH(H, cv::Point2f(img.u32Width, img.u32Height), info.nEvHeight);
|
|
|
|
|
Pole leftBottom_map = getPoleFromImgWithH(H, cv::Point2f(0, img.u32Height), info.nEvHeight);
|
|
|
|
|
cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1);
|
|
|
|
|
|
|
|
|
|
//leftTop_map.beta = DEGLIM360(leftTop_map.beta);
|
|
|
|
|
//rightTop_map.beta = DEGLIM360(rightTop_map.beta);
|
|
|
|
|
//rightBottom_map.beta = DEGLIM360(rightBottom_map.beta);
|
|
|
|
|
//leftBottom_map.beta = DEGLIM360(leftBottom_map.beta);
|
|
|
|
|
// 设置上下左右边缘区域为 0
|
|
|
|
|
int margin = 5; // 可根据实际需求调整,5 像素作为边缘区域
|
|
|
|
|
mask(cv::Rect(0, 0, mask.cols, margin)) = 0; // 上边
|
|
|
|
|
mask(cv::Rect(0, mask.rows - margin, mask.cols, 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; // 右边
|
|
|
|
|
|
|
|
|
|
// 转全景图的像方
|
|
|
|
|
cv::Point2f p_leftTop_map = getFPanFromPole(leftTop_map, _panPara);
|
|
|
|
|
cv::Point2f p_rightTop_map = getFPanFromPole(rightTop_map, _panPara);
|
|
|
|
|
cv::Point2f p_rightBottom_map = getFPanFromPole(rightBottom_map, _panPara);
|
|
|
|
|
cv::Point2f p_leftBottom_map = getFPanFromPole(leftBottom_map, _panPara);
|
|
|
|
|
|
|
|
|
|
// 计算全景图上范围
|
|
|
|
|
int right = max(max(max(p_leftTop_map.x, p_rightTop_map.x), p_rightBottom_map.x), p_leftBottom_map.x);
|
|
|
|
|
int left = min(min(min(p_leftTop_map.x, p_rightTop_map.x), p_rightBottom_map.x), p_leftBottom_map.x);
|
|
|
|
|
int top = min(min(min(p_leftTop_map.y, p_rightTop_map.y), p_rightBottom_map.y), p_leftBottom_map.y);
|
|
|
|
|
int bottom = max(max(max(p_leftTop_map.y, p_rightTop_map.y), p_rightBottom_map.y), p_leftBottom_map.y);
|
|
|
|
|
cv::warpPerspective(mask, _maskTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0));
|
|
|
|
|
|
|
|
|
|
int xRange = right - left;
|
|
|
|
|
int yRnage = bottom - top;
|
|
|
|
|
//// 收缩一圈消除虚线
|
|
|
|
|
//cv::erode(warped_mask, warped_mask,
|
|
|
|
|
// cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
|
|
|
|
|
|
|
|
|
|
//反映射到像素坐标
|
|
|
|
|
MINMAXRECT32S RANGES = { 0 };
|
|
|
|
|
RANGES.minY = std::max(0, top);
|
|
|
|
|
RANGES.maxY = std::min(_panImage.rows - 1, bottom);
|
|
|
|
|
_panTmp.copyTo(_panImage, _maskTmp);
|
|
|
|
|
|
|
|
|
|
RANGES.minX = std::max(0, left);
|
|
|
|
|
RANGES.maxX = std::min(_panImage.cols - 1, right);
|
|
|
|
|
// 保存遮罩
|
|
|
|
|
_maskTmp.copyTo(_panMask, _maskTmp);
|
|
|
|
|
|
|
|
|
|
cv::Rect2d roi(RANGES.minX, RANGES.minY, RANGES.maxX - RANGES.minX, RANGES.maxY - RANGES.minY);
|
|
|
|
|
//imshow("mask", pan_mask);
|
|
|
|
|
//waitKey(1);
|
|
|
|
|
|
|
|
|
|
if (roi.width < 0)
|
|
|
|
|
{
|
|
|
|
|
int a = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cv::Mat H_inv = H.inv();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_CUDA
|
|
|
|
|
UpdatePan_CUDA(rgb, _panImage, roi, H_inv, _panPara, dep, cuda_resor);
|
|
|
|
|
#else
|
|
|
|
|
UpdatePan_CPU(rgb, _panImage, roi, H_inv, _panPara, dep);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|