一种局部warp的加速技巧

main
wangchongwu 1 month ago
parent 0a7723da16
commit c24eab0139

Binary file not shown.

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

@ -59,9 +59,9 @@ private:
cv::Mat _panMask; //覆盖区域遮罩 cv::Mat _panMask; //覆盖区域遮罩
private: //private:
cv::Mat _panTmp; // 临时全景图 // cv::Mat _panTmp; // 临时全景图
cv::Mat _maskTmp;// 临时mask // cv::Mat _maskTmp;// 临时mask
}; };

@ -328,7 +328,7 @@ SINT32 UnderStitch::Run(GD_VIDEO_FRAME_S frame, FrameInfo para)
panImage.setTo(0); panImage.setTo(0);
panMask.setTo(0); panMask.setTo(0);
//_MapBlender->BatchMap(_recvFrameKey, _H_pan); _MapBlender->BatchMap(_recvFrameKey, _H_pan);
return 0; return 0;
} }

@ -2,5 +2,5 @@
#pragma once #pragma once
#include <string> #include <string>
std::string BUILD_TIME = "BUILD_TIME 2025_11_02-22.09.40"; std::string BUILD_TIME = "BUILD_TIME 2025_11_02-23.20.59";
std::string VERSION = "BUILD_VERSION 1.0.1"; std::string VERSION = "BUILD_VERSION 1.0.1";

@ -699,7 +699,7 @@ int DecodeData::DecodeRGBImageAndPara(unsigned char *RGBBuffer, H264SEI_Para_732
tm.stop(); tm.stop();
printf("time cost:%f\n", tm.getTimeSec()); printf("time cost:%f ms\n", tm.getTimeMilli());
pan = m_underStitcher->ExportPanAddr(); pan = m_underStitcher->ExportPanAddr();
cv::Mat mat_pan = cv::Mat(pan.u32Height, pan.u32Width, CV_8UC4, pan.u64VirAddr[0]); cv::Mat mat_pan = cv::Mat(pan.u32Height, pan.u32Width, CV_8UC4, pan.u64VirAddr[0]);

@ -12,7 +12,7 @@ int main(int argc, char* argv[])
m_DecodeData->m_CurrentVideo = 1;//0:红外1可见光 m_DecodeData->m_CurrentVideo = 1;//0:红外1可见光
m_DecodeData->m_LocalHeight = 1365;// 本地海拔 m_DecodeData->m_LocalHeight = 1365;// 本地海拔
m_DecodeData->Init(); m_DecodeData->Init();
m_DecodeData->processFileInChunks(filestr, 10 * 1024); m_DecodeData->processFileInChunks(filestr, 6 * 1024);
return 0; return 0;
} }

Loading…
Cancel
Save