From 0a7723da16ccdb50144af95a5257f7ee62229752 Mon Sep 17 00:00:00 2001 From: wangchongwu <759291707@qq.com> Date: Sun, 2 Nov 2025 22:54:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E7=9B=AE=E5=BD=95=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 4 +- doc/API_MANUAL.pdf => README.pdf | Bin 7334255 -> 7362968 bytes ReadMe.md | 214 ++++++++++++- doc/API_MANUAL.md | 193 ------------ map/Cesium/templates/index.html | 25 +- stitch/CMakeLists.txt | 8 +- stitch/src/Arith_BATask.cpp | 6 +- stitch/src/Arith_BlendMap.cpp | 294 +++++++++++------- stitch/src/Arith_BlendMap.h | 47 ++- stitch/src/Arith_UnderStitch.cpp | 198 +++++++----- stitch/src/Arith_UnderStitch.h | 32 +- .../src/{ => FeaStitch}/Arith_FeaStitch.cpp | 0 stitch/src/{ => FeaStitch}/Arith_FeaStitch.h | 0 stitch/src/FrontStitch/Arith_FrontBlend.cpp | 129 ++++++++ stitch/src/FrontStitch/Arith_FrontBlend.h | 19 ++ .../{ => FrontStitch}/Arith_FrontSolver.cpp | 0 .../src/{ => FrontStitch}/Arith_FrontSolver.h | 0 .../{ => FrontStitch}/Arith_FrontStitch.cpp | 42 +-- .../src/{ => FrontStitch}/Arith_FrontStitch.h | 7 +- stitch/src/{ => FrontStitch}/mapKernel.cu | 1 + stitch/src/StitchStruct.h | 2 + stitch/src/Version.h | 2 +- stitch/src/utils/Arith_Utils.cpp | 140 ++++++++- stitch/src/utils/Arith_Utils.h | 5 + tests/ProcDJ.cpp | 24 +- tests/decodedata.cpp | 76 ++++- tests/decodedata.h | 3 + tests/stitch_Genaral.cpp | 8 +- tests/stitch_udp.cpp | 4 +- 29 files changed, 968 insertions(+), 515 deletions(-) rename doc/API_MANUAL.pdf => README.pdf (98%) delete mode 100644 doc/API_MANUAL.md rename stitch/src/{ => FeaStitch}/Arith_FeaStitch.cpp (100%) rename stitch/src/{ => FeaStitch}/Arith_FeaStitch.h (100%) create mode 100644 stitch/src/FrontStitch/Arith_FrontBlend.cpp create mode 100644 stitch/src/FrontStitch/Arith_FrontBlend.h rename stitch/src/{ => FrontStitch}/Arith_FrontSolver.cpp (100%) rename stitch/src/{ => FrontStitch}/Arith_FrontSolver.h (100%) rename stitch/src/{ => FrontStitch}/Arith_FrontStitch.cpp (89%) rename stitch/src/{ => FrontStitch}/Arith_FrontStitch.h (93%) rename stitch/src/{ => FrontStitch}/mapKernel.cu (99%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e7ad9f..1612362 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) IF(WIN32) # ======== OpenCV 配置 ======== - set(OpenCV_DIR "C:/Lib/opencv455/build/x64/vc14/lib") + set(OpenCV_DIR "C:/opencv/build/x64/vc14/lib") find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) link_libraries(${OpenCV_LIBS}) @@ -71,7 +71,7 @@ IF(WIN32) # ======== FFMPEG配置 ======== set(FFMPEG_DIR "C:/Lib/ffmpeg4") set(FFMPEG_INCLUDE_DIRS ${FFMPEG_DIR}/include) - set(FFMPEG_LIBS_DIR ${FFMPEG_DIR}/lib) + set(FFMPEG_LIBS_DIR ${FFMPEG_DIR}/lib/x64) include_directories(${FFMPEG_DIR}) include_directories(${FFMPEG_INCLUDE_DIRS}) diff --git a/doc/API_MANUAL.pdf b/README.pdf similarity index 98% rename from doc/API_MANUAL.pdf rename to README.pdf index 31b7644061728c7476e320bb6945f0e31469c65f..5b898798d27768b8c3200ce85459d387aaebeb36 100644 GIT binary patch delta 125947 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 z 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 HpMLp&tD;Qw delta 102430 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¥7!=)at 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 agDL>K6ML6_**粗拼接** 是指利用外部参数信息直接利用无源定位技术对帧进行地理纠正,纠正后的数据天然具备地理属性,只需要简单的仿射变换即可显示为空间一致的底图。 + +>**优化** 是指利用帧间同名点匹配关系建立误差方程,迭代优化映射关系的过程。 + + +粗拼接是整个工作流的核心,形成任意场景均有高可用性的拼接实现。而优化过程是可以关闭的,用于对拼接质量要求较高的场景或者外参误差较大的设备。 + + +如API说明所示,SDK提供了全景图的显示接口。**但我们不建议使用该全景图**,主要原因是全景显示策略与逻辑是为了便于展示算法效果和内部切瓦片使用的。对图层叠加以及漫游、回溯等高级功能难以支持。 + +相反的,在下视算法执行期间,还生成了两种标准地理数据,具有通用的行业接口。能够轻松支持各类地理web、桌面端应用。 + +1. 单帧纠正产品 + +帧输入后,算法利用外参信息对图像进行地理纠正,简单说就是正北+下视校正。且给出帧的kml信息(谷歌地球标准数据层)。 + +```xml + + + + + DJI6830 + + DJI6830.png + + + 30.267059 + 30.264926 + 114.446180 + 114.443523 + + + + +``` + +2. 谷歌瓦片 + +视频输入过程中,算法根据外参变化情况自行判断执行优化时机,优化完成后会将拼接好的信息切成标准谷歌瓦片。 + +谷歌瓦片按照{Z}-{X}-{Y}.png形式进行命名,能够被gis前端正确显示。下图是cesiumjs的可视化效果。 +**因此整个执行流程可以概括为实时显示基于kml的帧,并周期性的或者触发式的读取瓦片覆盖显示。** + + + +![图 2](./doc/images/4c9281d939781e3be92bc09eda67036271172bad357c4c92863aa79385edd0ab.png) + + + + +## 变更说明 + +### 20250919 +1. 修复了长焦初始化崩溃问题,限制了全景图分辨率,最大水平方向像素个数不多于1万。 +2. 增加前视扫描换向判断,内部自动初始化拼接地面起始点,连续拼接不至于畸变。 +3. 俯仰方向的零位由竖直向下改为水平为0,更符合使用习惯。 +4. 新增日志支持,日志为可执行程序下“StitchLog”文件夹。 +5. 原先使用1080p测试可见光,改为720p后,除图像宽高不同外,像元尺寸应乘以1.5 + + +![图 0](./doc/images/6f54e1028cf86058d0ecd9ebe7ab3011e82e4b35b5b193ab8b88a21817c01d50.png) + + + +### 20250924 +1. 按照外场要求,扫描方向切换不进行全景图初始化,改为多扫描几个条带后,根据位移路径大小初始化,这样可以尽可能保留更多的条带。 + + +### 20250925 +1. 补充 前视扫描全景图像方<->经纬高<->伺服导引角的关系计算 + + +### 20251015 +根据领导指示,前视拼接技术不再进一步研究 + + + +### 20251030 +近期完成下视算法的改进: +1. 新增了基于se3李代数优化,降低了优化参数量,优化结果更有物理意义 +2. 对工程结构进行重构,前视/纯特征与下视分开,所有测试代码进入./test目录 +3. map/Cesium 离线下载js文件,现已支持调试网内看瓦片和kml +4. 其他小改动 + -已初步完成地理快拼、BA、谷歌瓦片输出等核心功能开发,能够输出符合谷歌标准的256瓦片。整理以下遗留问题: -【1】全景图的分辨率和尺寸应当根据硬件水平自适应,目前是人工指定的 -【2】长时间推扫导致成像区域离开预设的全景范围,如何自适应处理。 -【3】一定要提供边扫描边输出瓦片能力 \ No newline at end of file diff --git a/doc/API_MANUAL.md b/doc/API_MANUAL.md deleted file mode 100644 index af91b3f..0000000 --- a/doc/API_MANUAL.md +++ /dev/null @@ -1,193 +0,0 @@ -# 航拍拼接模块接口说明 - -本模块用于吊舱的扫描全景图拼接,包含前视、下视以及特征拼接三个模式。前视与下视投影面和效果均不同。二者接口大部分相同。 - -特征拼接是完全基于特征的图像算法,本身存在较大的累计误差,仅用于测试和对比出图,暂时没有应用价值。 - - - -下视拼接是最广泛使用的拼接方式,可以随着载体飞行进行连续长时拼接,并生成含有地理信息 - -![图 0](./images/e18e82d54c6ca00737f00eb3a67586664ac5b6c4f47b019ceebfdc627be2e17d.png) - - - -前视拼接的效果接近360°全景。 -![图 1](./images/b739965a8710a2a6999c2dcee839776d7bdfe99423265288d2cc56b9611ba3e4.png) - - - - - - -## 1. 依赖 -本模块依赖ceres优化库(包含gflag、glog)以及cuda支持,opencv 455支持。 -除cuda库外,其余库均以vc14动态库文件形式提供。 - -使用cuda将极大加速前视极坐标拼接模块。 - - -## 2. 下视接口 - - -```C++ -static API_UnderStitch* Create(std::string cachedir = "./cache"); -``` -模块创建接口,其中默认参数为使用cache的路径,cache将缓存需要处理的帧原始数据。 - -```C++ -static void Destroy(API_UnderStitch* obj); -``` -模块析构接口,使用完毕后释放内存。 - -```C++ -virtual UPanInfo Init(FrameInfo info) = 0; -``` -初始化接口,请使用拼接时刻的内外参信息进行初始化。初始化完成后返回全景图的参数 - - -```C++ - virtual void SetOutput(std::string name, std::string outdir) = 0; -``` -设置输出路径,下视模块按照通用谷歌瓦片生成标准256*256瓦片,提前设置好输出文件夹。 - -```C++ - virtual void SetConfig(UPanConfig config) = 0; -``` -设置运行参数。 - - - -```C++ - virtual BYTE8 Run(GD_VIDEO_FRAME_S img, FrameInfo para) = 0; -``` -运行拼接流程,在该过程中程序自动将当前图像重新投影到全景图上,可以通过访问全景图内存进行实时显示。 - - -```C++ - virtual GD_VIDEO_FRAME_S ExportPanAddr() = 0; -``` -获取全景图接口,其中GD_VIDEO_FRAME_S是高德研发中心通用帧接口,内部维护了图像类型和指针等信息。具体参见GD_VIDEO_FRAME_S接口说明 - - -```C++ - virtual SINT32 OptAndOutCurrPan() = 0; -``` -全景投影完毕后,可以调用该接口进行优化,主要是精细对齐帧以及拼接缝消除等,暂未实现。 - - - -## 前视接口 - -```C++ -static API_FrontStitch* Create(std::string cachedir = "./cache"); -``` - -模块创建接口,其中默认参数为使用cache路径,前视模块不使用cache。 -```C++ -static void Destroy(API_FrontStitch* obj); -``` -模块析构接口,使用完毕后释放内存。 - -```C++ -virtual FPanInfo Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRange) = 0; -``` -初始化接口,使用拼接时刻的内外参信息进行初始化, - -```C++ - virtual BYTE8 Run(GD_VIDEO_FRAME_S img, FrameInfo para) = 0; -``` -运行拼接流程,在该过程中程序自动将当前图像重新投影到全景图上,可以通过访问全景图内存进行实时显示。 - - - -```C++ - virtual GD_VIDEO_FRAME_S ExportPanAddr() = 0; -``` -获取全景图接口,其中GD_VIDEO_FRAME_S是高德研发中心通用帧接口,内部维护了图像类型和指针等信息。具体参见GD_VIDEO_FRAME_S接口说明 - - -```C++ - virtual SINT32 OptAndOutCurrPan() = 0; -``` -全景投影完毕后,可以调用该接口进行优化,主要是精细对齐帧以及拼接缝消除等,暂未实现。 - - - - - -# 附 下视拼接的标准地理产品 - -下视拼接过程目前是功能最为完善的,主要分为粗拼接+优化两个过程。 ->**粗拼接** 是指利用外部参数信息直接利用无源定位技术对帧进行地理纠正,纠正后的数据天然具备地理属性,只需要简单的仿射变换即可显示为空间一致的底图。 - ->**优化** 是指利用帧间同名点匹配关系建立误差方程,迭代优化映射关系的过程。 - - -粗拼接是整个工作流的核心,形成任意场景均有高可用性的拼接实现。而优化过程是可以关闭的,用于对拼接质量要求较高的场景或者外参误差较大的设备。 - - -如API说明所示,SDK提供了全景图的显示接口。**但我们不建议使用该全景图**,主要原因是全景显示策略与逻辑是为了便于展示算法效果和内部切瓦片使用的。对图层叠加以及漫游、回溯等高级功能难以支持。 - -相反的,在下视算法执行期间,还生成了两种标准地理数据,具有通用的行业接口。能够轻松支持各类地理web、桌面端应用。 - -1. 单帧纠正产品 - -帧输入后,算法利用外参信息对图像进行地理纠正,简单说就是正北+下视校正。且给出帧的kml信息(谷歌地球标准数据层)。 - -```xml - - - - - DJI6830 - - DJI6830.png - - - 30.267059 - 30.264926 - 114.446180 - 114.443523 - - - - -``` - -2. 谷歌瓦片 - -视频输入过程中,算法根据外参变化情况自行判断执行优化时机,优化完成后会将拼接好的信息切成标准谷歌瓦片。 - -谷歌瓦片按照{Z}-{X}-{Y}.png形式进行命名,能够被gis前端正确显示。下图是cesiumjs的可视化效果。 -**因此整个执行流程可以概括为实时显示基于kml的帧,并周期性的或者触发式的读取瓦片覆盖显示。** - - - -![图 2](./images/4c9281d939781e3be92bc09eda67036271172bad357c4c92863aa79385edd0ab.png) - - - - -## 变更说明 - -### 20250919 -1. 修复了长焦初始化崩溃问题,限制了全景图分辨率,最大水平方向像素个数不多于1万。 -2. 增加前视扫描换向判断,内部自动初始化拼接地面起始点,连续拼接不至于畸变。 -3. 俯仰方向的零位由竖直向下改为水平为0,更符合使用习惯。 -4. 新增日志支持,日志为可执行程序下“StitchLog”文件夹。 -5. 原先使用1080p测试可见光,改为720p后,除图像宽高不同外,像元尺寸应乘以1.5 - - -![图 0](images/6f54e1028cf86058d0ecd9ebe7ab3011e82e4b35b5b193ab8b88a21817c01d50.png) - - - -### 20250924 -1. 按照外场要求,扫描方向切换不进行全景图初始化,改为多扫描几个条带后,根据位移路径大小初始化,这样可以尽可能保留更多的条带。 - - -### 20250925 -1. 补充 前视扫描全景图像方<->经纬高<->伺服导引角的关系计算 - - diff --git a/map/Cesium/templates/index.html b/map/Cesium/templates/index.html index 1d29c9b..5a79a8b 100644 --- a/map/Cesium/templates/index.html +++ b/map/Cesium/templates/index.html @@ -50,7 +50,7 @@ new Cesium.UrlTemplateImageryProvider({ url: 'https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', minimumLevel: 1, - maximumLevel: 20, + maximumLevel: 22, credit: new Cesium.Credit('Google Maps') }) ); @@ -63,7 +63,7 @@ // 添加数据源 viewer.dataSources.add( - Cesium.KmlDataSource.load("/kml/DJI7990_z19.kml", options) + Cesium.KmlDataSource.load("/kml/DJI12670_z19.kml", options) ).then((dataSource) => { console.log("KML数据加载完成:", dataSource); // 自动飞到数据范围 @@ -80,7 +80,7 @@ const customTiles = viewer.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({ url: '/tiles/{z}/{x}/{y}.png', // 修改为X_Y.png格式 - maximumLevel: 19, // 根据你的瓦片层级修改 + maximumLevel: 22, // 根据你的瓦片层级修改 minimumLevel: 0, credit: new Cesium.Credit('Custom Tiles'), // 添加错误处理 @@ -128,10 +128,11 @@ // 设置相机位置到瓦片区域 viewer.camera.setView({ destination: Cesium.Rectangle.fromDegrees( - 114.623397, // west - 30.328361, // south - 114.623397, // east - 30.328361 // north +114.445953, +30.267963, +114.445953, +30.267963, + ), orientation: { heading: 0, @@ -181,10 +182,10 @@ const lastDataSource = dataSources[dataSources.length - 1]; // 使用最后一个KML文件的经纬度范围 const rectangle = Cesium.Rectangle.fromDegrees( - 114.623397, // west - 30.328361, // south - 114.623397, // east - 30.328361 // north +114.445953, +30.267963, +114.445953, +30.267963, ); // 设置相机位置 @@ -239,7 +240,7 @@ addMarker(114.623397, 30.328361, '熊司一起飞点', '这是一个测试标记点
点击查看详细信息'); // 初始加载KML文件(设置为false可以禁用KML加载) - loadKMLFiles(true); + diff --git a/stitch/CMakeLists.txt b/stitch/CMakeLists.txt index 7d4ed04..1511b2d 100644 --- a/stitch/CMakeLists.txt +++ b/stitch/CMakeLists.txt @@ -54,7 +54,11 @@ set(ArithSrcDIR_LOG "src/Log") # 日志文件路径 set(ArithSrcDIR_DeepSort "src/deepsort/src") # deepsort # 使用当前目录、Common目录源码构建 -file(GLOB libsrcs ${ArithSrcDIR_MAIN}/mapKernel.cu ${ArithSrcDIR_MAIN}/*.cpp ${ArithSrcDIR_MAIN}/*.c ${ArithSrcDIR_MAIN}/*.h ${ArithSrcDIR_MAIN}/*.hpp) +file(GLOB libsrcs ${ArithSrcDIR_MAIN}/FrontStitch/mapKernel.cu +${ArithSrcDIR_MAIN}/*.cpp ${ArithSrcDIR_MAIN}/*.c ${ArithSrcDIR_MAIN}/*.h ${ArithSrcDIR_MAIN}/*.hpp +${ArithSrcDIR_MAIN}/FrontStitch/*.h ${ArithSrcDIR_MAIN}/FrontStitch/*.cpp +${ArithSrcDIR_MAIN}/FeaStitch/*.h ${ArithSrcDIR_MAIN}/FeaStitch/*.cpp +) file(GLOB CommonSrc ${ArithSrcDIR_MAIN}/utils/*.cpp ${ArithSrcDIR_MAIN}/utils/*.c ${ArithSrcDIR_MAIN}/utils/*.h ${ArithSrcDIR_MAIN}/utils/*.hpp) file(GLOB LogSrc ${ArithSrcDIR_LOG}/*.cpp ${ArithSrcDIR_LOG}/*.c ${ArithSrcDIR_LOG}/*.h ${ArithSrcDIR_LOG}/*.hpp) file(GLOB DeepSortSrc ${ArithSrcDIR_DeepSort}/*.cpp ${ArithSrcDIR_DeepSort}/*.c) @@ -71,6 +75,8 @@ target_include_directories(${LIB_STITCH} PUBLIC ${ArithSrcDIR_MAIN}/utils ${ArithSrcDIR_MAIN}/Log ${ArithSrcDIR_MAIN}/deepsort/include + ${ArithSrcDIR_MAIN}/FeaStitch + ${ArithSrcDIR_MAIN}/FrontStitch ) link_directories(${Ceres_DIR}/lib) diff --git a/stitch/src/Arith_BATask.cpp b/stitch/src/Arith_BATask.cpp index 82ee418..cd909a4 100644 --- a/stitch/src/Arith_BATask.cpp +++ b/stitch/src/Arith_BATask.cpp @@ -360,13 +360,13 @@ void BA_Task::OptFrame(vector frameInd,cv::Mat H_map) // 配置求解器 ceres::Solver::Options options; - options.max_num_iterations = 20; // 增加最大迭代次数 + options.max_num_iterations = 10; // 增加最大迭代次数 options.function_tolerance = 1e-5; // 设置更严格的函数值容忍度 options.gradient_tolerance = 1e-5; // 设置更严格的梯度容忍度 options.parameter_tolerance = 1e-5; // 设置更严格的参数容忍度 options.minimizer_progress_to_stdout = true; //options.linear_solver_type = ceres::SPARSE_NORMAL_CHOLESKY; // 使用稀疏求解器 - options.num_threads = 8; // 使用多线程 + options.num_threads = 12; // 使用多线程 ceres::Solver::Summary summary; @@ -388,7 +388,7 @@ void BA_Task::OptFrame(vector frameInd,cv::Mat H_map) // 输出结果 - std::cout << summary.FullReport() << std::endl; + //std::cout << summary.BriefReport() << std::endl; #ifndef OPT_H // 将优化se3写入H diff --git a/stitch/src/Arith_BlendMap.cpp b/stitch/src/Arith_BlendMap.cpp index 1e96f58..5c1ce09 100644 --- a/stitch/src/Arith_BlendMap.cpp +++ b/stitch/src/Arith_BlendMap.cpp @@ -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* cache) +MapBlend::MapBlend(FileCache* 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 frameInd, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask) -{ - // 从文件缓存获取帧 - auto _t_frame_cache = std::make_shared(); - 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 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 disshow; + //cv::resize(dis, disshow, cv::Size(warped_mask.rows / 8, warped_mask.cols / 8)); + // + //imshow("dis", disshow); + //cv::waitKey(1); - cv::Mat warped_mask; - cv::warpPerspective(mask, warped_mask, H, imagetmp.size(), cv::INTER_NEAREST, cv::BORDER_CONSTANT, cv::Scalar(0)); - - //// 收缩一圈消除虚线 - //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); - // 保存遮罩 - warped_mask.copyTo(pan_mask, warped_mask); + _panTmp.copyTo(_panImage, _maskTmp); - //imshow("mask", pan_mask); - //waitKey(1); - - } + // 保存遮罩 + _maskTmp.copyTo(_panMask, _maskTmp); } - -void MapBlend::BlendMap(vector frameInd, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask) +#include +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; -FrontMapBlend::FrontMapBlend(FileCache* cache) -{ - _cache = cache; -} + 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); + + + 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(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 frameInd, FPanInfo _panPara, cv::Mat _panImage, cv::Mat pan_mask, cuda_Mem cuda_resor) +void MapBlend::BatchMap(vector frameInd, cv::Mat mapH, BLEND_TYPE blendType) { - _panImage.setTo(0); - // 从文件缓存获取帧 auto _t_frame_cache = std::make_shared(); for (size_t i = 0; i < frameInd.size(); i++) @@ -138,71 +224,47 @@ void FrontMapBlend::DirectMap(vector 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 - } -} diff --git a/stitch/src/Arith_BlendMap.h b/stitch/src/Arith_BlendMap.h index 659222e..0375424 100644 --- a/stitch/src/Arith_BlendMap.h +++ b/stitch/src/Arith_BlendMap.h @@ -1,6 +1,6 @@ /*********版权所有(C)2025,武汉高德红外股份有限公司*************************************** * 文件名称:Arith_BlendMap.h -* 文件标识:拼接融合,提升全景图质量 +* 文件标识:全景图实体 * 内容摘要: * 其它说明: * 当前版本:V0.5 @@ -16,38 +16,55 @@ #include "FileCache.h" + +// 融合形式 +enum BLEND_TYPE +{ + DIRECT, //覆盖投影 + INCREASE, //增量投影 + DIS_BLEND //线性羽化 +}; + + + // 下视批量绘制 class MapBlend { public: - MapBlend(FileCache* cache); + MapBlend(FileCache* cache,UPanInfo upan_info); ~MapBlend(); + cv::Mat getPanImageMat(); + cv::Mat getPanMaskMat(); + public: - void MapFrame(cv::Mat src,cv::Mat H_Geo, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask); // 单帧投影帧到全景图 + void FrameMap(cv::Mat src,cv::Mat H_Geo, cv::Mat mapH, BLEND_TYPE blendType = DIRECT); // 单帧投影帧到全景图 + + void FrameMap_1(cv::Mat src, cv::Mat H_Geo, cv::Mat mapH); // 手写反向投影 - void DirectMap(vector frameInd, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask); //批量投影 - void BlendMap(vector frameInd, cv::Mat mapH, cv::Mat pan, cv::Mat pan_mask);//融合投影 +public: + void BatchMap(vector frameInd, cv::Mat mapH, BLEND_TYPE blendType = DIRECT); //从文件缓存批量投影 + private: FileCache* _cache; -}; -// 前视批量绘制 -class FrontMapBlend -{ -public: - FrontMapBlend(FileCache* cache); - ~FrontMapBlend(); -public: - void DirectMap(vector frameInd, FPanInfo _panPara, cv::Mat pan, cv::Mat pan_mask, cuda_Mem cuda_resor); //直接投影 + UPanInfo _upan_info; + + cv::Mat _H_pan;//全景图投影矩阵:从地理系到全景地图 + + cv::Mat _panImage; // 全景图 + + cv::Mat _panMask; //覆盖区域遮罩 private: - FileCache* _cache; + cv::Mat _panTmp; // 临时全景图 + cv::Mat _maskTmp;// 临时mask }; + #endif \ No newline at end of file diff --git a/stitch/src/Arith_UnderStitch.cpp b/stitch/src/Arith_UnderStitch.cpp index e327563..72d2447 100644 --- a/stitch/src/Arith_UnderStitch.cpp +++ b/stitch/src/Arith_UnderStitch.cpp @@ -57,7 +57,7 @@ UnderStitch::UnderStitch(std::string cachedir) _BATask = new BA_Task(_cache); - _BlendTask = new MapBlend(_cache); + /*_BlendTask = new MapBlend(_cache);*/ _panPara = { 0 }; @@ -83,6 +83,7 @@ UPanInfo UnderStitch::InitMap(FrameInfo info) cv::Mat H0 = _GeoSolver->findHomography(info); + // 计算视场中心的地理坐标 cv::Point2f ct_geo = warpPointWithH(H0, cv::Point2f(info.nWidth / 2, info.nHeight / 2)); @@ -90,7 +91,7 @@ UPanInfo UnderStitch::InitMap(FrameInfo info) double yaw_angle = info.craft.stAtt.fYaw; // 根据飞行方向调整全景图尺寸 - int base_size = MIN(info.nWidth * 5, 10000); + int base_size = MIN(info.nWidth * 10, 8000); UPanInfo panPara = { 0 }; // 根据偏航角计算宽高比 @@ -122,7 +123,7 @@ UPanInfo UnderStitch::InitMap(FrameInfo info) auto geo_pro_rect = warpRectWithH_2Rect(H0,cv::Size(info.nWidth,info.nHeight)); // 计算目标比例(单帧投影后占全景图的0.25) - float target_ratio = 0.2; + float target_ratio = 0.1; float current_ratio = MAX(geo_pro_rect.width / (target_ratio*panPara.m_pan_width), geo_pro_rect.height / (target_ratio*panPara.m_pan_height)); // 调整scale参数 @@ -220,6 +221,9 @@ UPanInfo UnderStitch::ReLocateMap(FrameInfo info) UPanInfo UnderStitch::Init(FrameInfo info) { + // 以向下初始化 + info.servoInfo.fServoPt = -90; + // 转为内部俯仰向下零位 info.servoInfo.fServoPt += 90; @@ -229,9 +233,8 @@ UPanInfo UnderStitch::Init(FrameInfo info) // 初始化全景图 _panPara = InitMap(info); - _panImage = cv::Mat(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC4, cv::Scalar(0,0,0,0)); - - _panMask = cv::Mat::zeros(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC1); + // 创建blender + _MapBlender = new MapBlend(_cache, _panPara); _lastFrameKey = 0; @@ -239,13 +242,11 @@ UPanInfo UnderStitch::Init(FrameInfo info) // 默认配置参数 _config.bOutGoogleTile = true; - _config.bUseBA = true; + _config.bUseBA = false; _config.bOutFrameTile = false; - // 重置全景图 - _panImage.setTo(0); - _panMask.setTo(0); + LOG_INFO("Init success"); return _panPara; @@ -295,7 +296,7 @@ SINT32 UnderStitch::Run(GD_VIDEO_FRAME_S frame, FrameInfo para) // 转为内部俯仰向下零位 para.servoInfo.fServoPt += 90; - // 视频帧筛选 + //// 视频帧筛选 if (!FilterFrame(para)) { return -1; @@ -303,6 +304,9 @@ SINT32 UnderStitch::Run(GD_VIDEO_FRAME_S frame, FrameInfo para) LOG_INFO("Run frame {} ,_totalFrameCnt {}",para.nFrmID,_totalFrameCnt); + cv::Mat panImage = _MapBlender->getPanImageMat(); + cv::Mat panMask = _MapBlender->getPanMaskMat(); + // 获取地理投影H RtK rtk; cv::Mat H_geo = _GeoSolver->findHomography(para, rtk); @@ -316,15 +320,15 @@ SINT32 UnderStitch::Run(GD_VIDEO_FRAME_S frame, FrameInfo para) // 输出当前所有瓦片,再不输出就会丢失当前全景中的瓦片 LOG_INFO("ExportTileSet"); - _googleProduct.ExportTileSet(_panImage, _panMask, _taskTilesVec, _outDir, _filename + std::to_string(_lastFrameKey)); + _googleProduct.ExportTileSet(panImage, panMask, _taskTilesVec, _outDir, _filename + std::to_string(_lastFrameKey)); // 重新初始化投影参数 _panPara = ReLocateMap(para); - _panImage.setTo(0); - _panMask.setTo(0); + panImage.setTo(0); + panMask.setTo(0); - _BlendTask->DirectMap(_recvFrameKey, _H_pan, _panImage,_panMask); + //_MapBlender->BatchMap(_recvFrameKey, _H_pan); return 0; } @@ -332,21 +336,26 @@ SINT32 UnderStitch::Run(GD_VIDEO_FRAME_S frame, FrameInfo para) // 获取RGBA图像 cv::Mat src = getRGBAMatFromGDFrame(frame,frame.u64VirAddr[0]); - // 地理纠正 - TileInfo info = { 0 }; - cv::Mat Orth_Image = getOrthImage(src, para, info); - // 输出单帧谷歌瓦片 if (_config.bOutFrameTile) { + TileInfo info = { 0 }; + cv::Mat Orth_Image = getOrthImage(src, para, info); _googleProduct.ExportGeoPng(Orth_Image, info, _outDir + "/FrameTile"); } // 投影帧到全景 - _BlendTask->MapFrame(src, H_geo, _H_pan, _panImage,_panMask); + _MapBlender->FrameMap(src, H_geo, _H_pan); // 预处理+缓存 - ReceiveFrame(frame, para); + if (_config.bUseBA) + { + ReceiveFrame(frame, para); + } + + + // + if (_config.bUseBA && TriggerBA(para)) { @@ -380,11 +389,12 @@ SINT32 UnderStitch::OptAndOutCurrPan() } // 重投影所有帧到全景 - _BlendTask->DirectMap(_baWindowKey, _H_pan, _panImage,_panMask); + _MapBlender->BatchMap(_baWindowKey, _H_pan); // 输出当前所有瓦片 LOG_INFO("ExportTileSet"); - _googleProduct.ExportTileSet(_panImage, _panMask, _taskTilesVec, _outDir, _filename + std::to_string(_lastFrameKey)); + _googleProduct.ExportTileSet(_MapBlender->getPanImageMat(), _MapBlender->getPanMaskMat(), + _taskTilesVec, _outDir, _filename + std::to_string(_lastFrameKey)); return _baWindowKey.size(); } @@ -402,9 +412,9 @@ bool UnderStitch::FilterFrame(FrameInfo para) } // 扫描角过大,跳过 - if (ABS(para.servoInfo.fServoPt) > 45) + if (ABS(para.servoInfo.fServoPt) > 25) { - //return false; + return false; } // 获取当前帧的Geo覆盖 @@ -523,61 +533,67 @@ bool UnderStitch::TriggerBA(FrameInfo para) return false; } -// 废弃,改为输出单帧正射后的瓦片 -void UnderStitch::CutTileRealTime() +bool UnderStitch::TriggerCutTile(FrameInfo para) { - // 在4倍降采样图上计算瓦片覆盖情况 - int downSampleR = 4; - - cv::Mat panMasksmall; - cv::resize(_panMask, panMasksmall, cv::Size(_panMask.cols / downSampleR, _panMask.rows / downSampleR)); - - // 计算覆盖图的积分图 - cv::Mat integralMask; - cv::integral(panMasksmall, integralMask, CV_32S); - - // 遍历已经在初始化阶段得到的瓦片划分 - auto tiles = _taskTilesVec; - - int cnt = 0; - for (size_t i = 0; i < tiles.size(); i++) - { - TileInfo* ptile = &_taskTilesVec[i]; - RECT32S box = ptile->boxInPan; - - // 跳过已输出块 - if (ptile->nStatus > 0) - { - //cnt++; - continue; - } - - SINT32 x1 = box.x/ downSampleR; - SINT32 y1 = box.y/ downSampleR; - SINT32 x2 = box.x/ downSampleR + box.w/ downSampleR; - SINT32 y2 = box.y/ downSampleR + box.h/ downSampleR; - - // 使用积分图快速计算区域和 - float maskSum = integralMask.at(y2, x2) - - integralMask.at(y1, x2) - - integralMask.at(y2, x1) - + integralMask.at(y1, x1); - - // 计算瓦片影像覆盖率 - float Coverage = maskSum * downSampleR * downSampleR / (box.w * box.h); - - if (Coverage > 0.95) - { - // 输出并标记 - ptile->nStatus = 1; - _googleProduct.ExportOneTile(_panImage, *ptile, _outDir, _filename); - } - - } - - + return false; } +//// 废弃,改为输出单帧正射后的瓦片 +//void UnderStitch::CutTileRealTime() +//{ +// // 在4倍降采样图上计算瓦片覆盖情况 +// int downSampleR = 4; +// +// cv::Mat panMasksmall; +// cv::resize(_MapBlender->getPanMaskMat(), panMasksmall, +// cv::Size(_MapBlender->getPanMaskMat().cols / downSampleR, _MapBlender->getPanMaskMat().rows / downSampleR)); +// +// // 计算覆盖图的积分图 +// cv::Mat integralMask; +// cv::integral(panMasksmall, integralMask, CV_32S); +// +// // 遍历已经在初始化阶段得到的瓦片划分 +// auto tiles = _taskTilesVec; +// +// int cnt = 0; +// for (size_t i = 0; i < tiles.size(); i++) +// { +// TileInfo* ptile = &_taskTilesVec[i]; +// RECT32S box = ptile->boxInPan; +// +// // 跳过已输出块 +// if (ptile->nStatus > 0) +// { +// //cnt++; +// continue; +// } +// +// SINT32 x1 = box.x/ downSampleR; +// SINT32 y1 = box.y/ downSampleR; +// SINT32 x2 = box.x/ downSampleR + box.w/ downSampleR; +// SINT32 y2 = box.y/ downSampleR + box.h/ downSampleR; +// +// // 使用积分图快速计算区域和 +// float maskSum = integralMask.at(y2, x2) +// - integralMask.at(y1, x2) +// - integralMask.at(y2, x1) +// + integralMask.at(y1, x1); +// +// // 计算瓦片影像覆盖率 +// float Coverage = maskSum * downSampleR * downSampleR / (box.w * box.h); +// +// if (Coverage > 0.95) +// { +// // 输出并标记 +// ptile->nStatus = 1; +// _googleProduct.ExportOneTile(_MapBlender->getPanImageMat(), *ptile, _outDir, _filename); +// } +// +// } +// +// +//} + SINT32 UnderStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para) { @@ -662,6 +678,13 @@ SINT32 UnderStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para) // 优化表初始化 _recvFrameOptFlag[para.nFrmID] = 0; + + // 缓存包围多边形 + _polygonAll.push_back(warpRectWithH(H0, cv::Size(img.u32Width, img.u32Height))); + + + + _totalFrameCnt++; return _totalFrameCnt; @@ -673,12 +696,14 @@ SINT32 UnderStitch::ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para) bool UnderStitch::ExportGeoPng() { + cv::Mat pan = _MapBlender->getPanImageMat(); + // 计算全景图的坐标范围 auto P1 = getBLHFromPan(cv::Point2f(0, 0), _H_pan); - auto P2 = getBLHFromPan(cv::Point2f(_panImage.cols, 0), _H_pan); + auto P2 = getBLHFromPan(cv::Point2f(pan.cols, 0), _H_pan); - auto P3 = getBLHFromPan(cv::Point2f(_panImage.cols, _panImage.rows), _H_pan); - auto P4 = getBLHFromPan(cv::Point2f(0, _panImage.rows), _H_pan); + auto P3 = getBLHFromPan(cv::Point2f(pan.cols, pan.rows), _H_pan); + auto P4 = getBLHFromPan(cv::Point2f(0, pan.rows), _H_pan); auto minL = min(min(min(P1.L, P2.L), P3.L), P4.L); auto maxL = max(max(max(P1.L, P2.L), P3.L), P4.L); @@ -696,11 +721,16 @@ bool UnderStitch::ExportGeoPng() info.href = _filename + ".png"; // 输出谷歌地图产品 - _googleProduct.ExportGeoPng(_panImage, info, _outDir); + _googleProduct.ExportGeoPng(pan, info, _outDir); return 0; } +void UnderStitch::UpdateAdjacencyMap() +{ + // 根据 +} + cv::Mat UnderStitch::getOrthImage(cv::Mat src, FrameInfo para,TileInfo& tile) { @@ -752,18 +782,18 @@ cv::Mat UnderStitch::getOrthImage(cv::Mat src, FrameInfo para,TileInfo& tile) GD_VIDEO_FRAME_S UnderStitch::ExportPanAddr() { GD_VIDEO_FRAME_S pan_out; - + cv::Mat pan = _MapBlender->getPanImageMat(); pan_out.enPixelFormat = GD_PIXEL_FORMAT_RGB_PACKED; pan_out.u32Width = _panPara.m_pan_width; pan_out.u32Height = _panPara.m_pan_height; - pan_out.u64VirAddr[0] = _panImage.data; + pan_out.u64VirAddr[0] = pan.data; return pan_out; } cv::Mat UnderStitch::ExportPanMat() { - return _panImage; + return _MapBlender->getPanImageMat(); } PointBLH UnderStitch::getBLHFromPan(cv::Point2f ptInPan, cv::Mat _H_panPara) diff --git a/stitch/src/Arith_UnderStitch.h b/stitch/src/Arith_UnderStitch.h index 1b73227..8e931c6 100644 --- a/stitch/src/Arith_UnderStitch.h +++ b/stitch/src/Arith_UnderStitch.h @@ -9,8 +9,17 @@ #include "Arith_BlendMap.h" #include #include "utils/Arith_ThreadPool.h" +#include #include "Logger.h" + +// 关键帧间邻接信息 +struct EdgeInfo +{ + float IOU; +}; + + class UnderStitch :public API_UnderStitch { public: @@ -49,8 +58,11 @@ private: // 触发BA优化时机 bool TriggerBA(FrameInfo para); + // 触发瓦片裁切输出 + bool TriggerCutTile(FrameInfo para); + // 实时裁切瓦片 - void CutTileRealTime(); + //void CutTileRealTime(); // 接收帧 SINT32 ReceiveFrame(GD_VIDEO_FRAME_S img, FrameInfo para); @@ -58,6 +70,9 @@ private: // 输出地理产品:kml png全景 bool ExportGeoPng(); + // 更新邻接关系矩阵 + void UpdateAdjacencyMap(); + // 正射校正 cv::Mat getOrthImage(cv::Mat src, FrameInfo para, TileInfo& tile); @@ -75,6 +90,12 @@ private: vector _baWindowKey;// BA滑动窗口 std::map _recvFrameOptFlag;//接收帧的优化标记 + // 邻接关系表 + std::unordered_map> _AdjacencyMap; + + vector> _polygonAll;//帧包围四边形 + + // FileCache* _cache;//文件缓存,存储外部传入的原始帧信息以及预处理结果 // 保存上一帧信息 @@ -90,7 +111,7 @@ private: BA_Task* _BATask;//BA - MapBlend* _BlendTask;// 融合模块 + MapBlend* _MapBlender;// 融合模块 private: UPanInfo _panPara;//全景图配置 @@ -101,13 +122,9 @@ private: vector _taskTilesVec;//划分的小瓦片方案 - cv::Mat _panImage; - - cv::Mat _panMask; //覆盖区域遮罩 - int _totalFrameCnt;//处理帧计数 - UPanConfig _config; + UPanConfig _config; // 算法控制参数 private: @@ -118,4 +135,5 @@ private: std::threadpool _threadPool; // 线程池 + }; \ No newline at end of file diff --git a/stitch/src/Arith_FeaStitch.cpp b/stitch/src/FeaStitch/Arith_FeaStitch.cpp similarity index 100% rename from stitch/src/Arith_FeaStitch.cpp rename to stitch/src/FeaStitch/Arith_FeaStitch.cpp diff --git a/stitch/src/Arith_FeaStitch.h b/stitch/src/FeaStitch/Arith_FeaStitch.h similarity index 100% rename from stitch/src/Arith_FeaStitch.h rename to stitch/src/FeaStitch/Arith_FeaStitch.h diff --git a/stitch/src/FrontStitch/Arith_FrontBlend.cpp b/stitch/src/FrontStitch/Arith_FrontBlend.cpp new file mode 100644 index 0000000..033c3f0 --- /dev/null +++ b/stitch/src/FrontStitch/Arith_FrontBlend.cpp @@ -0,0 +1,129 @@ +#include "Arith_FrontBlend.h" +#include "Arith_Utils.h" +#include "Arith_FrontSolver.h" + + +using std::max; +using std::min; + + +FrontMapBlend::FrontMapBlend(FileCache* cache) +{ + _cache = cache; +} + +FrontMapBlend::~FrontMapBlend() +{ +} + +void FrontMapBlend::DirectMap(vector frameInd, FPanInfo _panPara, cv::Mat _panImage, cv::Mat pan_mask, cuda_Mem cuda_resor) +{ + _panImage.setTo(0); + + // 从文件缓存获取帧 + auto _t_frame_cache = std::make_shared(); + for (size_t i = 0; i < frameInd.size(); i++) + { + KeyType key = frameInd[i]; + bool flag = _cache->get(key, _t_frame_cache); + + if (!flag) + { + continue; + } + + // 读取当前H + cv::Mat H = cv::Mat(3, 3, CV_64FC1, _t_frame_cache->H); + + auto info = _t_frame_cache->_para; + + float dep = info.nEvHeight; + + GD_VIDEO_FRAME_S img = _t_frame_cache->_frame_info; + + // 获取图像数据 + 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); + + // 计算帧的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); + + //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); + + // 转全景图的像方 + 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); + + int xRange = right - left; + int yRnage = bottom - top; + + //反映射到像素坐标 + MINMAXRECT32S RANGES = { 0 }; + RANGES.minY = std::max(0, top); + RANGES.maxY = std::min(_panImage.rows - 1, bottom); + + RANGES.minX = std::max(0, left); + RANGES.maxX = std::min(_panImage.cols - 1, right); + + cv::Rect2d roi(RANGES.minX, RANGES.minY, RANGES.maxX - RANGES.minX, RANGES.maxY - RANGES.minY); + + 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 + + + } + +} + + + +void UpdatePan_CPU(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat H_inv, FPanInfo _panPara, float dep) +{ + cv::Mat subImg = pan(roi); + // 遍历整个子图 +#pragma omp parallel for + for (int i = 0; i < (int)roi.height; i++) + { + for (int j = 0; j < (int)roi.width; j++) + { + cv::Point2f p_img = getImgPosFromPole(H_inv, getPoleFromFPan(Point2f(j + roi.x, i + roi.y), _panPara), dep); + if (p_img.x >= 200 && p_img.y >= 200 && p_img.x < rgbFrame.cols - 200 && p_img.y < rgbFrame.rows - 200) + { + auto rgbVal = Interpolation_RGB24(rgbFrame.data, rgbFrame.cols, rgbFrame.rows, p_img.x, p_img.y); + uchar* row = subImg.ptr(i); + row[3 * j + 0] = rgbVal.R; + row[3 * j + 1] = rgbVal.G; + row[3 * j + 2] = rgbVal.B; + + } + } + } + +} diff --git a/stitch/src/FrontStitch/Arith_FrontBlend.h b/stitch/src/FrontStitch/Arith_FrontBlend.h new file mode 100644 index 0000000..b40bd16 --- /dev/null +++ b/stitch/src/FrontStitch/Arith_FrontBlend.h @@ -0,0 +1,19 @@ +#include "FileCache.h" +#include "utils/Arith_Utils.h" +// 前视批量绘制 +class FrontMapBlend +{ +public: + FrontMapBlend(FileCache* cache); + ~FrontMapBlend(); +public: + void DirectMap(vector frameInd, FPanInfo _panPara, cv::Mat pan, cv::Mat pan_mask, cuda_Mem cuda_resor); //直接投影 + +private: + FileCache* _cache; +}; +void UpdatePan_CPU(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat h_inv, FPanInfo _panPara, float dep); + +#ifdef ENABLE_CUDA +void UpdatePan_CUDA(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat h_inv, FPanInfo _panPara, float dep, cuda_Mem cuda_resor); +#endif diff --git a/stitch/src/Arith_FrontSolver.cpp b/stitch/src/FrontStitch/Arith_FrontSolver.cpp similarity index 100% rename from stitch/src/Arith_FrontSolver.cpp rename to stitch/src/FrontStitch/Arith_FrontSolver.cpp diff --git a/stitch/src/Arith_FrontSolver.h b/stitch/src/FrontStitch/Arith_FrontSolver.h similarity index 100% rename from stitch/src/Arith_FrontSolver.h rename to stitch/src/FrontStitch/Arith_FrontSolver.h diff --git a/stitch/src/Arith_FrontStitch.cpp b/stitch/src/FrontStitch/Arith_FrontStitch.cpp similarity index 89% rename from stitch/src/Arith_FrontStitch.cpp rename to stitch/src/FrontStitch/Arith_FrontStitch.cpp index 9cdbff9..bd9b067 100644 --- a/stitch/src/Arith_FrontStitch.cpp +++ b/stitch/src/FrontStitch/Arith_FrontStitch.cpp @@ -62,7 +62,7 @@ FPanInfo FrontStitch::Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRa info.camInfo.fAglReso = info.camInfo.fPixelSize / info.camInfo.nFocus * 0.06; } - LOG_INFO("init--info.FCOUS:{}", info.camInfo.nFocus); + //LOG_INFO("init--info.FCOUS:{}", info.camInfo.nFocus); // 视场角计算 float FOV_W = info.camInfo.fAglReso * info.nWidth; @@ -105,10 +105,10 @@ FPanInfo FrontStitch::Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRa cv::Mat H4 = _GeoSolver->findHomography(info); Pole Pole_bottom = getPoleFromImgWithH(H4, cv::Point2f(info.nWidth, info.nHeight), info.nEvHeight); - LOG_INFO("init--Pole_west {} {}", Pole_west.beta, Pole_west.alpha); - LOG_INFO("init--Pole_east {} {}", Pole_east.beta, Pole_east.alpha); - LOG_INFO("init--Pole_up {} {}", Pole_up.beta, Pole_up.alpha); - LOG_INFO("init--Pole_bottom {} {}", Pole_bottom.beta, Pole_bottom.alpha); + //LOG_INFO("init--Pole_west {} {}", Pole_west.beta, Pole_west.alpha); + //LOG_INFO("init--Pole_east {} {}", Pole_east.beta, Pole_east.alpha); + //LOG_INFO("init--Pole_up {} {}", Pole_up.beta, Pole_up.alpha); + //LOG_INFO("init--Pole_bottom {} {}", Pole_bottom.beta, Pole_bottom.alpha); // 俯仰up范围直接使用预设,不再计算 Pole_up.alpha = MAX(stPtRange.Agl1 - 90, Pole_up.alpha); @@ -127,15 +127,15 @@ FPanInfo FrontStitch::Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRa _panPara.fAglRes = MAX(info.camInfo.fAglReso * 2, XmapLimitAglRes); - LOG_INFO("_panPara.fAglRes:{},XmapLimitAglRes:{}", _panPara.fAglRes, XmapLimitAglRes); + //LOG_INFO("_panPara.fAglRes:{},XmapLimitAglRes:{}", _panPara.fAglRes, XmapLimitAglRes); // 全景图规模 _panPara.m_pan_width = DEGLIM360(Pole_east.beta - Pole_west.beta) / _panPara.fAglRes; _panPara.m_pan_height = DEGLIM360(Pole_up.alpha - Pole_bottom.alpha) / _panPara.fAglRes; - LOG_INFO("AzRange:{}", Pole_east.beta - Pole_west.beta); - LOG_INFO("PtRange:{}", Pole_up.alpha - Pole_bottom.alpha); + //LOG_INFO("AzRange:{}", Pole_east.beta - Pole_west.beta); + //LOG_INFO("PtRange:{}", Pole_up.alpha - Pole_bottom.alpha); _panImage = cv::Mat::zeros(_panPara.m_pan_height, _panPara.m_pan_width, CV_8UC3); @@ -148,7 +148,7 @@ FPanInfo FrontStitch::Init(FrameInfo info, ScanRange stAzRange, ScanRange stPtRa cudaMalloc((void**)&_cuda_mem.global_cuda_pan_mask, _panPara.m_pan_width * _panPara.m_pan_height * 1);//gray #endif - LOG_INFO("Init pan w:{} h:{}", _panPara.m_pan_width, _panPara.m_pan_height); + //LOG_INFO("Init pan w:{} h:{}", _panPara.m_pan_width, _panPara.m_pan_height); //POINT32F pt = { 1000,200 }; @@ -478,27 +478,3 @@ POINT32F FrontStitch::getPanUVFromBLH(PointBLH pos) return pt; } -void UpdatePan_CPU(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat H_inv, FPanInfo _panPara, float dep) -{ - cv::Mat subImg = pan(roi); - // 遍历整个子图 - #pragma omp parallel for - for (int i = 0; i < (int)roi.height; i++) - { - for (int j = 0; j < (int)roi.width; j++) - { - cv::Point2f p_img = getImgPosFromPole(H_inv, getPoleFromFPan(Point2f(j + roi.x, i + roi.y), _panPara), dep); - if (p_img.x >= 200 && p_img.y >= 200 && p_img.x < rgbFrame.cols - 200 && p_img.y < rgbFrame.rows - 200) - { - auto rgbVal = Interpolation_RGB24(rgbFrame.data, rgbFrame.cols, rgbFrame.rows, p_img.x, p_img.y); - uchar* row = subImg.ptr(i); - row[3 * j + 0] = rgbVal.R; - row[3 * j + 1] = rgbVal.G; - row[3 * j + 2] = rgbVal.B; - - } - } - } - -} - diff --git a/stitch/src/Arith_FrontStitch.h b/stitch/src/FrontStitch/Arith_FrontStitch.h similarity index 93% rename from stitch/src/Arith_FrontStitch.h rename to stitch/src/FrontStitch/Arith_FrontStitch.h index a4ec8f4..f7d7d8f 100644 --- a/stitch/src/Arith_FrontStitch.h +++ b/stitch/src/FrontStitch/Arith_FrontStitch.h @@ -22,7 +22,7 @@ #include "Arith_BATask.h" #include #include "Arith_FrontSolver.h" -#include "Arith_BlendMap.h" +#include "Arith_FrontBlend.h" // 水平扫描方向 enum FSCAN_DIR @@ -168,11 +168,6 @@ private: }; -void UpdatePan_CPU(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat h_inv, FPanInfo _panPara, float dep); - -#ifdef ENABLE_CUDA -void UpdatePan_CUDA(cv::Mat rgbFrame, cv::Mat pan, cv::Rect2d roi, cv::Mat h_inv, FPanInfo _panPara, float dep, cuda_Mem cuda_resor); -#endif diff --git a/stitch/src/mapKernel.cu b/stitch/src/FrontStitch/mapKernel.cu similarity index 99% rename from stitch/src/mapKernel.cu rename to stitch/src/FrontStitch/mapKernel.cu index 0e9f6ce..7bb6204 100644 --- a/stitch/src/mapKernel.cu +++ b/stitch/src/FrontStitch/mapKernel.cu @@ -3,6 +3,7 @@ #include "Arith_SysStruct.h" #include "StitchStruct.h" + __device__ Pole device_getPoleFromFPan(POINT32S pt, FPanInfo _panPara) { Pole _pole = { 0 }; diff --git a/stitch/src/StitchStruct.h b/stitch/src/StitchStruct.h index 09e1184..80f5049 100644 --- a/stitch/src/StitchStruct.h +++ b/stitch/src/StitchStruct.h @@ -53,6 +53,8 @@ struct Match_Net + + #define IMG_CACHE_SIZE (1920 * 1080 * 3) //图像缓存尺寸 #define FEA_NUM_MAX 500 // 单帧特征点数量 #define FEA_DES_SIZE 128 // 特征点描述子尺度 diff --git a/stitch/src/Version.h b/stitch/src/Version.h index 8ccfd7b..aa79ebf 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_10_29-16.20.58"; +std::string BUILD_TIME = "BUILD_TIME 2025_11_02-22.09.40"; std::string VERSION = "BUILD_VERSION 1.0.1"; diff --git a/stitch/src/utils/Arith_Utils.cpp b/stitch/src/utils/Arith_Utils.cpp index 7f10dde..09b5f6e 100644 --- a/stitch/src/utils/Arith_Utils.cpp +++ b/stitch/src/utils/Arith_Utils.cpp @@ -565,4 +565,142 @@ PXL_VAL Interpolation_RGB24(UBYTE8* pSrcImage, int iWidth, int iHeight, float x, return VAL; -} \ No newline at end of file +} + +PXL_VAL Interpolation_RGBA32(UBYTE8* pSrcImage, int iWidth, int iHeight, float x, float y) +{ + PXL_VAL VAL = { 0 }; + int nStride = iWidth * 4; + + // 四个最临近象素的坐标(i1, j1), (i2, j1), (i1, j2), (i2, j2) + int i1, i2; + int j1, j2; + + // 四个最临近象素值 + UBYTE8 f1[4], f2[4], f3[4], f4[4]; + + // 计算四个最临近象素的坐标 + i1 = MAX((int)x, 0); + i2 = MIN(i1 + 1, iWidth - 1); + j1 = MAX((int)y, 0); + j2 = MIN(j1 + 1, iHeight - 1); + + float t, s; //t = x - [x], s = y- [y]; + + t = x - i1; + s = y - j1; + + //四个最临近象素点的值的加权值 + float uv0, uv1, uv2, uv3; //权重之和为1:uv0+uv1+uv2+uv3 = 1 + uv0 = (1 - s) * (1 - t); + uv1 = (1 - s) * t; + uv2 = (1 - t) * s; + uv3 = s * t; + + + // 最近邻吧 不差这点质量了 + VAL.R = *(pSrcImage + nStride * j1 + i1 * 4); + VAL.G = *(pSrcImage + nStride * j1 + i1 * 4 + 1); + VAL.B = *(pSrcImage + nStride * j1 + i1 * 4 + 2); + VAL.A = *(pSrcImage + nStride * j1 + i1 * 4 + 3); + return VAL; + + + + //根据不同情况分别处理 + if (x - iWidth + 1 > 0) + { + // 要计算的点在图像右边缘上 + if (y - iHeight + 1 < 0) + { + // 要计算的点正好是图像最右/左下角那一个象素,直接返回该点象素值 + VAL.R = *(pSrcImage + nStride * j1 + i1 * 4); + VAL.G = *(pSrcImage + nStride * j1 + i1 * 4 + 1); + VAL.B = *(pSrcImage + nStride * j1 + i1 * 4 + 2); + VAL.A = *(pSrcImage + nStride * j1 + i1 * 4 + 3); + return VAL; + } + else + { + // 在图像右/左边缘上且不是最后一点,直接一次插值即可 + f1[0] = *(pSrcImage + nStride * j1 + i1 * 4); + f1[1] = *(pSrcImage + nStride * j1 + i1 * 4 + 1); + f1[2] = *(pSrcImage + nStride * j1 + i1 * 4 + 2); + f1[3] = *(pSrcImage + nStride * j1 + i1 * 4 + 3); + + f3[0] = *(pSrcImage + nStride * j2 + i1 * 4 + 0); + f3[1] = *(pSrcImage + nStride * j2 + i1 * 4 + 1); + f3[2] = *(pSrcImage + nStride * j2 + i1 * 4 + 2); + f3[3] = *(pSrcImage + nStride * j2 + i1 * 4 + 3); + + VAL.R = f1[0] + s * (f3[0] - f1[0]); + VAL.G = f1[1] + s * (f3[1] - f1[1]); + VAL.B = f1[2] + s * (f3[2] - f1[2]); + VAL.A = f1[3] + s * (f3[3] - f1[3]); + + // 返回插值结果 + return VAL; + } + } + else if (y - iHeight + 1 > 0) + { + // 要计算的点在图像下边缘上且不是最后一点,直接一次插值即可 + //f1 = *(pSrcImage + iWidth * j1 + i1); + //f2 = *(pSrcImage + iWidth * j1 + i2); + + f1[0] = *(pSrcImage + nStride * j1 + i1 * 4); + f1[1] = *(pSrcImage + nStride * j1 + i1 * 4 + 1); + f1[2] = *(pSrcImage + nStride * j1 + i1 * 4 + 2); + f1[3] = *(pSrcImage + nStride * j1 + i1 * 4 + 3); + + f2[0] = *(pSrcImage + nStride * j1 + i2 * 4 + 0); + f2[1] = *(pSrcImage + nStride * j1 + i2 * 4 + 1); + f2[2] = *(pSrcImage + nStride * j1 + i2 * 4 + 2); + f2[3] = *(pSrcImage + nStride * j1 + i2 * 4 + 3); + + VAL.R = f1[0] + t * (f2[0] - f1[0]); + VAL.G = f1[1] + t * (f2[1] - f1[1]); + VAL.B = f1[2] + t * (f2[2] - f1[2]); + VAL.A = f1[3] + t * (f2[3] - f1[3]); + // 返回插值结果 + return VAL; + } + else + { + // 计算四个最临近象素值 + f1[0] = *(pSrcImage + nStride * j1 + i1 * 4); + f1[1] = *(pSrcImage + nStride * j1 + i1 * 4 + 1); + f1[2] = *(pSrcImage + nStride * j1 + i1 * 4 + 2); + f1[3] = *(pSrcImage + nStride * j1 + i1 * 4 + 3); + + f2[0] = *(pSrcImage + nStride * j1 + i2 * 4); + f2[1] = *(pSrcImage + nStride * j1 + i2 * 4 + 1); + f2[2] = *(pSrcImage + nStride * j1 + i2 * 4 + 2); + f2[3] = *(pSrcImage + nStride * j1 + i2 * 4 + 3); + + f3[0] = *(pSrcImage + nStride * j2 + i1 * 4); + f3[1] = *(pSrcImage + nStride * j2 + i1 * 4 + 1); + f3[2] = *(pSrcImage + nStride * j2 + i1 * 4 + 2); + f3[3] = *(pSrcImage + nStride * j2 + i1 * 4 + 3); + + f4[0] = *(pSrcImage + nStride * j2 + i2 * 4); + f4[1] = *(pSrcImage + nStride * j2 + i2 * 4 + 1); + f4[2] = *(pSrcImage + nStride * j2 + i2 * 4 + 2); + f4[3] = *(pSrcImage + nStride * j2 + i2 * 4 + 3); + + VAL.R = uv0 * f1[0] + uv1 * f2[0] + uv2 * f3[0] + uv3 * f4[0]; + VAL.G = uv0 * f1[1] + uv1 * f2[1] + uv2 * f3[1] + uv3 * f4[1]; + VAL.B = uv0 * f1[2] + uv1 * f2[2] + uv2 * f3[2] + uv3 * f4[2]; + VAL.A = uv0 * f1[3] + uv1 * f2[3] + uv2 * f3[3] + uv3 * f4[3]; + return VAL; + } + + + + return VAL; +} + +PXL_VAL Nearest_RGBA32(UBYTE8* pSrcImage, int iWidth, int iHeight, float x, float y) +{ + return PXL_VAL(); +} diff --git a/stitch/src/utils/Arith_Utils.h b/stitch/src/utils/Arith_Utils.h index 8302362..4d0eb8d 100644 --- a/stitch/src/utils/Arith_Utils.h +++ b/stitch/src/utils/Arith_Utils.h @@ -15,6 +15,7 @@ typedef struct tagPXL_VAL UBYTE8 R; UBYTE8 G; UBYTE8 B; + UBYTE8 A; }PXL_VAL; @@ -25,6 +26,10 @@ cv::Mat getRGBMatFromGDFrame(GD_VIDEO_FRAME_S frame, void* pArr); unsigned char FourPointInterpolation(unsigned char* pSrcImage, int iWidth, int iHeight, float x, float y); PXL_VAL Interpolation_RGB24(UBYTE8* pSrcImage, int iWidth, int iHeight, float x, float y); +PXL_VAL Interpolation_RGBA32(UBYTE8* pSrcImage, int iWidth, int iHeight, float x, float y); + +PXL_VAL Nearest_RGBA32(UBYTE8* pSrcImage, int iWidth, int iHeight, float x, float y); + // 矩阵加法 void AddMat(double* A, double* B, int mn, double* AaddB); diff --git a/tests/ProcDJ.cpp b/tests/ProcDJ.cpp index e2a96f7..f271da7 100644 --- a/tests/ProcDJ.cpp +++ b/tests/ProcDJ.cpp @@ -233,7 +233,7 @@ void ProcDJVideo(vector videoPathList, vector srtPathL cv::VideoCapture cap(videoPathList[vid]); std::vector srt = parseDJISRT(srtPathList[vid]); - cap.set(cv::CAP_PROP_POS_FRAMES, nStart - 1); + cap.set(cv::CAP_PROP_POS_FRAMES, nStart); int frmID = nStart; while (true) { @@ -315,6 +315,8 @@ void ProcDJVideo(vector videoPathList, vector srtPathL tm.stop(); + printf("cost time:%f\n", tm.getTimeSec()); + Mat pan_rgb, pan_rgb_ds; cv::cvtColor(mat_pan, pan_rgb, cv::COLOR_BGRA2BGR); @@ -344,6 +346,18 @@ void ProcDJVideo(vector videoPathList, vector srtPathL output.release(); + Mat pan_rgb, pan_rgb_ds; + cv::cvtColor(mat_pan, pan_rgb, cv::COLOR_BGRA2BGR); + + cv::resize(pan_rgb, pan_rgb_ds, cv::Size(pan_rgb.cols / 8, pan_rgb.rows / 8)); + + output.write(pan_rgb_ds); + + imshow("pan_rgb", pan_rgb_ds); + + cv::waitKey(0); + + } } @@ -360,7 +374,7 @@ int main() string folder = "F:/DJI_202504181507_016/"; - folder = "F:/"; + folder = "D:/H30T云台/DJI_202504181507_016/"; //string folder = "/media/wang/data/DJI_202504181507_016/"; // //videoPathList.push_back(folder + "DJI_20250418152649_0005_W.MP4"); @@ -368,9 +382,11 @@ int main() // videoPathList.push_back(folder + "DJI_20250418153043_0006_W.MP4"); //srtPathList.push_back(folder + "DJI_20250418153043_0006_W.srt"); + videoPathList.push_back(folder + "DJI_20250418152649_0005_W.MP4"); + srtPathList.push_back(folder + "DJI_20250418152649_0005_W.srt"); - videoPathList.push_back(folder + "DJI_20251024165313_0001_W.MP4"); - srtPathList.push_back(folder + "DJI_20251024165313_0001_W.srt"); + //videoPathList.push_back(folder + "DJI_20250418153043_0006_W.MP4"); + //srtPathList.push_back(folder + "DJI_20250418153043_0006_W.srt"); ProcDJVideo(videoPathList, srtPathList); return 0; diff --git a/tests/decodedata.cpp b/tests/decodedata.cpp index c9e1883..50b1c2a 100644 --- a/tests/decodedata.cpp +++ b/tests/decodedata.cpp @@ -195,6 +195,8 @@ void DecodeData::Init() m_ptrThread_DataDealwith = new std::thread(std::bind(&DecodeData::ThreadEntry, &DecodeData::ThreadFunData, (void*)this)); m_frontStitcher = API_FrontStitch::Create(); + + m_underStitcher = API_UnderStitch::Create("E:/google_tiles"); } void DecodeData::UnInit() @@ -628,12 +630,57 @@ int DecodeData::DecodeRGBImageAndPara(unsigned char *RGBBuffer, H264SEI_Para_732 - // 前视拼接初始化 + //// 前视拼接初始化 + //if (m_FrameNo == 1) + //{ + // ScanRange scanAz = { -30,30 }; + // ScanRange scanPt = { -10,-10 }; + // m_frontStitcher->Init(para, scanAz, scanPt); + //} + //else + //{ + // // 基于外参的快拼 + // GD_VIDEO_FRAME_S frame = { 0 };//输入帧 + // frame.enPixelFormat = GD_PIXEL_FORMAT_RGB_PACKED; + // frame.u32Width = bgr_mat.cols; + // frame.u32Height = bgr_mat.rows; + // frame.u64VirAddr[0] = bgr_mat.data; + // GD_VIDEO_FRAME_S pan = { 0 };//输出全景 + // //m_frontStitcher->Run(frame, para); + + + // AI_Target tt = { 0 }; + // tt.score = 0.6; + // tt.x1 = 100; + // tt.x2 = 110; + // tt.y1 = 200; + // tt.y2 = 250; + + // m_frontStitcher->Run(frame, para, &tt, 1); + + + // pan = m_frontStitcher->ExportPanAddr(); + // cv::Mat mat_pan = cv::Mat(pan.u32Height, pan.u32Width, CV_8UC3, pan.u64VirAddr[0]); + // // 显示全景图 + // cv::Mat res; + // cv::resize(mat_pan, res, cv::Size(pan.u32Width / 2, pan.u32Height / 2)); + // imshow("pan", res); + // cv::waitKey(1); + //} + + + if (m_FrameNo == 1) { - ScanRange scanAz = { -30,30 }; - ScanRange scanPt = { -10,-10 }; - m_frontStitcher->Init(para, scanAz, scanPt); + m_underStitcher->Init(para); + + UPanConfig cfg = { 0 }; + + cfg.bOutGoogleTile = true; + + m_underStitcher->SetConfig(cfg); + + m_underStitcher->SetOutput("baotou", "E:/google_tiles"); } else { @@ -644,29 +691,26 @@ int DecodeData::DecodeRGBImageAndPara(unsigned char *RGBBuffer, H264SEI_Para_732 frame.u32Height = bgr_mat.rows; frame.u64VirAddr[0] = bgr_mat.data; GD_VIDEO_FRAME_S pan = { 0 };//输出全景 - //m_frontStitcher->Run(frame, para); + cv::TickMeter tm; + tm.start(); - AI_Target tt = { 0 }; - tt.score = 0.6; - tt.x1 = 100; - tt.x2 = 110; - tt.y1 = 200; - tt.y2 = 250; + m_underStitcher->Run(frame, para); - m_frontStitcher->Run(frame, para, &tt, 1); + tm.stop(); + printf("time cost:%f\n", tm.getTimeSec()); - pan = m_frontStitcher->ExportPanAddr(); - cv::Mat mat_pan = cv::Mat(pan.u32Height, pan.u32Width, CV_8UC3, pan.u64VirAddr[0]); + pan = m_underStitcher->ExportPanAddr(); + cv::Mat mat_pan = cv::Mat(pan.u32Height, pan.u32Width, CV_8UC4, pan.u64VirAddr[0]); // 显示全景图 cv::Mat res; - cv::resize(mat_pan, res, cv::Size(pan.u32Width / 2, pan.u32Height / 2)); + cv::resize(mat_pan, res, cv::Size(pan.u32Width / 8, pan.u32Height / 8)); imshow("pan", res); cv::waitKey(1); } - return 0; + return 0; } diff --git a/tests/decodedata.h b/tests/decodedata.h index 50abceb..d24a8fb 100644 --- a/tests/decodedata.h +++ b/tests/decodedata.h @@ -23,6 +23,7 @@ extern "C" { #endif #include "API_FrontStitch.h" +#include "API_UnderStitch.h" #define UDP_BUFFER_LENGTHIMG 1024 #define UDPIMGWIDTH 1920 @@ -148,6 +149,8 @@ public: void DecodeH264Data(uint8_t *h264Data, long dataLength); API_FrontStitch* m_frontStitcher; + + API_UnderStitch* m_underStitcher; }; #endif // DECODEDATA_H diff --git a/tests/stitch_Genaral.cpp b/tests/stitch_Genaral.cpp index 87ff744..52e7e16 100644 --- a/tests/stitch_Genaral.cpp +++ b/tests/stitch_Genaral.cpp @@ -151,7 +151,7 @@ void Run_UnderStitch(std::string picFloder) Mat pan_rgb, pan_rgb_ds; cv::cvtColor(mat_pan, pan_rgb, cv::COLOR_BGRA2BGR); - cv::resize(pan_rgb, pan_rgb_ds, cv::Size(pan_rgb.cols / 4, pan_rgb.rows /4)); + cv::resize(pan_rgb, pan_rgb_ds, cv::Size(pan_rgb.cols / 8, pan_rgb.rows /4)); imshow("", pan_rgb_ds); @@ -176,11 +176,9 @@ void Run_UnderStitch(std::string picFloder) int main(int argc, char** argv) { printf("Hello World General\n"); - //Run_FrontStitch("F:/S729/1_output"); - //Run_FrontStitch("F:/20250928_145957066_9前视扫描_output"); - //Run_UnderStitch("F:/20250928_145957066_9前视扫描_output"); - //Run_UnderStitch("F:/20250928_155516413_28房子_output"); + + Run_UnderStitch("F:/DJI_20250418152649_0005_W_output"); return 0; } \ No newline at end of file diff --git a/tests/stitch_udp.cpp b/tests/stitch_udp.cpp index d854015..5a37076 100644 --- a/tests/stitch_udp.cpp +++ b/tests/stitch_udp.cpp @@ -5,12 +5,12 @@ int main(int argc, char* argv[]) { DecodeData* m_DecodeData = new DecodeData(); - std::string filestr = "D:/Project/S732/udp_datat/720vi.dat"; + std::string filestr = "C:/Users/75929/Desktop/S732/1101VL.dat"; //std::string filestr = "E:/03855jcw/S732/H265data/1080ir2.dat"; m_DecodeData->m_CurrentVideo = 1;//0:红外,1:可见光 - m_DecodeData->m_LocalHeight = 10;// 本地海拔 + m_DecodeData->m_LocalHeight = 1365;// 本地海拔 m_DecodeData->Init(); m_DecodeData->processFileInChunks(filestr, 10 * 1024);