diff --git a/README.pdf b/README.pdf deleted file mode 100644 index 5b89879..0000000 Binary files a/README.pdf and /dev/null differ diff --git a/stitch/src/Arith_BlendMap.cpp b/stitch/src/Arith_BlendMap.cpp index 5c1ce09..dcf7077 100644 --- a/stitch/src/Arith_BlendMap.cpp +++ b/stitch/src/Arith_BlendMap.cpp @@ -15,11 +15,6 @@ MapBlend::MapBlend(FileCache* cache, UPanInfo upan_info) _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; } @@ -38,19 +33,34 @@ cv::Mat MapBlend::getPanMaskMat() 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(0, 2) -= roi.x; + H_adj.at(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) { - //return FrameMap_1(src, H_Geo, mapH); - // 与全景图的H相乘 cv::Mat H = mapH * H_Geo; + // 计算当前处理的全景图包围框 + cv::Rect2f box = warpRectWithH_2Rect(H, src.size()); + // 利用H投影当前帧到全景 - //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); + warpPerspectiveROI(src, _panImage, H, box); + 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; // 右边 - _maskTmp.setTo(0); - cv::warpPerspective(mask, _maskTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0)); + // 当前帧的mask + warpPerspectiveROI(mask, _panMask, H, box); + + // 收缩一圈消除虚线 //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) { - _maskTmp = _maskTmp & (~_panMask); //只拷贝未覆盖区域 + //_maskTmp = _maskTmp & (~_panMask); //只拷贝未覆盖区域 } 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::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); //cv::waitKey(1); - _panTmp.copyTo(_panImage, _maskTmp); - - // 保存遮罩 - _maskTmp.copyTo(_panMask, _maskTmp); - - } #include void MapBlend::FrameMap_1(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH) @@ -223,18 +229,20 @@ void MapBlend::BatchMap(vector frameInd, cv::Mat mapH, BLEND_TYPE blend continue; } + // 获取图像数据 + cv::Mat src = getRGBAMatFromGDFrame(_t_frame_cache->_frame_info, _t_frame_cache->_data); + // 读取当前H cv::Mat H1 = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H); // 与全景图的H相乘 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()); - // 获取图像数据 - 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); + // 利用H投影当前帧到全景 + warpPerspectiveROI(src, _panImage, H, box); cv::Mat mask = cv::Mat::ones(cv::Size(src.cols, src.rows), CV_8UC1); @@ -245,17 +253,13 @@ void MapBlend::BatchMap(vector frameInd, cv::Mat mapH, BLEND_TYPE blend 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::warpPerspective(mask, _maskTmp, H, _panTmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0)); + // 当前帧的mask + warpPerspectiveROI(mask, _panMask, H, box); //// 收缩一圈消除虚线 //cv::erode(warped_mask, warped_mask, // cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3))); - _panTmp.copyTo(_panImage, _maskTmp); - - // 保存遮罩 - _maskTmp.copyTo(_panMask, _maskTmp); //imshow("mask", pan_mask); //waitKey(1); diff --git a/stitch/src/Arith_BlendMap.h b/stitch/src/Arith_BlendMap.h index 0375424..f7e495b 100644 --- a/stitch/src/Arith_BlendMap.h +++ b/stitch/src/Arith_BlendMap.h @@ -59,9 +59,9 @@ private: cv::Mat _panMask; //覆盖区域遮罩 -private: - cv::Mat _panTmp; // 临时全景图 - cv::Mat _maskTmp;// 临时mask +//private: +// cv::Mat _panTmp; // 临时全景图 +// cv::Mat _maskTmp;// 临时mask }; diff --git a/stitch/src/Arith_UnderStitch.cpp b/stitch/src/Arith_UnderStitch.cpp index 72d2447..bd6611a 100644 --- a/stitch/src/Arith_UnderStitch.cpp +++ b/stitch/src/Arith_UnderStitch.cpp @@ -328,7 +328,7 @@ SINT32 UnderStitch::Run(GD_VIDEO_FRAME_S frame, FrameInfo para) panImage.setTo(0); panMask.setTo(0); - //_MapBlender->BatchMap(_recvFrameKey, _H_pan); + _MapBlender->BatchMap(_recvFrameKey, _H_pan); return 0; } diff --git a/stitch/src/Version.h b/stitch/src/Version.h index aa79ebf..eac162b 100644 --- a/stitch/src/Version.h +++ b/stitch/src/Version.h @@ -2,5 +2,5 @@ #pragma once #include -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"; diff --git a/tests/decodedata.cpp b/tests/decodedata.cpp index 50b1c2a..445c842 100644 --- a/tests/decodedata.cpp +++ b/tests/decodedata.cpp @@ -699,7 +699,7 @@ int DecodeData::DecodeRGBImageAndPara(unsigned char *RGBBuffer, H264SEI_Para_732 tm.stop(); - printf("time cost:%f\n", tm.getTimeSec()); + printf("time cost:%f ms\n", tm.getTimeMilli()); pan = m_underStitcher->ExportPanAddr(); cv::Mat mat_pan = cv::Mat(pan.u32Height, pan.u32Width, CV_8UC4, pan.u64VirAddr[0]); diff --git a/tests/stitch_udp.cpp b/tests/stitch_udp.cpp index 5a37076..7b1bd95 100644 --- a/tests/stitch_udp.cpp +++ b/tests/stitch_udp.cpp @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) m_DecodeData->m_CurrentVideo = 1;//0:红外,1:可见光 m_DecodeData->m_LocalHeight = 1365;// 本地海拔 m_DecodeData->Init(); - m_DecodeData->processFileInChunks(filestr, 10 * 1024); + m_DecodeData->processFileInChunks(filestr, 6 * 1024); return 0; }