新增热成像和多模态融合

pull/10/head
Surponess 2 weeks ago
parent 3fc545d580
commit 31b1a378ad

@ -0,0 +1,456 @@
# 多模态威胁融合系统 — 使用说明
## 概述
多模态威胁融合系统将热成像、闪光检测、声源检测三条感知管道的输出进行融合,生成综合威胁评估并输出避障指令。
系统提供两个版本:
- **C++ 版** (`cpp/`) — 直接编译运行,集成 Prometheus uav_control 框架,适用于 P600 无人机实机部署
- **Python 版** (`threat_fusion_node.py`) — 早期 ROS 1 原型,通过 subprocess 调用热成像检测器
## 系统架构
```
┌─────────────────────────────────────────────┐
│ threat_fusion (C++ ROS 节点) │
│ │
SpireCV 吊舱 ──Image──► │ ThermalBridge (直接 C++ 调用检测器) │
│ │ │
闪光检测节点 ──ROS───► │ ThreatCache (时间窗口缓存) │
│ │ │
声源检测节点 ──ROS───► │ FusionEngine (融合引擎) │
│ │ │
uav_control ──State───► │ AvoidanceController (避障控制器) │
(UAVState) │ │ │
│ GimbalController (AT10 云台追踪) │
└────┬──────────┬──────────┬────────────────┘
│ │ │
UAVCommand │ 状态/威胁 TextInfo
(ENU 速度) │ │ (地面站)
▼ ▼ ▼
Prometheus rosbridge QGC
uav_control → 浏览器
→ PX4
```
### Prometheus uav_control 框架集成
本系统通过 Prometheus `prometheus_msgs``uav_control` 模块通信,遵循其话题命名空间和控制接口规范:
```
/uav{N}/prometheus/state → 读取无人机状态 (UAVState)
/uav{N}/prometheus/command → 发送避障速度指令 (UAVCommand)
/uav{N}/prometheus/control_state → 读取控制状态机 (UAVControlState)
/uav{N}/prometheus/text_info → 地面站告警消息 (TextInfo)
```
## 机载电脑部署指南 (Jetson Orin Nano)
### 目录结构
在机载电脑上,代码应部署到 Prometheus catkin 工作空间的以下位置:
```
~/Prometheus/
├── Modules/
│ ├── uav_control/ # Prometheus 核心控制模块 (已存在)
│ │ ├── src/uav_control_node.cpp
│ │ ├── src/uav_controller.cpp
│ │ ├── src/uav_estimator.cpp
│ │ └── launch/
│ │ ├── uav_control_main_outdoor.launch # P600 室外启动文件
│ │ └── uav_control_outdoor.yaml # 室外参数配置
│ │
│ ├── common/
│ │ └── prometheus_msgs/ # Prometheus 自定义消息 (已存在)
│ │
│ ├── communication/ # MAVLink 通信桥接 (已存在)
│ │
│ └── threat_fusion/ # ★ 本系统 — 多模态威胁融合 ★
│ ├── CMakeLists.txt
│ ├── package.xml
│ ├── include/
│ │ ├── fusion_types.h # 融合类型定义 (威胁等级/配置)
│ │ ├── fusion_engine.h # 融合引擎
│ │ ├── threat_cache.h # 时间窗口缓存
│ │ ├── avoidance_controller.h # 避障控制器
│ │ └── gimbal_controller.h # AT10 云台控制器
│ ├── src/
│ │ ├── main.cpp # ROS 节点入口 (Prometheus 集成)
│ │ ├── fusion_engine.cpp # 融合逻辑实现
│ │ ├── avoidance_controller.cpp # 避障算法实现
│ │ └── gimbal_controller.cpp # 云台控制实现
│ ├── launch/
│ │ └── threat_fusion.launch # 融合节点启动文件
│ └── config/
│ └── threat_fusion_params.yaml # 参数配置
├── 热成像识别/ # ★ 热成像检测模块 (依赖) ★
│ └── cpp/
│ ├── include/
│ │ ├── thermal_types.h
│ │ ├── thermal_detector.h
│ │ └── thermal_preprocessor.h
│ └── src/
│ ├── thermal_detector.cpp
│ └── thermal_preprocessor.cpp
├── Simulator/ # Gazebo 仿真环境 (已存在)
├── Scripts/ # 构建/测试脚本 (已存在)
└── compile_all.sh # 主构建脚本
```
### 安装步骤
#### 1. 复制代码到 catkin 工作空间
```bash
# 在机载电脑上
cd ~/Prometheus/Modules/
# 复制融合模块
cp -r /path/to/多模态融合/cpp/ threat_fusion/
# 复制热成像检测模块 (如果尚未存在)
mkdir -p 热成像识别/cpp
cp -r /path/to/热成像识别/cpp/ 热成像识别/
```
#### 2. 创建 ROS 包配置
如果 `threat_fusion` 还不是一个 catkin 包,创建 `package.xml`:
```xml
<package>
<name>threat_fusion</name>
<version>1.0.0</version>
<description>多模态威胁融合 ROS 节点</description>
<maintainer email="dev@example.com">developer</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<depend>std_msgs</depend>
<depend>sensor_msgs</depend>
<depend>geometry_msgs</depend>
<depend>diagnostic_msgs</depend>
<depend>cv_bridge</depend>
<depend>prometheus_msgs</depend>
<depend>libopencv-dev</depend>
</package>
```
#### 3. 编译
```bash
cd ~/Prometheus
catkin_make --pkg threat_fusion
# 或使用 catkin build
catkin build threat_fusion
```
#### 4. 创建启动文件
`launch/threat_fusion.launch`:
```xml
<launch>
<!-- 多模态威胁融合节点 -->
<node pkg="threat_fusion" type="threat_fusion" name="threat_fusion"
output="screen" respawn="true">
<!-- 无人机编号 -->
<param name="uav_id" value="1" />
<!-- 模态开关 -->
<param name="thermal_enabled" value="true" />
<param name="flash_enabled" value="true" />
<param name="acoustic_enabled" value="true" />
<!-- 热成像相机参数 -->
<param name="thermal_image_topic" value="/uav1/gimbal/image_original" />
<param name="thermal_hfov" value="32.0" />
<!-- 避障参数 -->
<param name="avoidance_enabled" value="true" />
<param name="avoidance_speed" value="2.0" />
<param name="avoidance_decel_distance" value="10.0" />
<param name="maximum_safe_vel_xy" value="5.0" />
<param name="maximum_safe_vel_z" value="4.0" />
<!-- AT10 吊舱参数 -->
<param name="gimbal_port" value="/dev/ttyUSB1" />
<param name="gimbal_kp" value="1.0" />
</node>
</launch>
```
#### 5. 启动顺序
```bash
# 1. 启动 uav_control (必须先启动)
roslaunch prometheus_uav_control uav_control_main_outdoor.launch uav_id:=1 sim_mode:=false
# 2. 启动 SpireCV 吊舱服务
roslaunch spirecv at10_gimbal_server.launch
# 3. 启动融合节点
roslaunch threat_fusion threat_fusion.launch
# 4. (可选) 启动闪光/声源检测节点
rosrun flash_detector flash_detector_node
rosrun acoustic_analyzer acoustic_analyzer_node
```
## 接口适配说明
### 1. 避障指令接口
**原设计 (Python/MAVROS)**:
- 发布 `geometry_msgs/TwistStamped``/uav1/mavros/setpoint_velocity/cmd_vel`
- 直接控制 MAVROS 速度
**现设计 (C++/Prometheus)**:
- 发布 `prometheus_msgs/UAVCommand``/uav1/prometheus/command`
- 使用 `Move_mode = XYZ_VEL` (ENU 速度控制)
- `uav_control` 内部转换为 MAVROS `PositionTarget` 发送给 PX4
- 附加 `Command_ID` 单调递增,防止过期指令执行
```
UAVCommand:
Agent_CMD = Move (4)
Move_mode = XYZ_VEL (2)
velocity_ref[0] = vx (East, m/s)
velocity_ref[1] = vy (North, m/s)
velocity_ref[2] = vz (Up, m/s)
yaw_ref = 当前航向 (rad, 保持)
Command_ID = 自增 ID
```
**适配要点**:
- 速度限制对齐 `uav_control_outdoor.yaml``maximum_safe_vel_xy/z`
- 地理围栏检查在发送前执行,防止指令超出安全区域
- 控制状态机须处于 `COMMAND_CONTROL(2)` 模式,指令才会被 `uav_control` 执行
### 2. 无人机状态接口
**原设计 (Python/MAVROS)**:
- 订阅 `/uav1/mavros/local_position/pose` (`geometry_msgs/PoseStamped`)
- 从四元数提取航向角
**现设计 (C++/Prometheus)**:
- 订阅 `/uav1/prometheus/state` (`prometheus_msgs/UAVState`)
- 直接读取 `position[0-2]` (ENU 位置)、`attitude[2]` (yaw rad)
- ENU yaw → 北基准顺时针: `heading = (90 - yaw_deg) % 360`
**适配要点**:
- UAVState 由 `uav_estimator` 统一发布,包含传感器融合后的位置/姿态
- 室外模式使用 GPS/RTK 定位 (location_source=4 或 5)
- 支持多种定位源自动切换 (GPS, RTK, VINS, FAST-LIO 等)
### 3. 热成像检测接口
**原设计 (Python)**:
- 通过 `subprocess` 调用 `thermal_detector.exe`,解析 JSON 输出
- 延迟高 (~500ms)、需要磁盘 I/O
**现设计 (C++)**:
- 直接调用 `ThermalPreprocessor::preprocess()` + `ThermalDetector::detect()`
- 纯内存操作,延迟低 (~50ms)
- 检测结果直接填充 `ThermalCacheEntry`,无需 JSON 序列化/反序列化
**适配要点**:
- 热成像检测源文件 (`thermal_detector.cpp`, `thermal_preprocessor.cpp`) 直接编译进融合节点
- CMakeLists.txt 中通过 `THERMAL_DETECTOR_DIR` 引用外部热成像模块路径
- 部署时确保两个模块在同一工作空间
### 4. 云台控制接口
**SpireCV 直接控制** (USE_SPIRECV 宏):
- 通过串口 (`/dev/ttyUSB1`) 直接控制 AT10 Pro 吊舱
- 使用 SpireCV SDK 的 `sv::Gimbal` API
- 适用于无 ROS 云台服务的场景
**SpireCV ROS 服务** (通过 ROS 话题):
- 订阅 `/uav1/gimbal/image_original` 获取吊舱图像
- 可通过 `prometheus_msgs/GimbalControl` 控制云台角度/速度
**适配要点**:
- P600 手册约定: pitch 下俯为正, yaw 左转为正
- 追踪参数: kp_gimbal=1.0, max_yaw_rate=40°/s
- 追踪时使用 `setAngleRateEuler()` 平滑旋转
### 5. 检测结果发布
**新增接口**: 将热成像检测结果发布为 `prometheus_msgs/MultiDetectionInfo`
```
MultiDetectionInfo:
num_objs = 检测数量
detect_or_track = 0 (检测模式)
detection_infos[]:
object_name = "Person" / "Hotspot" / "Barrel Overheat"
pixel_position = [cx, cy]
category = 1(Person), 2(Hotspot), 3(Barrel), 4(Weapon)
```
这使其他 Prometheus 模块 (如 `yolov5_tracking`) 可以复用检测结果进行目标追踪。
### 6. 地面站告警接口
**新增**: 通过 `prometheus_msgs/TextInfo` 向地面站发送威胁告警
```
TextInfo:
MessageType = INFO(0) | WARN(1) | ERROR(2) | FATAL(3)
Message = "ThreatFusion: WARNING | 2 threats | avoidance=ON"
```
告警等级映射:
- WARNING 威胁 → TextInfo.WARN
- DANGER 威胁 → TextInfo.ERROR
- CRITICAL 威胁 → TextInfo.FATAL
## 安全机制
### 地理围栏
避障指令在发送前检查地理围栏 (对齐 `uav_control_outdoor.yaml`):
```yaml
geo_fence:
x_min: -1000.0, x_max: 1000.0
y_min: -1000.0, y_max: 1000.0
z_min: -50.0, z_max: 1000.0
```
### 速度限制
避障速度限制在 `uav_control` 安全范围内:
- 水平: ±5.0 m/s (与 `maximum_safe_vel_xy` 对齐)
- 垂直: ±4.0 m/s (与 `maximum_safe_vel_z` 对齐)
### 控制状态检查
仅当无人机已解锁 (`UAVState.armed = true`) 时才发送避障指令。
## 坐标系
系统使用 ENU (East-North-Up) 坐标系,与 Prometheus uav_control 框架一致:
| 轴 | 方向 | 说明 |
|----|------|------|
| X | East (东) | ENU 水平 |
| Y | North (北) | ENU 水平 |
| Z | Up (上) | 垂直 |
航向约定:
- Prometheus `UAVState.attitude[2]`: yaw=0 指向东,逆时针为正 (rad)
- 融合引擎内部: heading=0 指向北,顺时针为正 (deg)
- 转换: `heading = (90 - yaw_rad × 180/π) % 360`
## 编译选项
| 选项 | 说明 | 默认 |
|------|------|------|
| `USE_ROS` | 启用 ROS 节点模式 (需要 catkin) | OFF |
| `USE_SPIRECV` | 启用 SpireCV 吊舱控制 (需要 SpireCV SDK) | OFF |
```bash
# 独立测试模式 (无 ROS)
mkdir build && cd build
cmake ..
cmake --build . --config Release
# ROS 节点模式
cd ~/Prometheus
catkin_make --pkg threat_fusion --cmake-args -DUSE_ROS=ON -DUSE_SPIRECV=ON
# 仅 ROS, 不含 SpireCV
catkin_make --pkg threat_fusion --cmake-args -DUSE_ROS=ON
```
## 独立测试 (无 ROS)
```bash
# 单图检测
./threat_fusion ../test/test_images/20260510170010_1.jpg --json --no-show
# 模拟融合
./threat_fusion ../test/test_images/20260510170010_1.jpg --simulate
# 云台测试 (需要 SpireCV)
./threat_fusion --gimbal-test
# 批量处理
./threat_fusion ../test/test_images/ --json --no-show
```
## 参数配置
### ROS 参数
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `~uav_id` | int | 1 | 无人机编号 (用于话题命名空间) |
| `~thermal_image_topic` | string | `/uav1/gimbal/image_original` | 热成像图像话题 |
| `~thermal_enabled` | bool | true | 启用热成像模态 |
| `~thermal_hfov` | float | 32.0 | 热成像水平视场角 (度) |
| `~flash_enabled` | bool | true | 启用闪光模态 |
| `~acoustic_enabled` | bool | true | 启用声源模态 |
| `~avoidance_enabled` | bool | true | 启用避障 |
| `~avoidance_speed` | float | 2.0 | 避障最大速度 (m/s) |
| `~avoidance_decel_distance` | float | 10.0 | 开始减速的距离 (m) |
| `~maximum_safe_vel_xy` | float | 5.0 | 最大安全水平速度 (m/s) |
| `~maximum_safe_vel_z` | float | 4.0 | 最大安全垂直速度 (m/s) |
| `~gimbal_port` | string | `/dev/ttyUSB1` | AT10 吊舱串口 |
| `~gimbal_kp` | float | 1.0 | 云台追踪比例增益 |
### 融合算法参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| 热成像权重 | 0.35 | 热成像检测置信度权重 |
| 闪光权重 | 0.30 | 闪光检测置信度权重 |
| 声源权重 | 0.35 | 声源检测置信度权重 |
| 跨模态2确认奖励 | +0.25 | 两种模态确认同一威胁 |
| 跨模态3确认奖励 | +0.40 | 三种模态确认同一威胁 |
| 空间关联阈值 | 15° | 不同模态方位角差小于此值合并 |
| 时间窗口 | 0.5s | 融合数据时间窗口 |
## 文件说明
### C++ 版本
```
多模态融合/cpp/
├── CMakeLists.txt # 编译配置 (支持 ROS/非ROS 双模式)
├── include/
│ ├── fusion_types.h # 融合类型定义 (威胁等级/配置/Prometheus 话题)
│ ├── fusion_engine.h # 融合引擎接口
│ ├── threat_cache.h # 线程安全时间窗口缓存
│ ├── avoidance_controller.h # 避障控制器接口
│ └── gimbal_controller.h # AT10 云台控制器接口
└── src/
├── main.cpp # 入口: ROS 节点 (Prometheus 集成) / 独立测试
├── fusion_engine.cpp # 融合算法 (空间关联/置信度融合/等级升级)
├── avoidance_controller.cpp # 避障算法 (斥力/合成/平滑/冷却)
└── gimbal_controller.cpp # 云台控制 (SpireCV AT10 Pro)
```
### Python 版本 (已弃用)
```
多模态融合/
└── threat_fusion_node.py # Python ROS 1 原型 (921 行)
```
## 错误处理
| 故障 | 行为 |
|------|------|
| uav_control 未启动 | 等待 10s 后继续运行,航向为 0 |
| 热成像检测连续 5 次失败 | 自动禁用热成像模态 |
| 避障指令超出地理围栏 | 拦截指令,不发送 |
| SpireCV 未启用 | 云台模拟模式,输出日志 |
| 全部模态失效 | 输出 SAFE 状态,不触发避障 |
| 无人机未解锁 | 计算避障但不发送指令 |

@ -0,0 +1,77 @@
cmake_minimum_required(VERSION 3.16)
project(threat_fusion LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#
option(USE_ROS "启用 ROS 节点模式 (需要 roscpp)" OFF)
option(USE_SPIRECV "启用 SpireCV 吊舱控制 (需要 SpireCV 库)" OFF)
#
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs highgui)
# ( /cpp )
set(THERMAL_DETECTOR_DIR "${CMAKE_SOURCE_DIR}/../../热成像识别/cpp")
#
set(FUSION_SOURCES
src/fusion_engine.cpp
src/avoidance_controller.cpp
src/gimbal_controller.cpp
src/main.cpp
# ( Python subprocess )
${THERMAL_DETECTOR_DIR}/src/thermal_preprocessor.cpp
${THERMAL_DETECTOR_DIR}/src/thermal_detector.cpp
)
# ROS
if(USE_ROS)
find_package(catkin REQUIRED COMPONENTS
roscpp std_msgs geometry_msgs sensor_msgs cv_bridge
diagnostic_msgs
prometheus_msgs
)
add_definitions(-DUSE_ROS)
include_directories(${catkin_INCLUDE_DIRS})
endif()
# SpireCV
if(USE_SPIRECV)
add_definitions(-DUSE_SPIRECV)
# SpireCV ()
find_package(SpireCV QUIET)
if(NOT SpireCV_FOUND)
message(WARNING "SpireCV 未找到, 请设置 SpireCV_DIR 或手动指定包含路径")
endif()
endif()
add_executable(threat_fusion ${FUSION_SOURCES})
target_include_directories(threat_fusion PRIVATE
${CMAKE_SOURCE_DIR}/include
${THERMAL_DETECTOR_DIR}/include
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(threat_fusion PRIVATE
${OpenCV_LIBS}
)
if(USE_ROS)
target_link_libraries(threat_fusion PRIVATE ${catkin_LIBRARIES})
endif()
if(USE_SPIRECV AND SpireCV_FOUND)
target_include_directories(threat_fusion PRIVATE ${SpireCV_INCLUDE_DIRS})
target_link_libraries(threat_fusion PRIVATE ${SpireCV_LIBRARIES})
endif()
target_compile_options(threat_fusion PRIVATE /utf-8 /EHsc)
# Windows:
set_target_properties(threat_fusion PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}"
)

File diff suppressed because one or more lines are too long

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<CustomBuild Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\CMakeLists.txt" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
</Project>

@ -0,0 +1,317 @@
# This is the CMakeCache file.
# For build in directory: d:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build
# It was generated by CMake: C:/Users/29578/.conda/envs/opencv-build/Library/bin/cmake.exe
# You can edit this file to change values found and used by cmake.
# If you do not want to change any of the values, simply exit the editor.
# If you do want to change a value, simply edit, save, and exit the editor.
# The syntax for the file is as follows:
# KEY:TYPE=VALUE
# KEY is the name of a variable in the cache.
# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
# VALUE is the current value for the KEY.
########################
# EXTERNAL cache entries
########################
//Path to a program.
CMAKE_AR:FILEPATH=D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/lib.exe
//Semicolon separated list of supported configuration types, only
// supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything
// else will be ignored.
CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo
//Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=/DWIN32 /D_WINDOWS /GR /EHsc
//Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=/Zi /Ob0 /Od /RTC1
//Flags used by the CXX compiler during MINSIZEREL builds.
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=/O1 /Ob1 /DNDEBUG
//Flags used by the CXX compiler during RELEASE builds.
CMAKE_CXX_FLAGS_RELEASE:STRING=/O2 /Ob2 /DNDEBUG
//Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=/Zi /O2 /Ob1 /DNDEBUG
//Libraries linked by default with all C++ applications.
CMAKE_CXX_STANDARD_LIBRARIES:STRING=kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
//Flags used by the linker during all build types.
CMAKE_EXE_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the linker during DEBUG builds.
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
//Flags used by the linker during MINSIZEREL builds.
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
//Flags used by the linker during RELEASE builds.
CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
//Flags used by the linker during RELWITHDEBINFO builds.
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
//Value Computed by CMake.
CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/pkgRedirects
//Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=C:/Program Files/threat_fusion
//Path to a program.
CMAKE_LINKER:FILEPATH=D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/link.exe
//Flags used by the linker during the creation of modules during
// all build types.
CMAKE_MODULE_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the linker during the creation of modules during
// DEBUG builds.
CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
//Flags used by the linker during the creation of modules during
// MINSIZEREL builds.
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of modules during
// RELEASE builds.
CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of modules during
// RELWITHDEBINFO builds.
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
//Path to a program.
CMAKE_MT:FILEPATH=CMAKE_MT-NOTFOUND
//Value Computed by CMake
CMAKE_PROJECT_COMPAT_VERSION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_DESCRIPTION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_HOMEPAGE_URL:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_NAME:STATIC=threat_fusion
//Value Computed by CMake
CMAKE_PROJECT_SPDX_LICENSE:STATIC=
//RC compiler
CMAKE_RC_COMPILER:FILEPATH=rc
//Flags for Windows Resource Compiler during all build types.
CMAKE_RC_FLAGS:STRING=-DWIN32
//Flags for Windows Resource Compiler during DEBUG builds.
CMAKE_RC_FLAGS_DEBUG:STRING=-D_DEBUG
//Flags for Windows Resource Compiler during MINSIZEREL builds.
CMAKE_RC_FLAGS_MINSIZEREL:STRING=
//Flags for Windows Resource Compiler during RELEASE builds.
CMAKE_RC_FLAGS_RELEASE:STRING=
//Flags for Windows Resource Compiler during RELWITHDEBINFO builds.
CMAKE_RC_FLAGS_RELWITHDEBINFO:STRING=
//Flags used by the linker during the creation of shared libraries
// during all build types.
CMAKE_SHARED_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the linker during the creation of shared libraries
// during DEBUG builds.
CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
//Flags used by the linker during the creation of shared libraries
// during MINSIZEREL builds.
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of shared libraries
// during RELEASE builds.
CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of shared libraries
// during RELWITHDEBINFO builds.
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
//If set, runtime paths are not added when installing shared libraries,
// but are added when building.
CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
//If set, runtime paths are not added when using shared libraries.
CMAKE_SKIP_RPATH:BOOL=NO
//Flags used by the archiver during the creation of static libraries
// during all build types.
CMAKE_STATIC_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the archiver during the creation of static libraries
// during DEBUG builds.
CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the archiver during the creation of static libraries
// during MINSIZEREL builds.
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the archiver during the creation of static libraries
// during RELEASE builds.
CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the archiver during the creation of static libraries
// during RELWITHDEBINFO builds.
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//If this value is on, makefiles will be generated without the
// .SILENT directive, and all commands will be echoed to the console
// during the make. This is useful for debugging only. With Visual
// Studio IDE projects all commands are done without /nologo.
CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
//The directory containing a CMake configuration file for OpenCV.
OpenCV_DIR:PATH=C:/Users/29578/.conda/envs/opencv-build/Library/cmake
//启用 ROS 节点模式 (需要 roscpp)
USE_ROS:BOOL=OFF
//启用 SpireCV 吊舱控制 (需要 SpireCV 库)
USE_SPIRECV:BOOL=OFF
//Value Computed by CMake
threat_fusion_BINARY_DIR:STATIC=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build
//Value Computed by CMake
threat_fusion_IS_TOP_LEVEL:STATIC=ON
//Value Computed by CMake
threat_fusion_SOURCE_DIR:STATIC=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp
########################
# INTERNAL cache entries
########################
//ADVANCED property for variable: CMAKE_AR
CMAKE_AR-ADVANCED:INTERNAL=1
//This is the directory where this CMakeCache.txt was created
CMAKE_CACHEFILE_DIR:INTERNAL=d:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build
//Major version of cmake used to create the current loaded cache
CMAKE_CACHE_MAJOR_VERSION:INTERNAL=4
//Minor version of cmake used to create the current loaded cache
CMAKE_CACHE_MINOR_VERSION:INTERNAL=3
//Patch version of cmake used to create the current loaded cache
CMAKE_CACHE_PATCH_VERSION:INTERNAL=2
//Path to CMake executable.
CMAKE_COMMAND:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/bin/cmake.exe
//Path to cpack program executable.
CMAKE_CPACK_COMMAND:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/bin/cpack.exe
//Path to ctest program executable.
CMAKE_CTEST_COMMAND:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/bin/ctest.exe
//ADVANCED property for variable: CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES
CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1
//Executable file format
CMAKE_EXECUTABLE_FORMAT:INTERNAL=Unknown
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//Name of external makefile project generator.
CMAKE_EXTRA_GENERATOR:INTERNAL=
//Name of generator.
CMAKE_GENERATOR:INTERNAL=Visual Studio 17 2022
//Generator instance identifier.
CMAKE_GENERATOR_INSTANCE:INTERNAL=D:/vs
//Name of generator platform.
CMAKE_GENERATOR_PLATFORM:INTERNAL=x64
//Name of generator toolset.
CMAKE_GENERATOR_TOOLSET:INTERNAL=
//Source directory with the top level CMakeLists.txt file for this
// project
CMAKE_HOME_DIRECTORY:INTERNAL=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp
//ADVANCED property for variable: CMAKE_LINKER
CMAKE_LINKER-ADVANCED:INTERNAL=1
//Name of CMakeLists files to read
CMAKE_LIST_FILE_NAME:INTERNAL=CMakeLists.txt
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MT
CMAKE_MT-ADVANCED:INTERNAL=1
//number of local generators
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1
//Platform information initialized
CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1
//noop for ranlib
CMAKE_RANLIB:INTERNAL=:
//ADVANCED property for variable: CMAKE_RC_COMPILER
CMAKE_RC_COMPILER-ADVANCED:INTERNAL=1
CMAKE_RC_COMPILER_WORKS:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS
CMAKE_RC_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_DEBUG
CMAKE_RC_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_MINSIZEREL
CMAKE_RC_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_RELEASE
CMAKE_RC_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_RELWITHDEBINFO
CMAKE_RC_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//Path to CMake installation.
CMAKE_ROOT:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH
CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_RPATH
CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG
CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE
CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
//Details about finding OpenCV
FIND_PACKAGE_MESSAGE_DETAILS_OpenCV:INTERNAL=[C:/Users/29578/.conda/envs/opencv-build/Library][found components: core imgproc imgcodecs highgui ][v4.13.0()]

@ -0,0 +1,102 @@
set(CMAKE_CXX_COMPILER "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe")
set(CMAKE_CXX_COMPILER_ARG1 "")
set(CMAKE_CXX_COMPILER_ID "MSVC")
set(CMAKE_CXX_COMPILER_VERSION "19.43.34808.0")
set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "")
set(CMAKE_CXX_COMPILER_WRAPPER "")
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14")
set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "OFF")
set(CMAKE_CXX_STANDARD_LATEST "23")
set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23")
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17")
set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20")
set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23")
set(CMAKE_CXX26_COMPILE_FEATURES "")
set(CMAKE_CXX_PLATFORM_ID "Windows")
set(CMAKE_CXX_SIMULATE_ID "")
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "MSVC")
set(CMAKE_CXX_COMPILER_APPLE_SYSROOT "")
set(CMAKE_CXX_SIMULATE_VERSION "")
set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x64")
set(MSVC_CXX_ARCHITECTURE_ID x64)
set(CMAKE_AR "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/lib.exe")
set(CMAKE_CXX_COMPILER_AR "")
set(CMAKE_RANLIB ":")
set(CMAKE_CXX_COMPILER_RANLIB "")
set(CMAKE_LINKER "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/link.exe")
set(CMAKE_LINKER_LINK "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/link.exe")
set(CMAKE_LINKER_LLD "lld-link")
set(CMAKE_CXX_COMPILER_LINKER "D:/vs/VC/Tools/MSVC/14.43.34808/bin/HostX64/x64/link.exe")
set(CMAKE_CXX_COMPILER_LINKER_ID "MSVC")
set(CMAKE_CXX_COMPILER_LINKER_VERSION 14.43.34808.0)
set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT MSVC)
set(CMAKE_MT "CMAKE_MT-NOTFOUND")
set(CMAKE_TAPI "")
set(CMAKE_COMPILER_IS_GNUCXX )
set(CMAKE_CXX_COMPILER_LOADED 1)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_CXX_ABI_COMPILED TRUE)
set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
set(CMAKE_CXX_COMPILER_ID_RUN 1)
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m)
set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
foreach (lang IN ITEMS C OBJC OBJCXX)
if (CMAKE_${lang}_COMPILER_ID_RUN)
foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS)
list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension})
endforeach()
endif()
endforeach()
set(CMAKE_CXX_LINKER_PREFERENCE 30)
set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED )
set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED )
set(CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED )
# Save compiler ABI information.
set(CMAKE_CXX_SIZEOF_DATA_PTR "8")
set(CMAKE_CXX_COMPILER_ABI "")
set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN")
set(CMAKE_CXX_LIBRARY_ARCHITECTURE "")
if(CMAKE_CXX_SIZEOF_DATA_PTR)
set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
endif()
if(CMAKE_CXX_COMPILER_ABI)
set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
endif()
if(CMAKE_CXX_LIBRARY_ARCHITECTURE)
set(CMAKE_LIBRARY_ARCHITECTURE "")
endif()
set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "")
if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX)
set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}")
endif()
set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "")
set(CMAKE_CXX_COMPILER_IMPORT_STD "")
set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "Unsupported generator: Visual Studio 17 2022")
set(CMAKE_CXX_STDLIB_MODULES_JSON "")

@ -0,0 +1,6 @@
set(CMAKE_RC_COMPILER "rc")
set(CMAKE_RC_COMPILER_ARG1 "")
set(CMAKE_RC_COMPILER_LOADED 1)
set(CMAKE_RC_SOURCE_FILE_EXTENSIONS rc;RC)
set(CMAKE_RC_OUTPUT_EXTENSION .res)
set(CMAKE_RC_COMPILER_ENV_VAR "RC")

@ -0,0 +1,15 @@
set(CMAKE_HOST_SYSTEM "Windows-10.0.26200")
set(CMAKE_HOST_SYSTEM_NAME "Windows")
set(CMAKE_HOST_SYSTEM_VERSION "10.0.26200")
set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64")
set(CMAKE_SYSTEM "Windows-10.0.26200")
set(CMAKE_SYSTEM_NAME "Windows")
set(CMAKE_SYSTEM_VERSION "10.0.26200")
set(CMAKE_SYSTEM_PROCESSOR "AMD64")
set(CMAKE_CROSSCOMPILING "FALSE")
set(CMAKE_SYSTEM_LOADED 1)

@ -0,0 +1,949 @@
/* This source file must have a .cpp extension so that all C++ compilers
recognize the extension without flags. Borland does not know .cxx for
example. */
#ifndef __cplusplus
# error "A C compiler has been selected for C++."
#endif
#if !defined(__has_include)
/* If the compiler does not have __has_include, pretend the answer is
always no. */
# define __has_include(x) 0
#endif
/* Version number components: V=Version, R=Revision, P=Patch
Version date components: YYYY=Year, MM=Month, DD=Day */
#if defined(__INTEL_COMPILER) || defined(__ICC)
# define COMPILER_ID "Intel"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# if defined(__GNUC__)
# define SIMULATE_ID "GNU"
# endif
/* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later,
except that a few beta releases use the old format with V=2021. */
# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
# if defined(__INTEL_COMPILER_UPDATE)
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
# else
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
# endif
# else
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
/* The third version component from --version is an update index,
but no macro is provided for it. */
# define COMPILER_VERSION_PATCH DEC(0)
# endif
# if defined(__INTEL_COMPILER_BUILD_DATE)
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
# endif
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER)
# define COMPILER_ID "IntelLLVM"
#if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
#endif
#if defined(__GNUC__)
# define SIMULATE_ID "GNU"
#endif
/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and
* later. Look for 6 digit vs. 8 digit version number to decide encoding.
* VVVV is no smaller than the current year when a version is released.
*/
#if __INTEL_LLVM_COMPILER < 1000000L
# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10)
#else
# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000)
# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100)
#endif
#if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
#endif
#if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
#elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
#endif
#if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
#endif
#if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
#endif
#elif defined(__PATHCC__)
# define COMPILER_ID "PathScale"
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
# if defined(__PATHCC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
# endif
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
# define COMPILER_ID "Embarcadero"
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
#elif defined(__BORLANDC__)
# define COMPILER_ID "Borland"
/* __BORLANDC__ = 0xVRR */
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
# define COMPILER_ID "Watcom"
/* __WATCOMC__ = VVRR */
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__WATCOMC__)
# define COMPILER_ID "OpenWatcom"
/* __WATCOMC__ = VVRP + 1100 */
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__SUNPRO_CC)
# define COMPILER_ID "SunPro"
# if __SUNPRO_CC >= 0x5100
/* __SUNPRO_CC = 0xVRRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# else
/* __SUNPRO_CC = 0xVRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# endif
#elif defined(__HP_aCC)
# define COMPILER_ID "HP"
/* __HP_aCC = VVRRPP */
# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
#elif defined(__DECCXX)
# define COMPILER_ID "Compaq"
/* __DECCXX_VER = VVRRTPPPP */
# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
# define COMPILER_ID "zOS"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__open_xl__) && defined(__clang__)
# define COMPILER_ID "IBMClang"
# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__)
# define COMPILER_VERSION_MINOR DEC(__open_xl_release__)
# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(__ibmxl__) && defined(__clang__)
# define COMPILER_ID "XLClang"
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
# define COMPILER_ID "XL"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
# define COMPILER_ID "VisualAge"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__NVCOMPILER)
# define COMPILER_ID "NVHPC"
# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__)
# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__)
# if defined(__NVCOMPILER_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__)
# endif
#elif defined(__PGI)
# define COMPILER_ID "PGI"
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
# if defined(__PGIC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
# endif
#elif defined(__clang__) && defined(__cray__)
# define COMPILER_ID "CrayClang"
# define COMPILER_VERSION_MAJOR DEC(__cray_major__)
# define COMPILER_VERSION_MINOR DEC(__cray_minor__)
# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(_CRAYC)
# define COMPILER_ID "Cray"
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
#elif defined(__TI_COMPILER_VERSION__)
# define COMPILER_ID "TI"
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
#elif defined(__CLANG_FUJITSU)
# define COMPILER_ID "FujitsuClang"
# define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
# define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(__FUJITSU)
# define COMPILER_ID "Fujitsu"
# if defined(__FCC_version__)
# define COMPILER_VERSION __FCC_version__
# elif defined(__FCC_major__)
# define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
# define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
# endif
# if defined(__fcc_version)
# define COMPILER_VERSION_INTERNAL DEC(__fcc_version)
# elif defined(__FCC_VERSION)
# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION)
# endif
#elif defined(__ghs__)
# define COMPILER_ID "GHS"
/* __GHS_VERSION_NUMBER = VVVVRP */
# ifdef __GHS_VERSION_NUMBER
# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
# endif
#elif defined(__TASKING__)
# define COMPILER_ID "Tasking"
# define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000)
# define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100)
# define COMPILER_VERSION_INTERNAL DEC(__VERSION__)
#elif defined(__ORANGEC__)
# define COMPILER_ID "OrangeC"
# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__)
# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__)
# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__)
#elif defined(__RENESAS__)
# define COMPILER_ID "Renesas"
/* __RENESAS_VERSION__ = 0xVVRRPP00 */
# define COMPILER_VERSION_MAJOR HEX(__RENESAS_VERSION__ >> 24 & 0xFF)
# define COMPILER_VERSION_MINOR HEX(__RENESAS_VERSION__ >> 16 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__RENESAS_VERSION__ >> 8 & 0xFF)
#elif defined(__SCO_VERSION__)
# define COMPILER_ID "SCO"
#elif defined(__ARMCC_VERSION) && !defined(__clang__)
# define COMPILER_ID "ARMCC"
#if __ARMCC_VERSION >= 1000000
/* __ARMCC_VERSION = VRRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#else
/* __ARMCC_VERSION = VRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#endif
#elif defined(__clang__) && defined(__apple_build_version__)
# define COMPILER_ID "AppleClang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
# define COMPILER_ID "ARMClang"
# define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100)
# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
#elif defined(__clang__) && defined(__ti__)
# define COMPILER_ID "TIClang"
# define COMPILER_VERSION_MAJOR DEC(__ti_major__)
# define COMPILER_VERSION_MINOR DEC(__ti_minor__)
# define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__)
# define COMPILER_VERSION_INTERNAL DEC(__ti_version__)
#elif defined(__clang__)
# define COMPILER_ID "Clang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__))
# define COMPILER_ID "LCC"
# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100)
# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100)
# if defined(__LCC_MINOR__)
# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__)
# endif
# if defined(__GNUC__) && defined(__GNUC_MINOR__)
# define SIMULATE_ID "GNU"
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
# endif
#elif defined(__GNUC__) || defined(__GNUG__)
# define COMPILER_ID "GNU"
# if defined(__GNUC__)
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
# else
# define COMPILER_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(_MSC_VER)
# define COMPILER_ID "MSVC"
/* _MSC_VER = VVRR */
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
# if defined(_MSC_FULL_VER)
# if _MSC_VER >= 1400
/* _MSC_FULL_VER = VVRRPPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
# else
/* _MSC_FULL_VER = VVRRPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
# endif
# endif
# if defined(_MSC_BUILD)
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
# endif
#elif defined(_ADI_COMPILER)
# define COMPILER_ID "ADSP"
#if defined(__VERSIONNUM__)
/* __VERSIONNUM__ = 0xVVRRPPTT */
# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF)
# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF)
# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF)
# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF)
#endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# define COMPILER_ID "IAR"
# if defined(__VER__) && defined(__ICCARM__)
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__))
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# endif
#elif defined(__DCC__) && defined(_DIAB_TOOL)
# define COMPILER_ID "Diab"
# define COMPILER_VERSION_MAJOR DEC(__VERSION_MAJOR_NUMBER__)
# define COMPILER_VERSION_MINOR DEC(__VERSION_MINOR_NUMBER__)
# define COMPILER_VERSION_PATCH DEC(__VERSION_ARCH_FEATURE_NUMBER__)
# define COMPILER_VERSION_TWEAK DEC(__VERSION_BUG_FIX_NUMBER__)
/* These compilers are either not known or too old to define an
identification macro. Try to identify the platform and guess that
it is the native compiler. */
#elif defined(__hpux) || defined(__hpua)
# define COMPILER_ID "HP"
#else /* unknown compiler */
# define COMPILER_ID ""
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
#ifdef SIMULATE_ID
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
#endif
#ifdef __QNXNTO__
char const* qnxnto = "INFO" ":" "qnxnto[]";
#endif
#if defined(__CRAYXT_COMPUTE_LINUX_TARGET)
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
#endif
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
/* Identify known platforms by name. */
#if defined(__linux) || defined(__linux__) || defined(linux)
# define PLATFORM_ID "Linux"
#elif defined(__MSYS__)
# define PLATFORM_ID "MSYS"
#elif defined(__CYGWIN__)
# define PLATFORM_ID "Cygwin"
#elif defined(__MINGW32__)
# define PLATFORM_ID "MinGW"
#elif defined(__APPLE__)
# define PLATFORM_ID "Darwin"
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
# define PLATFORM_ID "Windows"
#elif defined(__FreeBSD__) || defined(__FreeBSD)
# define PLATFORM_ID "FreeBSD"
#elif defined(__NetBSD__) || defined(__NetBSD)
# define PLATFORM_ID "NetBSD"
#elif defined(__OpenBSD__) || defined(__OPENBSD)
# define PLATFORM_ID "OpenBSD"
#elif defined(__sun) || defined(sun)
# define PLATFORM_ID "SunOS"
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
# define PLATFORM_ID "AIX"
#elif defined(__hpux) || defined(__hpux__)
# define PLATFORM_ID "HP-UX"
#elif defined(__HAIKU__)
# define PLATFORM_ID "Haiku"
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
# define PLATFORM_ID "BeOS"
#elif defined(__QNX__) || defined(__QNXNTO__)
# define PLATFORM_ID "QNX"
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
# define PLATFORM_ID "Tru64"
#elif defined(__riscos) || defined(__riscos__)
# define PLATFORM_ID "RISCos"
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
# define PLATFORM_ID "SINIX"
#elif defined(__UNIX_SV__)
# define PLATFORM_ID "UNIX_SV"
#elif defined(__bsdos__)
# define PLATFORM_ID "BSDOS"
#elif defined(_MPRAS) || defined(MPRAS)
# define PLATFORM_ID "MP-RAS"
#elif defined(__osf) || defined(__osf__)
# define PLATFORM_ID "OSF1"
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
# define PLATFORM_ID "SCO_SV"
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
# define PLATFORM_ID "ULTRIX"
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
# define PLATFORM_ID "Xenix"
#elif defined(__WATCOMC__)
# if defined(__LINUX__)
# define PLATFORM_ID "Linux"
# elif defined(__DOS__)
# define PLATFORM_ID "DOS"
# elif defined(__OS2__)
# define PLATFORM_ID "OS2"
# elif defined(__WINDOWS__)
# define PLATFORM_ID "Windows3x"
# elif defined(__VXWORKS__)
# define PLATFORM_ID "VxWorks"
# else /* unknown platform */
# define PLATFORM_ID
# endif
#elif defined(__INTEGRITY)
# if defined(INT_178B)
# define PLATFORM_ID "Integrity178"
# else /* regular Integrity */
# define PLATFORM_ID "Integrity"
# endif
# elif defined(_ADI_COMPILER)
# define PLATFORM_ID "ADSP"
#else /* unknown platform */
# define PLATFORM_ID
#endif
/* For windows compilers MSVC and Intel we can determine
the architecture of the compiler being used. This is because
the compilers do not have flags that can change the architecture,
but rather depend on which compiler is being used
*/
#if defined(_WIN32) && defined(_MSC_VER)
# if defined(_M_IA64)
# define ARCHITECTURE_ID "IA64"
# elif defined(_M_ARM64EC)
# define ARCHITECTURE_ID "ARM64EC"
# elif defined(_M_X64) || defined(_M_AMD64)
# define ARCHITECTURE_ID "x64"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# elif defined(_M_ARM64)
# define ARCHITECTURE_ID "ARM64"
# elif defined(_M_ARM)
# if _M_ARM == 4
# define ARCHITECTURE_ID "ARMV4I"
# elif _M_ARM == 5
# define ARCHITECTURE_ID "ARMV5I"
# else
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
# endif
# elif defined(_M_MIPS)
# define ARCHITECTURE_ID "MIPS"
# elif defined(_M_SH)
# define ARCHITECTURE_ID "SHx"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__WATCOMC__)
# if defined(_M_I86)
# define ARCHITECTURE_ID "I86"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# if defined(__ICCARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__ICCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__ICCRH850__)
# define ARCHITECTURE_ID "RH850"
# elif defined(__ICCRL78__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__ICCRISCV__)
# define ARCHITECTURE_ID "RISCV"
# elif defined(__ICCAVR__)
# define ARCHITECTURE_ID "AVR"
# elif defined(__ICC430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__ICCV850__)
# define ARCHITECTURE_ID "V850"
# elif defined(__ICC8051__)
# define ARCHITECTURE_ID "8051"
# elif defined(__ICCSTM8__)
# define ARCHITECTURE_ID "STM8"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__ghs__)
# if defined(__PPC64__)
# define ARCHITECTURE_ID "PPC64"
# elif defined(__ppc__)
# define ARCHITECTURE_ID "PPC"
# elif defined(__ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__x86_64__)
# define ARCHITECTURE_ID "x64"
# elif defined(__i386__)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__clang__) && defined(__ti__)
# if defined(__ARM_ARCH)
# define ARCHITECTURE_ID "ARM"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__TI_COMPILER_VERSION__)
# if defined(__TI_ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__MSP430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__TMS320C28XX__)
# define ARCHITECTURE_ID "TMS320C28x"
# elif defined(__TMS320C6X__) || defined(_TMS320C6X)
# define ARCHITECTURE_ID "TMS320C6x"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
# elif defined(__ADSPSHARC__)
# define ARCHITECTURE_ID "SHARC"
# elif defined(__ADSPBLACKFIN__)
# define ARCHITECTURE_ID "Blackfin"
#elif defined(__TASKING__)
# if defined(__CTC__) || defined(__CPTC__)
# define ARCHITECTURE_ID "TriCore"
# elif defined(__CMCS__)
# define ARCHITECTURE_ID "MCS"
# elif defined(__CARM__) || defined(__CPARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__CARC__)
# define ARCHITECTURE_ID "ARC"
# elif defined(__C51__)
# define ARCHITECTURE_ID "8051"
# elif defined(__CPCP__)
# define ARCHITECTURE_ID "PCP"
# else
# define ARCHITECTURE_ID ""
# endif
#elif defined(__RENESAS__)
# if defined(__CCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__CCRL__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__CCRH__)
# define ARCHITECTURE_ID "RH850"
# else
# define ARCHITECTURE_ID ""
# endif
#else
# define ARCHITECTURE_ID
#endif
/* Convert integer to decimal digit literals. */
#define DEC(n) \
('0' + (((n) / 10000000)%10)), \
('0' + (((n) / 1000000)%10)), \
('0' + (((n) / 100000)%10)), \
('0' + (((n) / 10000)%10)), \
('0' + (((n) / 1000)%10)), \
('0' + (((n) / 100)%10)), \
('0' + (((n) / 10)%10)), \
('0' + ((n) % 10))
/* Convert integer to hex digit literals. */
#define HEX(n) \
('0' + ((n)>>28 & 0xF)), \
('0' + ((n)>>24 & 0xF)), \
('0' + ((n)>>20 & 0xF)), \
('0' + ((n)>>16 & 0xF)), \
('0' + ((n)>>12 & 0xF)), \
('0' + ((n)>>8 & 0xF)), \
('0' + ((n)>>4 & 0xF)), \
('0' + ((n) & 0xF))
/* Construct a string literal encoding the version number. */
#ifdef COMPILER_VERSION
char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]";
/* Construct a string literal encoding the version number components. */
#elif defined(COMPILER_VERSION_MAJOR)
char const info_version[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
COMPILER_VERSION_MAJOR,
# ifdef COMPILER_VERSION_MINOR
'.', COMPILER_VERSION_MINOR,
# ifdef COMPILER_VERSION_PATCH
'.', COMPILER_VERSION_PATCH,
# ifdef COMPILER_VERSION_TWEAK
'.', COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct a string literal encoding the internal version number. */
#ifdef COMPILER_VERSION_INTERNAL
char const info_version_internal[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
'i','n','t','e','r','n','a','l','[',
COMPILER_VERSION_INTERNAL,']','\0'};
#elif defined(COMPILER_VERSION_INTERNAL_STR)
char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]";
#endif
/* Construct a string literal encoding the version number components. */
#ifdef SIMULATE_VERSION_MAJOR
char const info_simulate_version[] = {
'I', 'N', 'F', 'O', ':',
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
SIMULATE_VERSION_MAJOR,
# ifdef SIMULATE_VERSION_MINOR
'.', SIMULATE_VERSION_MINOR,
# ifdef SIMULATE_VERSION_PATCH
'.', SIMULATE_VERSION_PATCH,
# ifdef SIMULATE_VERSION_TWEAK
'.', SIMULATE_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
#define CXX_STD_98 199711L
#define CXX_STD_11 201103L
#define CXX_STD_14 201402L
#define CXX_STD_17 201703L
#define CXX_STD_20 202002L
#define CXX_STD_23 202302L
#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG)
# if _MSVC_LANG > CXX_STD_17
# define CXX_STD _MSVC_LANG
# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
# define CXX_STD CXX_STD_20
# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17
# define CXX_STD CXX_STD_20
# elif _MSVC_LANG > CXX_STD_14
# define CXX_STD CXX_STD_17
# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# elif defined(__INTEL_CXX11_MODE__)
# define CXX_STD CXX_STD_11
# else
# define CXX_STD CXX_STD_98
# endif
#elif defined(_MSC_VER) && defined(_MSVC_LANG)
# if _MSVC_LANG > __cplusplus
# define CXX_STD _MSVC_LANG
# else
# define CXX_STD __cplusplus
# endif
#elif defined(__NVCOMPILER)
# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
# define CXX_STD CXX_STD_20
# else
# define CXX_STD __cplusplus
# endif
#elif defined(__INTEL_COMPILER) || defined(__PGI)
# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes)
# define CXX_STD CXX_STD_17
# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# else
# define CXX_STD __cplusplus
# endif
#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__)
# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# else
# define CXX_STD __cplusplus
# endif
#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__)
# define CXX_STD CXX_STD_11
#else
# define CXX_STD __cplusplus
#endif
const char* info_language_standard_default = "INFO" ":" "standard_default["
#if CXX_STD > CXX_STD_23
"26"
#elif CXX_STD > CXX_STD_20
"23"
#elif CXX_STD > CXX_STD_17
"20"
#elif CXX_STD > CXX_STD_14
"17"
#elif CXX_STD > CXX_STD_11
"14"
#elif CXX_STD >= CXX_STD_11
"11"
#else
"98"
#endif
"]";
const char* info_language_extensions_default = "INFO" ":" "extensions_default["
#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \
defined(__TI_COMPILER_VERSION__) || defined(__RENESAS__)) && \
!defined(__STRICT_ANSI__)
"ON"
#else
"OFF"
#endif
"]";
/*--------------------------------------------------------------------------*/
int main(int argc, char* argv[])
{
int require = 0;
require += info_compiler[argc];
require += info_platform[argc];
require += info_arch[argc];
#ifdef COMPILER_VERSION_MAJOR
require += info_version[argc];
#endif
#if defined(COMPILER_VERSION_INTERNAL) || defined(COMPILER_VERSION_INTERNAL_STR)
require += info_version_internal[argc];
#endif
#ifdef SIMULATE_ID
require += info_simulate[argc];
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#if defined(__CRAYXT_COMPUTE_LINUX_TARGET)
require += info_cray[argc];
#endif
require += info_language_standard_default[argc];
require += info_language_extensions_default[argc];
(void)argv;
return require;
}

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{CAE07175-D007-4FC3-BFE8-47B392814159}</ProjectGuid>
<RootNamespace>CompilerIdCXX</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary Condition="'$(ApplicationType)'!='Android'">MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>TurnOffAllWarnings</WarningLevel>
<DebugInformationFormat>
</DebugInformationFormat>
</ClCompile>
<Link>
<GenerateDebugInformation>false</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>for %%i in (cl.exe) do %40echo CMAKE_CXX_COMPILER=%%~$PATH:i</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="CMakeCXXCompilerId.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\4.3.2\CompilerIdCXX\CompilerIdCXX.exe</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
<SatelliteDlls />
<NonRecipeFileRefs />
</Project>

@ -0,0 +1 @@
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\4.3.2\CompilerIdCXX\CMakeCXXCompilerId.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\4.3.2\CompilerIdCXX\Debug\CMakeCXXCompilerId.obj

@ -0,0 +1,2 @@
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
Debug|x64|D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\4.3.2\CompilerIdCXX\|

@ -0,0 +1 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\COMPILERIDCXX\DEBUG\CMAKECXXCOMPILERID.OBJ

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{F3FC6D86-508D-3FB1-96D2-995F08B142EC}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<Platform>x64</Platform>
<WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
<PropertyGroup>
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<ConfigurationType>Utility</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
<ItemDefinitionGroup>
<PostBuildEvent>
<Command>echo VCTargetsPath=$(VCTargetsPath)</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/>
</Project>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\4.3.2\x64\Debug\VCTargetsPath</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
<SatelliteDlls />
<NonRecipeFileRefs />
</Project>

@ -0,0 +1,2 @@
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
Debug|x64|D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\4.3.2\|

@ -0,0 +1,7 @@
{
"InstallScripts" :
[
"D:/29578/Documents/Study/computer/S_E/\u8f6f\u4ef6\u4f53\u7cfb\u7ed3\u6784\u4e0e\u8bbe\u8ba1/\u8f6f\u4ef6\u5f00\u53d1/\u591a\u6a21\u6001\u878d\u5408/cpp/build/cmake_install.cmake"
],
"Parallel" : false
}

@ -0,0 +1,3 @@
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/threat_fusion.dir
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/ALL_BUILD.dir
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/ZERO_CHECK.dir

@ -0,0 +1 @@
# This file is generated by cmake for dependency checking of the CMakeCache.txt file

@ -0,0 +1 @@
# CMake generation timestamp file for this directory.

@ -0,0 +1,99 @@
# CMake generation dependency list for this directory.
C:/Users/29578/.conda/envs/opencv-build/Library/cmake/OpenCVConfig-version.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/cmake/OpenCVConfig.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/cmake/x64/vc17/lib/OpenCVConfig.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/cmake/x64/vc17/lib/OpenCVModules-release.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/cmake/x64/vc17/lib/OpenCVModules.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeCXXCompiler.cmake.in
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeCXXCompilerABI.cpp
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeCXXInformation.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeCommonLanguageInclude.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeCompilerIdDetection.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineCXXCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineCompilerABI.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineCompilerId.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineCompilerSupport.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineRCCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeDetermineSystem.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeFindBinUtils.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeGenericSystem.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeInitializeConfigs.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeLanguageInformation.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeParseImplicitIncludeInfo.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeParseImplicitLinkInfo.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeParseLibraryArchitecture.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeRCCompiler.cmake.in
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeRCInformation.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeSystem.cmake.in
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeSystemSpecificInformation.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeSystemSpecificInitialize.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeTestCXXCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeTestCompilerCommon.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CMakeTestRCCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/ADSP-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/ARMCC-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/ARMClang-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/AppleClang-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Borland-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/CMakeCommonCompilerMacros.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Clang-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Clang-DetermineCompilerInternal.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Cray-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/CrayClang-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Diab-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Embarcadero-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Fujitsu-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/GHS-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/HP-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/IAR-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Intel-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/MSVC-CXX.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/MSVC-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/MSVC.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/NVHPC-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/NVIDIA-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/OrangeC-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/PGI-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/PathScale-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Renesas-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/SCO-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/TI-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/TIClang-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Tasking-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/Watcom-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/XL-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/CompilerId/VS-10.vcxproj.in
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/FindPackageHandleStandardArgs.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/FindPackageMessage.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Internal/CMakeCXXLinkerInformation.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Internal/CMakeCommonLinkerInformation.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Internal/CMakeDetermineLinkerId.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Internal/CMakeInspectCXXLinker.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Internal/FeatureTesting.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Linker/MSVC-CXX.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Linker/MSVC.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Linker/Windows-MSVC-CXX.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Linker/Windows-MSVC.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Windows-Determine-CXX.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Windows-Initialize.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Windows-MSVC-CXX.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Windows-MSVC.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/Windows.cmake
C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3/Modules/Platform/WindowsPaths.cmake
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/CMakeLists.txt
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/4.3.2/CMakeRCCompiler.cmake
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/4.3.2/CMakeSystem.cmake

@ -0,0 +1 @@
D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/generate.stamp

File diff suppressed because one or more lines are too long

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<CustomBuild Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\CMakeFiles\0b24a81bad90ab657e68cd95b6485b3c\generate.stamp.rule">
<Filter>CMake Rules</Filter>
</CustomBuild>
</ItemGroup>
<ItemGroup>
<Filter Include="CMake Rules">
<UniqueIdentifier>{3DCF309A-AE1B-37A1-AA75-5A526391928F}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>

@ -0,0 +1,56 @@
# Install script for directory: D:/29578/Documents/Study/computer/S_E////cpp
# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "C:/Program Files/threat_fusion")
endif()
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
if(BUILD_TYPE)
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
else()
set(CMAKE_INSTALL_CONFIG_NAME "Release")
endif()
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif()
# Set the component getting installed.
if(NOT CMAKE_INSTALL_COMPONENT)
if(COMPONENT)
message(STATUS "Install component: \"${COMPONENT}\"")
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
else()
set(CMAKE_INSTALL_COMPONENT)
endif()
endif()
# Is this installation the result of a crosscompile?
if(NOT DEFINED CMAKE_CROSSCOMPILING)
set(CMAKE_CROSSCOMPILING "FALSE")
endif()
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
"${CMAKE_INSTALL_MANIFEST_FILES}")
if(CMAKE_INSTALL_LOCAL_ONLY)
file(WRITE "D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/install_local_manifest.txt"
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
endif()
if(CMAKE_INSTALL_COMPONENT)
if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$")
set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
else()
string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}")
set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt")
unset(CMAKE_INST_COMP_HASH)
endif()
else()
set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
endif()
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
file(WRITE "D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/${CMAKE_INSTALL_MANIFEST}"
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
endif()

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\x64\Release\ZERO_CHECK</FullPath>
</ProjectOutput>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\threat_fusion.exe</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
<SatelliteDlls />
<NonRecipeFileRefs />
</Project>

@ -0,0 +1,6 @@
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\fusion_engine.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\threat_fusion.dir\Release\fusion_engine.obj
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\avoidance_controller.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\threat_fusion.dir\Release\avoidance_controller.obj
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\gimbal_controller.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\threat_fusion.dir\Release\gimbal_controller.obj
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\main.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\threat_fusion.dir\Release\main.obj
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\热成像识别\cpp\src\thermal_preprocessor.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\threat_fusion.dir\Release\thermal_preprocessor.obj
D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\热成像识别\cpp\src\thermal_detector.cpp;D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\threat_fusion.dir\Release\thermal_detector.obj

@ -0,0 +1,10 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
setlocal
C:\Users\29578\.conda\envs\opencv-build\Library\bin\cmake.exe -SD:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp -BD:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build --check-stamp-file D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/generate.stamp
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

@ -0,0 +1,98 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\OPENCVCONFIG-VERSION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\OPENCVCONFIG.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVCONFIG.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVMODULES-RELEASE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVMODULES.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXCOMPILER.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXCOMPILERABI.CPP
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECOMMONLANGUAGEINCLUDE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECOMPILERIDDETECTION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECXXCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERABI.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERID.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERSUPPORT.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINERCCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINESYSTEM.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEFINDBINUTILS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEGENERICSYSTEM.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEINITIALIZECONFIGS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKELANGUAGEINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSEIMPLICITINCLUDEINFO.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSEIMPLICITLINKINFO.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSELIBRARYARCHITECTURE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKERCCOMPILER.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKERCINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEM.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEMSPECIFICINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEMSPECIFICINITIALIZE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTCXXCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTCOMPILERCOMMON.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTRCCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ADSP-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ARMCC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ARMCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\APPLECLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\BORLAND-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CMAKECOMMONCOMPILERMACROS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CLANG-DETERMINECOMPILERINTERNAL.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\COMPAQ-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CRAY-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CRAYCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\DIAB-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\EMBARCADERO-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\FUJITSU-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\FUJITSUCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\GHS-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\GNU-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\HP-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IAR-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IBMCPP-CXX-DETERMINEVERSIONINTERNAL.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IBMCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\INTEL-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\INTELLLVM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\LCC-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\NVHPC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\NVIDIA-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\OPENWATCOM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ORANGEC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\PGI-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\PATHSCALE-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\RENESAS-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\SCO-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\SUNPRO-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TI-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TICLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TASKING-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\VISUALAGE-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\WATCOM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\XL-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\XLCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ZOS-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILERID\VS-10.VCXPROJ.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\FINDPACKAGEHANDLESTANDARDARGS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\FINDPACKAGEMESSAGE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKECXXLINKERINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKECOMMONLINKERINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKEDETERMINELINKERID.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKEINSPECTCXXLINKER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\FEATURETESTING.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\LINKER\MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\LINKER\MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\LINKER\WINDOWS-MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-DETERMINE-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-INITIALIZE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWSPATHS.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKECXXCOMPILER.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKERCCOMPILER.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKESYSTEM.CMAKE

@ -0,0 +1,2 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\GENERATE.STAMP

@ -0,0 +1 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\THREAT_FUSION.DIR\RELEASE\AVOIDANCE_CONTROLLER.OBJ|D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\THREAT_FUSION.DIR\RELEASE\FUSION_ENGINE.OBJ|D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\THREAT_FUSION.DIR\RELEASE\GIMBAL_CONTROLLER.OBJ|D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\THREAT_FUSION.DIR\RELEASE\MAIN.OBJ|D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\THREAT_FUSION.DIR\RELEASE\THERMAL_DETECTOR.OBJ|D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\THREAT_FUSION.DIR\RELEASE\THERMAL_PREPROCESSOR.OBJ

@ -0,0 +1,2 @@
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
Release|x64|D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\|

@ -0,0 +1,53 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ALL_BUILD", "ALL_BUILD.vcxproj", "{1742E445-981B-3E97-8BF6-975259F3FFAE}"
ProjectSection(ProjectDependencies) = postProject
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F} = {6CE3EF80-30EC-36AA-B3B3-D14926FC288F}
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9} = {29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZERO_CHECK", "ZERO_CHECK.vcxproj", "{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threat_fusion", "threat_fusion.vcxproj", "{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}"
ProjectSection(ProjectDependencies) = postProject
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F} = {6CE3EF80-30EC-36AA-B3B3-D14926FC288F}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
MinSizeRel|x64 = MinSizeRel|x64
RelWithDebInfo|x64 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1742E445-981B-3E97-8BF6-975259F3FFAE}.Debug|x64.ActiveCfg = Debug|x64
{1742E445-981B-3E97-8BF6-975259F3FFAE}.Release|x64.ActiveCfg = Release|x64
{1742E445-981B-3E97-8BF6-975259F3FFAE}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{1742E445-981B-3E97-8BF6-975259F3FFAE}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.Debug|x64.ActiveCfg = Debug|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.Debug|x64.Build.0 = Debug|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.Release|x64.ActiveCfg = Release|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.Release|x64.Build.0 = Release|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{6CE3EF80-30EC-36AA-B3B3-D14926FC288F}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.Debug|x64.ActiveCfg = Debug|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.Debug|x64.Build.0 = Debug|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.Release|x64.ActiveCfg = Release|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.Release|x64.Build.0 = Release|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{29ED8D24-93BC-3C1F-A5D1-D9207E2D02B9}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {1AA9DC08-3C7D-3E76-8C85-2A86ACA49BF1}
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

File diff suppressed because one or more lines are too long

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\fusion_engine.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\avoidance_controller.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\gimbal_controller.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\src\main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\热成像识别\cpp\src\thermal_preprocessor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\热成像识别\cpp\src\thermal_detector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\CMakeLists.txt" />
</ItemGroup>
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{5FB2D2DF-C506-33C2-9474-858245B6D16C}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\x64\Release\ZERO_CHECK</FullPath>
</ProjectOutput>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\threat_fusion.exe</FullPath>
</ProjectOutput>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\x64\Release\ALL_BUILD</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
<SatelliteDlls />
<NonRecipeFileRefs />
</Project>

@ -0,0 +1,2 @@
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
Release|x64|D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\|

@ -0,0 +1,10 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
setlocal
C:\Users\29578\.conda\envs\opencv-build\Library\bin\cmake.exe -SD:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp -BD:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build --check-stamp-file D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/CMakeFiles/generate.stamp
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

@ -0,0 +1,98 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\OPENCVCONFIG-VERSION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\OPENCVCONFIG.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVCONFIG.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVMODULES-RELEASE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVMODULES.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXCOMPILER.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXCOMPILERABI.CPP
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECOMMONLANGUAGEINCLUDE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECOMPILERIDDETECTION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECXXCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERABI.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERID.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERSUPPORT.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINERCCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINESYSTEM.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEFINDBINUTILS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEGENERICSYSTEM.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEINITIALIZECONFIGS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKELANGUAGEINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSEIMPLICITINCLUDEINFO.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSEIMPLICITLINKINFO.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSELIBRARYARCHITECTURE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKERCCOMPILER.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKERCINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEM.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEMSPECIFICINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEMSPECIFICINITIALIZE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTCXXCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTCOMPILERCOMMON.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTRCCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ADSP-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ARMCC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ARMCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\APPLECLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\BORLAND-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CMAKECOMMONCOMPILERMACROS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CLANG-DETERMINECOMPILERINTERNAL.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\COMPAQ-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CRAY-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CRAYCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\DIAB-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\EMBARCADERO-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\FUJITSU-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\FUJITSUCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\GHS-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\GNU-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\HP-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IAR-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IBMCPP-CXX-DETERMINEVERSIONINTERNAL.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IBMCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\INTEL-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\INTELLLVM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\LCC-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\NVHPC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\NVIDIA-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\OPENWATCOM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ORANGEC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\PGI-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\PATHSCALE-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\RENESAS-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\SCO-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\SUNPRO-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TI-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TICLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TASKING-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\VISUALAGE-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\WATCOM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\XL-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\XLCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ZOS-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILERID\VS-10.VCXPROJ.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\FINDPACKAGEHANDLESTANDARDARGS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\FINDPACKAGEMESSAGE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKECXXLINKERINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKECOMMONLINKERINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKEDETERMINELINKERID.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKEINSPECTCXXLINKER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\FEATURETESTING.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\LINKER\MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\LINKER\MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\LINKER\WINDOWS-MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-DETERMINE-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-INITIALIZE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWSPATHS.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKECXXCOMPILER.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKERCCOMPILER.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKESYSTEM.CMAKE

@ -0,0 +1,2 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\GENERATE.STAMP

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\x64\Release\ZERO_CHECK</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
<SatelliteDlls />
<NonRecipeFileRefs />
</Project>

@ -0,0 +1,10 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\0B24A81BAD90AB657E68CD95B6485B3C\GENERATE.STAMP.RULE
setlocal
C:\Users\29578\.conda\envs\opencv-build\Library\bin\cmake.exe -SD:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp -BD:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build --check-stamp-list CMakeFiles/generate.stamp.list --vs-solution-file D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/多模态融合/cpp/build/threat_fusion.sln
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

@ -0,0 +1,99 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\0B24A81BAD90AB657E68CD95B6485B3C\GENERATE.STAMP.RULE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\OPENCVCONFIG-VERSION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\OPENCVCONFIG.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVCONFIG.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVMODULES-RELEASE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\CMAKE\X64\VC17\LIB\OPENCVMODULES.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXCOMPILER.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXCOMPILERABI.CPP
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECXXINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECOMMONLANGUAGEINCLUDE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKECOMPILERIDDETECTION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECXXCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERABI.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERID.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINECOMPILERSUPPORT.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINERCCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEDETERMINESYSTEM.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEFINDBINUTILS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEGENERICSYSTEM.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEINITIALIZECONFIGS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKELANGUAGEINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSEIMPLICITINCLUDEINFO.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSEIMPLICITLINKINFO.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKEPARSELIBRARYARCHITECTURE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKERCCOMPILER.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKERCINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEM.CMAKE.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEMSPECIFICINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKESYSTEMSPECIFICINITIALIZE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTCXXCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTCOMPILERCOMMON.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\CMAKETESTRCCOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ADSP-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ARMCC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ARMCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\APPLECLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\BORLAND-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CMAKECOMMONCOMPILERMACROS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CLANG-DETERMINECOMPILERINTERNAL.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\COMPAQ-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CRAY-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\CRAYCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\DIAB-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\EMBARCADERO-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\FUJITSU-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\FUJITSUCLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\GHS-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\GNU-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\HP-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IAR-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IBMCPP-CXX-DETERMINEVERSIONINTERNAL.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\IBMCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\INTEL-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\INTELLLVM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\LCC-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\NVHPC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\NVIDIA-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\OPENWATCOM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ORANGEC-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\PGI-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\PATHSCALE-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\RENESAS-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\SCO-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\SUNPRO-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TI-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TICLANG-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\TASKING-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\VISUALAGE-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\WATCOM-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\XL-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\XLCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILER\ZOS-CXX-DETERMINECOMPILER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\COMPILERID\VS-10.VCXPROJ.IN
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\FINDPACKAGEHANDLESTANDARDARGS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\FINDPACKAGEMESSAGE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKECXXLINKERINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKECOMMONLINKERINFORMATION.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKEDETERMINELINKERID.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\CMAKEINSPECTCXXLINKER.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\INTERNAL\FEATURETESTING.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\LINKER\MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\LINKER\MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\LINKER\WINDOWS-MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-DETERMINE-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-INITIALIZE.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-MSVC-CXX.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS-MSVC.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWS.CMAKE
C:\USERS\29578\.CONDA\ENVS\OPENCV-BUILD\LIBRARY\SHARE\CMAKE-4.3\MODULES\PLATFORM\WINDOWSPATHS.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\CMAKELISTS.TXT
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKECXXCOMPILER.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKERCCOMPILER.CMAKE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\4.3.2\CMAKESYSTEM.CMAKE

@ -0,0 +1,2 @@
^D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\0B24A81BAD90AB657E68CD95B6485B3C\GENERATE.STAMP.RULE
D:\29578\DOCUMENTS\STUDY\COMPUTER\S_E\软件体系结构与设计\软件开发\多模态融合\CPP\BUILD\CMAKEFILES\GENERATE.STAMP

@ -0,0 +1,2 @@
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
Release|x64|D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\多模态融合\cpp\build\|

@ -0,0 +1,35 @@
#pragma once
#include "fusion_types.h"
#include <vector>
// 避障速度指令 (ENU 坐标系)
struct AvoidanceCmd {
double vx = 0, vy = 0, vz = 0; // m/s
double timestamp = 0;
};
class AvoidanceController {
public:
explicit AvoidanceController(const FusionConfig& cfg);
// 计算避障速度, 无需避障时返回 false
bool compute(const std::vector<FusedThreat>& threats, double now, AvoidanceCmd& cmd);
bool active() const { return active_; }
void reset();
private:
// 计算单个威胁的斥力向量
void repulsion(const FusedThreat& threat, double speed, double decel_dist,
double& rx, double& ry, double& rz) const;
// 合成多个斥力向量
void combine(const std::vector<std::pair<AvoidanceCmd, const FusedThreat*>>& vectors,
double speed, double& cx, double& cy, double& cz) const;
FusionConfig cfg_;
double smooth_vx_ = 0, smooth_vy_ = 0, smooth_vz_ = 0;
double last_avoidance_time_ = 0;
bool active_ = false;
};

@ -0,0 +1,61 @@
#pragma once
#include "fusion_types.h"
#include "threat_cache.h"
#include <vector>
class FusionEngine {
public:
explicit FusionEngine(ThreatCache& cache, const FusionConfig& cfg);
// 执行融合, 返回融合后的威胁列表
std::vector<FusedThreat> fuse(double now, double drone_heading, int image_width = 640);
private:
// 统一格式: (source, azimuth, confidence, level, index_into_original)
struct UnifiedEntry {
std::string source; // "thermal", "flash", "acoustic"
double azimuth = 0;
double confidence = 0;
FusionThreatLevel level = FusionThreatLevel::SAFE;
int original_index = 0; // 用于回查 details
};
// 热成像类型 → 单独威胁等级
static FusionThreatLevel thermal_solo_level(const std::string& type);
// 声源类型 → 单独威胁等级
static FusionThreatLevel acoustic_solo_level(const std::string& type);
// bbox 中心 → 方位角
double bbox_to_azimuth(int bx, int bw, int image_width, double heading) const;
// 视线方向 → 方位角
static double sight_to_azimuth(double sight_x, double heading);
// 空间关联分组 (不同模态在 15° 内合并)
std::vector<std::vector<size_t>> spatial_group(
const std::vector<UnifiedEntry>& entries, double threshold = 15.0) const;
// 从分组构建 FusedThreat
FusedThreat build_threat(
const std::vector<UnifiedEntry>& group_entries,
const std::vector<ThermalCacheEntry::Detection>& thermal_dets,
const std::vector<FlashDetection>& flash_items,
const std::vector<AcousticThreatData>& acoustic_items,
double now);
// 威胁升级规则
FusionThreatLevel escalate(
const std::vector<UnifiedEntry>& group_entries,
const std::vector<ThermalCacheEntry::Detection>& thermal_dets,
const std::vector<AcousticThreatData>& acoustic_items) const;
// 角度差 (-180, 180]
static double angle_diff(double a, double b);
// 加权圆均值
static double circular_weighted_mean(
const std::vector<std::pair<double, double>>& azimuths_weights);
ThreatCache& cache_;
FusionConfig cfg_;
int threat_counter_ = 0;
};

@ -0,0 +1,167 @@
#pragma once
#include <string>
#include <vector>
#include <cstdint>
// ── 融合威胁等级 ──
enum class FusionThreatLevel {
SAFE = 0,
CAUTION = 1,
WARNING = 2,
DANGER = 3,
CRITICAL = 4,
};
struct FusionThreatLevelInfo {
static const char* label(FusionThreatLevel l) {
switch (l) {
case FusionThreatLevel::SAFE: return "Safe";
case FusionThreatLevel::CAUTION: return "Caution";
case FusionThreatLevel::WARNING: return "Warning";
case FusionThreatLevel::DANGER: return "Danger";
case FusionThreatLevel::CRITICAL: return "Critical";
}
return "Unknown";
}
static bool is_dangerous(FusionThreatLevel l) {
return l >= FusionThreatLevel::WARNING;
}
};
// ── 融合威胁 ──
struct FusedThreat {
std::string threat_id;
FusionThreatLevel level = FusionThreatLevel::SAFE;
double confidence = 0.0;
double bearing = 0.0; // 方位角 (度), 0=北, 顺时针
double elevation = 0.0; // 仰角 (度)
double distance = -1.0; // 米, -1=未知
std::vector<std::string> sources;
std::string description;
double timestamp = 0.0;
};
// ── 闪光检测数据 ──
struct FlashDetection {
double cx = 0, cy = 0;
double area = 0;
double sight_x = 0, sight_y = 0;
double timestamp = 0;
};
// ── 声源威胁数据 ──
struct AcousticThreatData {
std::string threat_id;
std::string sound_type;
double confidence = 0;
double azimuth = 0;
double elevation = 0;
double distance = -1;
double distance_confidence = 0;
double timestamp = 0;
};
// ── 吊舱图像类型 (SpireCV) ──
enum class GimbalImageType {
EO = 0, // 可见光
IR_WHITEHOT = 1, // 红外白热
IR_PSEUDOCOLOR = 2, // 红外伪彩
EO_IR_WHITEHOT = 3, // 可见光 + 红外白热
EO_IR_COLOR = 4, // 可见光 + 红外伪彩
};
inline const char* gimbal_image_type_str(GimbalImageType t) {
switch (t) {
case GimbalImageType::EO: return "EO";
case GimbalImageType::IR_WHITEHOT: return "IR WhiteHot";
case GimbalImageType::IR_PSEUDOCOLOR: return "IR PseudoColor";
case GimbalImageType::EO_IR_WHITEHOT: return "EO+IR WhiteHot";
case GimbalImageType::EO_IR_COLOR: return "EO+IR Color";
}
return "Unknown";
}
// ── Prometheus uav_control 飞行命令模式 ──
// 对应 prometheus_msgs/UAVCommand.Move_mode
enum class PrometheusMoveMode {
XYZ_POS = 0, // ENU 位置控制
XY_VEL_Z_POS = 1, // ENU XY 速度 + Z 位置
XYZ_VEL = 2, // ENU 速度控制 (避障使用)
XYZ_POS_BODY = 3, // 机体坐标系位置控制
XYZ_VEL_BODY = 4, // 机体坐标系速度控制
XY_VEL_Z_POS_BODY = 5, // 机体 XY 速度 + Z 位置
TRAJECTORY = 6, // 轨迹跟踪
};
// ── 融合配置 ──
struct FusionConfig {
// 模态权重
double weight_thermal = 0.35;
double weight_flash = 0.30;
double weight_acoustic = 0.35;
double cross_boost_2 = 0.25;
double cross_boost_3 = 0.15;
// 阈值
double fusion_time_window = 0.5; // 秒
double fusion_confidence_threshold = 0.5;
double acoustic_confidence_threshold = 0.6;
double thermal_hfov = 32.0; // 度
// 热成像
double thermal_max_rate = 2.0; // Hz
// 避障
bool avoidance_enabled = true;
double avoidance_speed = 2.0; // m/s (不超过 maximum_safe_vel_xy)
double avoidance_decel_distance = 10.0; // 米
double avoidance_cooldown = 5.0; // 秒
double avoidance_hold_time = 2.0; // 秒
double avoidance_smoothing = 0.3;
bool avoidance_vertical_enabled = true;
// 吊舱 (SpireCV AT10 Pro, 参见 P600 双光吊舱使用说明)
std::string gimbal_type = "AT10";
std::string gimbal_port = "/dev/ttyUSB1";
double gimbal_kp = 1.0;
double tracking_kp_x = 0.3;
double tracking_kp_z = 0.1;
double tracking_max_velocity = 2.5; // m/s
double tracking_distance = 10.0; // 米
int gimbal_max_yaw_rate = 40; // 度/秒
// ── Prometheus uav_control 框架集成 ──
// 参考: Prometheus/Modules/uav_control
// 话题: /uav{N}/prometheus/command (UAVCommand)
// 话题: /uav{N}/prometheus/state (UAVState)
// 话题: /uav{N}/prometheus/control_state (UAVControlState)
// 消息: prometheus_msgs/
int uav_id = 1; // 无人机编号 (用于话题命名空间)
std::string uav_namespace = "/uav1"; // 自动生成: /uav{uav_id}
// Prometheus 话题 (自动拼接 uav_namespace)
// 命令: {uav_namespace}/prometheus/command
// 状态: {uav_namespace}/prometheus/state
// 控制状态: {uav_namespace}/prometheus/control_state
// 地面站信息: {uav_namespace}/prometheus/text_info
// SpireCV 吊舱图像话题
// SpireCV at10_gimbal_server 发布:
// {uav_namespace}/gimbal/image_original (原始图像)
// {uav_namespace}/spirecv/image_det (检测结果叠加图)
std::string thermal_image_topic = "/uav1/gimbal/image_original";
// 安全限制 (对齐 uav_control_outdoor.yaml)
double maximum_safe_vel_xy = 5.0; // m/s, 与 uav_control 配置对齐
double maximum_safe_vel_z = 4.0; // m/s
// 地理围栏 (对齐 uav_control geo_fence)
double geo_fence_x_min = -1000.0, geo_fence_x_max = 1000.0;
double geo_fence_y_min = -1000.0, geo_fence_y_max = 1000.0;
double geo_fence_z_min = -50.0, geo_fence_z_max = 1000.0;
// 模态开关
bool thermal_enabled = true;
bool flash_enabled = true;
bool acoustic_enabled = true;
};

@ -0,0 +1,89 @@
#pragma once
#include "fusion_types.h"
#include <string>
#include <functional>
// ── 吊舱控制器 (SpireCV AT10 Pro) ──
// 参考: P600双光吊舱使用说明 §5 二次开发
//
// SpireCV API:
// gimbal.setAngleEuler(roll, pitch, yaw) — pitch下俯=正, yaw左=正
// gimbal.setAngleRateEuler(roll, pitch_rate, yaw_rate) — 角速率控制
// gimbal.setFrameType(GimbalImageType) — 切换图像类型
// gimbal.takePhoto()
// gimbal.setZoom(double)
//
// ROS 话题 (SpireCV at10_gimbal_server):
// 订阅: /uav1/gimbal/image_original (原始图像)
// 订阅: /uav1/spirecv/image_det (检测结果叠加图)
// 服务: /uav1/gimbal/set_frame_type (切换可见光/红外)
// 服务: /uav1/gimbal_downward_lock (俯仰锁定角度)
//
// 追踪参数 (P600手册 p29):
// kp_x=0.3, kp_z=0.1, kp_gimbal=1.0
// max_velocity=2.5m/s, tracking_distance=10.0m
// 当 USE_SPIRECV 宏定义时启用真实 SpireCV 集成,
// 否则提供空实现用于测试
#ifdef USE_SPIRECV
#include <spirecv/gimbal/Gimbal.hpp>
#endif
class GimbalController {
public:
struct State {
double roll = 0; // 度
double pitch = 0; // 度 (下俯为正)
double yaw = 0; // 度 (左转为正)
GimbalImageType image_type = GimbalImageType::IR_WHITEHOT;
bool connected = false;
};
explicit GimbalController(const FusionConfig& cfg);
~GimbalController();
// 连接/断开吊舱
bool connect();
void disconnect();
bool is_connected() const { return state_.connected; }
// 角度控制 — 绝对角度
// pitch: 下俯为正 (P600手册约定)
// yaw: 左转为正
void setAngleEuler(double roll, double pitch, double yaw);
// 角速率控制 (度/秒)
// 用于追踪目标时平滑旋转
void setAngleRateEuler(double roll, double pitch_rate, double yaw_rate);
// 切换图像类型
// GIMBAL_EO=可见光, GIMBAL_IRW=红外白热, GIMBAL_IRC=红外伪彩
void setFrameType(GimbalImageType type);
// 追踪目标: 根据目标在图像中的偏移控制云台旋转
// target_offset_x, target_offset_y: 目标相对于图像中心的归一化偏移 [-1, 1]
void trackTarget(double target_offset_x, double target_offset_y);
// 俯仰锁定: 俯视指定角度 (用于固定监控)
// P600手册: downward_locked_angle() → setAngleEuler(0, angle, 0)
void setDownwardAngle(double angle_deg);
// 拍照
void takePhoto();
// 变焦
void setZoom(double factor);
// 获取当前状态
const State& state() const { return state_; }
private:
FusionConfig cfg_;
State state_;
#ifdef USE_SPIRECV
sv::Gimbal* gimbal_ = nullptr;
#endif
};

@ -0,0 +1,96 @@
#pragma once
#include "fusion_types.h"
#include <mutex>
#include <deque>
#include <vector>
#include <algorithm>
// ── 热成像缓存条目 ──
// 将 thermal_types.h 的 Assessment 简化为融合所需的字段
struct ThermalCacheEntry {
// 检测结果摘要
struct Detection {
std::string type; // "Person", "Barrel Overheat", etc.
double confidence = 0;
double max_temp = 0;
int bbox_x = 0, bbox_y = 0, bbox_w = 0, bbox_h = 0;
};
std::vector<Detection> detections;
double ambient_temp = 0;
double timestamp = 0;
};
// ── 线程安全时间窗口缓存 ──
class ThreatCache {
public:
explicit ThreatCache(double time_window = 0.5)
: time_window_(time_window) {}
void add_thermal(const ThermalCacheEntry& entry) {
std::lock_guard<std::mutex> lk(mutex_);
thermal_.push_back(entry);
if (thermal_.size() > kMaxThermal) thermal_.pop_front();
}
void add_flash(const FlashDetection& flash) {
std::lock_guard<std::mutex> lk(mutex_);
flash_.push_back(flash);
if (flash_.size() > kMaxFlash) flash_.pop_front();
}
void add_acoustic(const AcousticThreatData& threat) {
std::lock_guard<std::mutex> lk(mutex_);
acoustic_.push_back(threat);
if (acoustic_.size() > kMaxAcoustic) acoustic_.pop_front();
}
std::vector<ThermalCacheEntry> get_thermal(double now) const {
std::lock_guard<std::mutex> lk(mutex_);
std::vector<ThermalCacheEntry> result;
double cutoff = now - time_window_;
for (auto& e : thermal_) {
if (e.timestamp >= cutoff) result.push_back(e);
}
return result;
}
// 返回时间窗口内最新的一条闪光, 无则返回 false
bool get_latest_flash(double now, FlashDetection& out) const {
std::lock_guard<std::mutex> lk(mutex_);
double cutoff = now - time_window_;
for (auto it = flash_.rbegin(); it != flash_.rend(); ++it) {
if (it->timestamp >= cutoff) { out = *it; return true; }
}
return false;
}
std::vector<AcousticThreatData> get_acoustic(double now) const {
std::lock_guard<std::mutex> lk(mutex_);
std::vector<AcousticThreatData> result;
double cutoff = now - time_window_;
for (auto& e : acoustic_) {
if (e.timestamp >= cutoff) result.push_back(e);
}
return result;
}
void clear() {
std::lock_guard<std::mutex> lk(mutex_);
thermal_.clear();
flash_.clear();
acoustic_.clear();
}
private:
double time_window_;
mutable std::mutex mutex_;
static constexpr size_t kMaxThermal = 20;
static constexpr size_t kMaxFlash = 5;
static constexpr size_t kMaxAcoustic = 20;
std::deque<ThermalCacheEntry> thermal_;
std::deque<FlashDetection> flash_;
std::deque<AcousticThreatData> acoustic_;
};

@ -0,0 +1,153 @@
#include "avoidance_controller.h"
#include <cmath>
#include <algorithm>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
AvoidanceController::AvoidanceController(const FusionConfig& cfg)
: cfg_(cfg) {}
bool AvoidanceController::compute(
const std::vector<FusedThreat>& threats, double now, AvoidanceCmd& cmd)
{
if (!cfg_.avoidance_enabled) return false;
// 过滤危险威胁
std::vector<const FusedThreat*> dangerous;
for (auto& t : threats) {
if (FusionThreatLevelInfo::is_dangerous(t.level))
dangerous.push_back(&t);
}
if (dangerous.empty()) {
// 衰减
if (active_) {
smooth_vx_ *= 0.8;
smooth_vy_ *= 0.8;
smooth_vz_ *= 0.8;
if (std::fabs(smooth_vx_) < 0.01 && std::fabs(smooth_vy_) < 0.01) {
active_ = false;
return false;
}
cmd.vx = smooth_vx_;
cmd.vy = smooth_vy_;
cmd.vz = smooth_vz_;
cmd.timestamp = now;
return true;
}
return false;
}
// 冷却检查
if (active_ && (now - last_avoidance_time_) < cfg_.avoidance_cooldown) {
double elapsed = now - last_avoidance_time_;
if (elapsed < cfg_.avoidance_hold_time) {
cmd.vx = smooth_vx_;
cmd.vy = smooth_vy_;
cmd.vz = smooth_vz_;
cmd.timestamp = now;
return true;
}
double decay = std::max(0.0, 1.0 - (elapsed - cfg_.avoidance_hold_time)
/ (cfg_.avoidance_cooldown - cfg_.avoidance_hold_time));
cmd.vx = smooth_vx_ * decay;
cmd.vy = smooth_vy_ * decay;
cmd.vz = smooth_vz_ * decay;
cmd.timestamp = now;
return true;
}
// 计算斥力向量
double speed = cfg_.avoidance_speed;
double decel = cfg_.avoidance_decel_distance;
std::vector<std::pair<AvoidanceCmd, const FusedThreat*>> vectors;
for (auto* t : dangerous) {
AvoidanceCmd rc;
repulsion(*t, speed, decel, rc.vx, rc.vy, rc.vz);
rc.timestamp = now;
vectors.push_back({rc, t});
}
double cx, cy, cz;
combine(vectors, speed, cx, cy, cz);
// 平滑
double alpha = cfg_.avoidance_smoothing;
smooth_vx_ = alpha * cx + (1 - alpha) * smooth_vx_;
smooth_vy_ = alpha * cy + (1 - alpha) * smooth_vy_;
smooth_vz_ = alpha * cz + (1 - alpha) * smooth_vz_;
active_ = true;
last_avoidance_time_ = now;
cmd.vx = smooth_vx_;
cmd.vy = smooth_vy_;
cmd.vz = smooth_vz_;
cmd.timestamp = now;
return true;
}
void AvoidanceController::repulsion(
const FusedThreat& threat, double speed, double decel_dist,
double& rx, double& ry, double& rz) const
{
// 方位角 → ENU 反方向
double az_rad = threat.bearing * M_PI / 180.0;
double avoid_x = -std::sin(az_rad); // ENU: x=East
double avoid_y = -std::cos(az_rad); // ENU: y=North
// 距离缩放
double scale;
if (threat.distance > 0 && threat.distance < decel_dist) {
scale = std::pow((decel_dist - threat.distance) / decel_dist, 2);
} else if (threat.distance > 0) {
scale = 0.0;
} else {
scale = 1.0; // 未知距离, 全力避障
}
double mag = std::sqrt(avoid_x * avoid_x + avoid_y * avoid_y);
if (mag > 0) {
rx = avoid_x / mag * speed * scale;
ry = avoid_y / mag * speed * scale;
} else {
rx = ry = 0;
}
// 垂直避障
rz = 0;
if (cfg_.avoidance_vertical_enabled && std::fabs(threat.elevation) > 10) {
rz = -std::sin(threat.elevation * M_PI / 180.0) * speed * 0.5 * scale;
}
}
void AvoidanceController::combine(
const std::vector<std::pair<AvoidanceCmd, const FusedThreat*>>& vectors,
double speed, double& cx, double& cy, double& cz) const
{
cx = cy = cz = 0;
for (auto& [cmd, threat] : vectors) {
double w = (threat->distance > 0) ? 1.0 / std::max(threat->distance, 1.0) : 2.0;
w *= threat->confidence;
cx += cmd.vx * w;
cy += cmd.vy * w;
cz += cmd.vz * w;
}
double mag = std::sqrt(cx * cx + cy * cy + cz * cz);
if (mag > speed) {
double f = speed / mag;
cx *= f;
cy *= f;
cz *= f;
}
}
void AvoidanceController::reset() {
smooth_vx_ = 0;
smooth_vy_ = 0;
smooth_vz_ = 0;
active_ = false;
}

@ -0,0 +1,338 @@
#include "fusion_engine.h"
#include <cmath>
#include <algorithm>
#include <set>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
FusionEngine::FusionEngine(ThreatCache& cache, const FusionConfig& cfg)
: cache_(cache), cfg_(cfg) {}
std::vector<FusedThreat> FusionEngine::fuse(double now, double drone_heading, int image_width) {
std::vector<FusedThreat> threats;
// 收集各模态数据
auto thermal_list = cfg_.thermal_enabled ? cache_.get_thermal(now) : std::vector<ThermalCacheEntry>();
FlashDetection flash_item;
bool has_flash = cfg_.flash_enabled && cache_.get_latest_flash(now, flash_item);
auto acoustic_list = cfg_.acoustic_enabled ? cache_.get_acoustic(now) : std::vector<AcousticThreatData>();
// 用于回查的平铺列表
std::vector<ThermalCacheEntry::Detection> all_thermal_dets;
std::vector<FlashDetection> all_flash_items;
std::vector<AcousticThreatData> all_acoustic_items;
// 转为统一格式
std::vector<UnifiedEntry> unified;
for (auto& entry : thermal_list) {
for (auto& det : entry.detections) {
UnifiedEntry e;
e.source = "thermal";
e.azimuth = bbox_to_azimuth(det.bbox_x, det.bbox_w, image_width, drone_heading);
e.confidence = det.confidence;
e.level = thermal_solo_level(det.type);
e.original_index = (int)all_thermal_dets.size();
unified.push_back(e);
all_thermal_dets.push_back(det);
}
}
if (has_flash) {
UnifiedEntry e;
e.source = "flash";
e.azimuth = sight_to_azimuth(flash_item.sight_x, drone_heading);
e.confidence = flash_item.area > 0 ? std::min(1.0, flash_item.area / 400.0) : 0.3;
e.level = flash_item.area > 200 ? FusionThreatLevel::WARNING : FusionThreatLevel::CAUTION;
e.original_index = 0;
unified.push_back(e);
all_flash_items.push_back(flash_item);
}
for (auto& t : acoustic_list) {
if (t.confidence < cfg_.acoustic_confidence_threshold) continue;
UnifiedEntry e;
e.source = "acoustic";
e.azimuth = t.azimuth;
e.confidence = t.confidence;
e.level = acoustic_solo_level(t.sound_type);
e.original_index = (int)all_acoustic_items.size();
unified.push_back(e);
all_acoustic_items.push_back(t);
}
if (unified.empty()) return threats;
// 空间关联分组
auto groups = spatial_group(unified);
for (auto& group : groups) {
std::vector<UnifiedEntry> group_entries;
for (int idx : group) group_entries.push_back(unified[idx]);
auto threat = build_threat(group_entries, all_thermal_dets, all_flash_items, all_acoustic_items, now);
if (threat.confidence >= cfg_.fusion_confidence_threshold) {
threats.push_back(threat);
}
}
// 保守策略: 单模态高置信度告警
for (auto& e : unified) {
if (e.confidence >= 0.8 && FusionThreatLevelInfo::is_dangerous(e.level)) {
bool already = false;
for (auto& t : threats) {
if (std::fabs(angle_diff(t.bearing, e.azimuth)) < 20) {
already = true;
break;
}
}
if (!already) {
FusedThreat t;
t.threat_id = "FT-" + std::to_string(++threat_counter_);
std::snprintf(nullptr, 0, "%04d", threat_counter_);
char buf[16];
std::snprintf(buf, sizeof(buf), "%04d", threat_counter_);
t.threat_id = std::string("FT-") + buf;
t.level = e.level;
t.confidence = e.confidence;
t.bearing = e.azimuth;
t.sources.push_back(e.source);
t.description = e.source + " high-confidence alert";
t.timestamp = now;
threats.push_back(t);
}
}
}
return threats;
}
// ── 类型映射 ──
FusionThreatLevel FusionEngine::thermal_solo_level(const std::string& type) {
if (type == "Person") return FusionThreatLevel::WARNING;
if (type == "Barrel Overheat") return FusionThreatLevel::DANGER;
if (type == "Cold Weapon") return FusionThreatLevel::CAUTION;
if (type == "Flash Residue") return FusionThreatLevel::CAUTION;
if (type == "Hotspot") return FusionThreatLevel::CAUTION;
return FusionThreatLevel::CAUTION;
}
FusionThreatLevel FusionEngine::acoustic_solo_level(const std::string& type) {
if (type == "gunshot") return FusionThreatLevel::WARNING;
if (type == "artillery") return FusionThreatLevel::DANGER;
if (type == "explosion") return FusionThreatLevel::DANGER;
return FusionThreatLevel::SAFE;
}
// ── 方位角计算 ──
double FusionEngine::bbox_to_azimuth(int bx, int bw, int image_width, double heading) const {
double cx = bx + bw / 2.0;
double norm = (cx / std::max(image_width, 1) - 0.5) * cfg_.thermal_hfov;
return std::fmod(heading + norm + 360.0, 360.0);
}
double FusionEngine::sight_to_azimuth(double sight_x, double heading) {
return std::fmod(heading + sight_x * (180.0 / M_PI) + 360.0, 360.0);
}
// ── 空间分组 ──
std::vector<std::vector<size_t>> FusionEngine::spatial_group(
const std::vector<UnifiedEntry>& entries, double threshold) const
{
size_t n = entries.size();
std::vector<bool> assigned(n, false);
std::vector<std::vector<size_t>> groups;
for (size_t i = 0; i < n; i++) {
if (assigned[i]) continue;
std::vector<size_t> group;
group.push_back(i);
assigned[i] = true;
for (size_t j = i + 1; j < n; j++) {
if (assigned[j]) continue;
if (entries[i].source == entries[j].source) continue;
double diff = std::fabs(angle_diff(entries[i].azimuth, entries[j].azimuth));
if (diff < threshold) {
group.push_back(j);
assigned[j] = true;
}
}
groups.push_back(group);
}
for (size_t i = 0; i < n; i++) {
if (!assigned[i]) {
groups.push_back({i});
}
}
return groups;
}
// ── 构建融合威胁 ──
FusedThreat FusionEngine::build_threat(
const std::vector<UnifiedEntry>& group_entries,
const std::vector<ThermalCacheEntry::Detection>& thermal_dets,
const std::vector<FlashDetection>& flash_items,
const std::vector<AcousticThreatData>& acoustic_items,
double now)
{
FusedThreat t;
char buf[16];
std::snprintf(buf, sizeof(buf), "%04d", ++threat_counter_);
t.threat_id = std::string("FT-") + buf;
// 收集来源
std::set<std::string> src_set;
for (auto& e : group_entries) src_set.insert(e.source);
t.sources.assign(src_set.begin(), src_set.end());
// 加权置信度
auto get_weight = [&](const std::string& s) -> double {
if (s == "thermal") return cfg_.weight_thermal;
if (s == "flash") return cfg_.weight_flash;
if (s == "acoustic") return cfg_.weight_acoustic;
return 0.3;
};
double total_w = 0, total_wc = 0;
for (auto& e : group_entries) {
double w = get_weight(e.source);
total_w += w;
total_wc += w * e.confidence;
}
double fused_conf = total_wc / std::max(total_w, 0.01);
// 跨模态奖励
if (src_set.size() >= 2) fused_conf = std::min(1.0, fused_conf + cfg_.cross_boost_2);
if (src_set.size() >= 3) fused_conf = std::min(1.0, fused_conf + cfg_.cross_boost_3);
t.confidence = fused_conf;
// 方位角: 加权圆均值
std::vector<std::pair<double, double>> bearing_weights;
for (auto& e : group_entries) {
double w = get_weight(e.source) * std::max(e.confidence, 0.1);
bearing_weights.push_back({e.azimuth, w});
}
t.bearing = circular_weighted_mean(bearing_weights);
// 距离: 取已知最小距离
t.distance = -1.0;
for (auto& e : group_entries) {
double d = -1.0;
if (e.source == "acoustic" && e.original_index < (int)acoustic_items.size()) {
d = acoustic_items[e.original_index].distance;
}
if (d > 0 && (t.distance < 0 || d < t.distance)) t.distance = d;
}
// 仰角: 取声源 elevation
t.elevation = 0.0;
for (auto& e : group_entries) {
if (e.source == "acoustic" && e.original_index < (int)acoustic_items.size()) {
t.elevation = acoustic_items[e.original_index].elevation;
break;
}
}
// 威胁等级
t.level = escalate(group_entries, thermal_dets, acoustic_items);
// 描述
std::string desc;
for (auto& e : group_entries) {
if (!desc.empty()) desc += " + ";
if (e.source == "thermal" && e.original_index < (int)thermal_dets.size()) {
auto& det = thermal_dets[e.original_index];
char tmp[64];
std::snprintf(tmp, sizeof(tmp), "%s(%.0f%%)", det.type.c_str(), e.confidence * 100);
desc += tmp;
} else if (e.source == "flash") {
char tmp[64];
std::snprintf(tmp, sizeof(tmp), "Flash(%.0fpx)", flash_items.empty() ? 0 : flash_items[0].area);
desc += tmp;
} else if (e.source == "acoustic" && e.original_index < (int)acoustic_items.size()) {
auto& ac = acoustic_items[e.original_index];
char tmp[64];
std::snprintf(tmp, sizeof(tmp), "%s(%.0f%%)", ac.sound_type.c_str(), e.confidence * 100);
desc += tmp;
} else {
desc += e.source;
}
}
t.description = desc;
t.timestamp = now;
return t;
}
// ── 威胁升级 ──
FusionThreatLevel FusionEngine::escalate(
const std::vector<UnifiedEntry>& group_entries,
const std::vector<ThermalCacheEntry::Detection>& thermal_dets,
const std::vector<AcousticThreatData>& acoustic_items) const
{
std::set<std::string> thermal_types, acoustic_types;
bool has_flash = false;
FusionThreatLevel max_level = FusionThreatLevel::SAFE;
for (auto& e : group_entries) {
if (e.source == "thermal" && e.original_index < (int)thermal_dets.size()) {
thermal_types.insert(thermal_dets[e.original_index].type);
}
if (e.source == "acoustic" && e.original_index < (int)acoustic_items.size()) {
acoustic_types.insert(acoustic_items[e.original_index].sound_type);
}
if (e.source == "flash") has_flash = true;
if (e.level > max_level) max_level = e.level;
}
bool has_person = thermal_types.count("Person") > 0;
bool has_barrel = thermal_types.count("Barrel Overheat") > 0;
bool has_weapon = thermal_types.count("Cold Weapon") > 0;
bool has_gunshot = acoustic_types.count("gunshot") > 0;
bool has_explosion = acoustic_types.count("artillery") > 0 || acoustic_types.count("explosion") > 0;
if (has_person && has_barrel) return FusionThreatLevel::CRITICAL;
if (has_person && has_weapon) return FusionThreatLevel::CRITICAL;
if (has_person && has_gunshot) return FusionThreatLevel::CRITICAL;
if (has_barrel && has_gunshot) return FusionThreatLevel::CRITICAL;
if (has_weapon && has_gunshot) return FusionThreatLevel::CRITICAL;
if (has_person && has_flash) return FusionThreatLevel::DANGER;
if (has_gunshot && has_flash) return FusionThreatLevel::DANGER;
if (has_explosion) return FusionThreatLevel::DANGER;
if (has_person) return FusionThreatLevel::WARNING;
if (has_barrel) return FusionThreatLevel::DANGER;
if (has_weapon) return FusionThreatLevel::CAUTION;
if (has_gunshot) return FusionThreatLevel::WARNING;
return max_level;
}
// ── 工具函数 ──
double FusionEngine::angle_diff(double a, double b) {
double d = std::fmod(a - b + 360.0, 360.0);
if (d > 180.0) d -= 360.0;
return d;
}
double FusionEngine::circular_weighted_mean(
const std::vector<std::pair<double, double>>& azimuths_weights)
{
double sin_sum = 0, cos_sum = 0;
for (auto& [az, w] : azimuths_weights) {
double rad = az * M_PI / 180.0;
sin_sum += w * std::sin(rad);
cos_sum += w * std::cos(rad);
}
return std::fmod(std::atan2(sin_sum, cos_sum) * 180.0 / M_PI + 360.0, 360.0);
}

@ -0,0 +1,146 @@
#include "gimbal_controller.h"
#include <cstdio>
#include <cmath>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
GimbalController::GimbalController(const FusionConfig& cfg)
: cfg_(cfg) {}
GimbalController::~GimbalController() {
disconnect();
}
bool GimbalController::connect() {
#ifdef USE_SPIRECV
if (gimbal_) return true;
// P600手册: AT10 吊舱通过串口控制, 默认 /dev/ttyUSB1
gimbal_ = new sv::Gimbal(
sv::GimbalType::GIMBAL_TYPE_AT10,
sv::GimbalSerial(cfg_.gimbal_port)
);
if (!gimbal_->open()) {
std::fprintf(stderr, "[GimbalController] 无法打开吊舱: %s\n", cfg_.gimbal_port.c_str());
delete gimbal_;
gimbal_ = nullptr;
state_.connected = false;
return false;
}
state_.connected = true;
std::printf("[GimbalController] AT10 吊舱已连接: %s\n", cfg_.gimbal_port.c_str());
// 默认切到红外白热模式
setFrameType(GimbalImageType::IR_WHITEHOT);
return true;
#else
std::printf("[GimbalController] SpireCV 未启用, 吊舱模拟模式\n");
state_.connected = true;
return true;
#endif
}
void GimbalController::disconnect() {
#ifdef USE_SPIRECV
if (gimbal_) {
gimbal_->close();
delete gimbal_;
gimbal_ = nullptr;
}
#endif
state_.connected = false;
}
void GimbalController::setAngleEuler(double roll, double pitch, double yaw) {
state_.roll = roll;
state_.pitch = pitch;
state_.yaw = yaw;
#ifdef USE_SPIRECV
if (gimbal_) {
// P600手册: setAngleEuler(roll, pitch, yaw)
// pitch 下俯=正, yaw 左转=正
gimbal_->setAngleEuler(roll, pitch, yaw);
}
#else
std::printf("[Gimbal] setAngleEuler(%.1f, %.1f, %.1f)\n", roll, pitch, yaw);
#endif
}
void GimbalController::setAngleRateEuler(double roll, double pitch_rate, double yaw_rate) {
#ifdef USE_SPIRECV
if (gimbal_) {
gimbal_->setAngleRateEuler(roll, pitch_rate, yaw_rate);
}
#else
std::printf("[Gimbal] setAngleRateEuler(%.1f, %.1f, %.1f)\n", roll, pitch_rate, yaw_rate);
#endif
}
void GimbalController::setFrameType(GimbalImageType type) {
state_.image_type = type;
#ifdef USE_SPIRECV
if (gimbal_) {
// SpireCV 图像类型映射 (P600手册 p46-48)
sv::GimbalImageType sv_type;
switch (type) {
case GimbalImageType::EO: sv_type = sv::GimbalImageType::GIMBAL_EO; break;
case GimbalImageType::IR_WHITEHOT: sv_type = sv::GimbalImageType::GIMBAL_IRW; break;
case GimbalImageType::IR_PSEUDOCOLOR: sv_type = sv::GimbalImageType::GIMBAL_IRC; break;
case GimbalImageType::EO_IR_WHITEHOT: sv_type = sv::GimbalImageType::GIMBAL_EO_IRW; break;
case GimbalImageType::EO_IR_COLOR: sv_type = sv::GimbalImageType::GIMBAL_EO_IRC; break;
default: sv_type = sv::GimbalImageType::GIMBAL_IRW; break;
}
gimbal_->setFrameType(sv_type);
}
#else
std::printf("[Gimbal] setFrameType(%s)\n", gimbal_image_type_str(type));
#endif
}
void GimbalController::trackTarget(double target_offset_x, double target_offset_y) {
// P600手册追踪参数: kp_gimbal=1.0
double kp = cfg_.gimbal_kp;
// 将归一化偏移 [-1, 1] 转为角速率
double max_yaw_rate = cfg_.gimbal_max_yaw_rate;
double yaw_rate = -target_offset_x * kp * max_yaw_rate;
double pitch_rate = target_offset_y * kp * max_yaw_rate;
// 限制角速率
yaw_rate = std::max(-(double)max_yaw_rate, std::min((double)max_yaw_rate, yaw_rate));
pitch_rate = std::max(-(double)max_yaw_rate, std::min((double)max_yaw_rate, pitch_rate));
setAngleRateEuler(0, pitch_rate, yaw_rate);
}
void GimbalController::setDownwardAngle(double angle_deg) {
// P600手册: downward_locked_angle() → setAngleEuler(0, angle, 0)
setAngleEuler(0, angle_deg, 0);
std::printf("[Gimbal] 俯仰锁定: %.1f 度\n", angle_deg);
}
void GimbalController::takePhoto() {
#ifdef USE_SPIRECV
if (gimbal_) {
gimbal_->takePhoto();
}
#else
std::printf("[Gimbal] takePhoto()\n");
#endif
}
void GimbalController::setZoom(double factor) {
#ifdef USE_SPIRECV
if (gimbal_) {
gimbal_->setZoom(factor);
}
#else
std::printf("[Gimbal] setZoom(%.1f)\n", factor);
#endif
}

@ -0,0 +1,845 @@
#include "fusion_types.h"
#include "threat_cache.h"
#include "fusion_engine.h"
#include "avoidance_controller.h"
#include "gimbal_controller.h"
// 直接引用热成像检测 C++ 类 (替代 Python 的 subprocess 方式)
#include "thermal_preprocessor.h"
#include "thermal_detector.h"
#include "thermal_types.h"
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <set>
#include <atomic>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
// ── ROS 集成 (可选) ──
// 编译时定义 USE_ROS 启用 ROS 节点模式
// 否则编译为独立测试工具
//
// Prometheus uav_control 框架集成:
// 本节点通过 prometheus_msgs 与 uav_control 通信:
// 订阅: /uav{N}/prometheus/state (UAVState, 获取无人机状态/航向)
// 订阅: /uav{N}/prometheus/control_state (UAVControlState, 检查控制权)
// 发布: /uav{N}/prometheus/command (UAVCommand, 避障速度指令)
// 发布: /uav{N}/prometheus/text_info (TextInfo, 地面站状态消息)
// 图像来源:
// 订阅: /uav{N}/gimbal/image_original (sensor_msgs/Image, SpireCV 吊舱)
#ifdef USE_ROS
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <std_msgs/String.h>
#include <std_msgs/Bool.h>
#include <std_msgs/Float32MultiArray.h>
#include <diagnostic_msgs/DiagnosticArray.h>
#include <diagnostic_msgs/DiagnosticStatus.h>
#include <diagnostic_msgs/KeyValue.h>
#include <cv_bridge/cv_bridge.h>
// Prometheus 消息类型
#include <prometheus_msgs/UAVCommand.h>
#include <prometheus_msgs/UAVState.h>
#include <prometheus_msgs/UAVControlState.h>
#include <prometheus_msgs/DetectionInfo.h>
#include <prometheus_msgs/MultiDetectionInfo.h>
#include <prometheus_msgs/GimbalControl.h>
#include <prometheus_msgs/GimbalState.h>
#include <prometheus_msgs/TextInfo.h>
#endif
// ══════════════════════════════════════════════════════════════
// 热成像桥接 — 直接调用 C++ 检测器 (替代 subprocess)
// ══════════════════════════════════════════════════════════════
class ThermalBridge {
public:
ThermalBridge(double max_rate = 2.0)
: max_rate_(max_rate), processing_(false), fail_count_(0),
enabled_(true), last_time_(0) {
preprocessor_ = std::make_unique<ThermalPreprocessor>();
detector_ = std::make_unique<ThermalDetector>();
}
bool enabled() const { return enabled_; }
// 处理一帧图像, 同步调用
ThermalCacheEntry process(const cv::Mat& image) {
ThermalCacheEntry entry;
if (!enabled_) return entry;
auto now = std::chrono::system_clock::now();
double ts = std::chrono::duration<double>(now.time_since_epoch()).count();
if (processing_.exchange(true)) return entry;
if (ts - last_time_ < 1.0 / std::max(max_rate_, 0.1)) {
processing_ = false;
return entry;
}
last_time_ = ts;
try {
auto preprocessed = preprocessor_->preprocess(image);
auto assessment = detector_->detect(preprocessed);
entry.ambient_temp = assessment.ambient_temp;
entry.timestamp = ts;
for (auto& d : assessment.detections) {
ThermalCacheEntry::Detection det;
det.type = ThreatTypeInfo::label(d.type);
det.confidence = d.confidence;
det.max_temp = d.max_temp;
det.bbox_x = d.bbox.x;
det.bbox_y = d.bbox.y;
det.bbox_w = d.bbox.width;
det.bbox_h = d.bbox.height;
entry.detections.push_back(det);
}
fail_count_ = 0;
} catch (const std::exception& e) {
std::fprintf(stderr, "[ThermalBridge] 检测异常: %s\n", e.what());
fail_count_++;
if (fail_count_ >= 5) {
std::fprintf(stderr, "[ThermalBridge] 连续 %d 次失败, 禁用\n", fail_count_);
enabled_ = false;
}
}
processing_ = false;
return entry;
}
// 处理一帧图像, 异步回调
using Callback = std::function<void(const ThermalCacheEntry&)>;
void process_async(const cv::Mat& image, Callback callback) {
if (!enabled_ || processing_.exchange(true)) return;
std::thread([this, image, callback]() {
auto result = process(image);
processing_ = false;
if (!result.detections.empty()) {
callback(result);
}
}).detach();
}
private:
double max_rate_;
std::atomic<bool> processing_;
int fail_count_;
bool enabled_;
double last_time_;
std::unique_ptr<ThermalPreprocessor> preprocessor_;
std::unique_ptr<ThermalDetector> detector_;
};
// ══════════════════════════════════════════════════════════════
// 工具函数
// ══════════════════════════════════════════════════════════════
static double get_time() {
auto now = std::chrono::system_clock::now();
return std::chrono::duration<double>(now.time_since_epoch()).count();
}
static double quaternion_to_yaw(double w, double x, double y, double z) {
double siny_cosp = 2.0 * (w * z + x * y);
double cosy_cosp = 1.0 - 2.0 * (y * y + z * z);
double yaw = std::atan2(siny_cosp, cosy_cosp) * 180.0 / M_PI;
return std::fmod(yaw + 360.0, 360.0);
}
// ══════════════════════════════════════════════════════════════
// ROS 节点模式 — Prometheus uav_control 框架集成
// ══════════════════════════════════════════════════════════════
#ifdef USE_ROS
class ThreatFusionNode {
public:
ThreatFusionNode()
: cache_(0.5),
bridge_(2.0),
fusion_engine_(cache_, cfg_),
avoidance_ctrl_(cfg_),
gimbal_ctrl_(cfg_),
uav_state_received_(false),
command_id_(0)
{
load_params();
setup_ros();
}
void run() {
std::printf("[ThreatFusion] 节点已启动 (Prometheus uav_control 框架)\n");
std::printf("[ThreatFusion] UAV%d | 命名空间: %s\n", cfg_.uav_id, cfg_.uav_namespace.c_str());
std::printf("[ThreatFusion] 热成像:%s | 闪光:%s | 声源:%s\n",
cfg_.thermal_enabled ? "ON" : "OFF",
cfg_.flash_enabled ? "ON" : "OFF",
cfg_.acoustic_enabled ? "ON" : "OFF");
// 连接吊舱
if (gimbal_ctrl_.connect()) {
std::printf("[ThreatFusion] AT10 吊舱已连接\n");
}
// 等待 uav_control 状态
ROS_INFO("[ThreatFusion] 等待 /prometheus/state ...");
ros::Time t0 = ros::Time::now();
while (!uav_state_received_ && (ros::Time::now() - t0).toSec() < 10.0) {
ros::spinOnce();
ros::Duration(0.1).sleep();
}
if (!uav_state_received_) {
ROS_WARN("[ThreatFusion] 未收到 UAVState, 继续运行 (可能 uav_control 未启动)");
} else {
ROS_INFO("[ThreatFusion] UAVState 已接收, 无人机已连接");
}
ros::spin();
}
private:
FusionConfig cfg_;
ThreatCache cache_;
ThermalBridge bridge_;
FusionEngine fusion_engine_;
AvoidanceController avoidance_ctrl_;
GimbalController gimbal_ctrl_;
// 无人机状态 (从 UAVState 获取)
double drone_heading_ = 0;
double drone_pos_x_ = 0, drone_pos_y_ = 0, drone_pos_z_ = 0;
bool uav_state_received_ = false;
bool uav_armed_ = false;
uint8_t control_state_ = 0; // UAVControlState.control_state
FusionThreatLevel current_level_ = FusionThreatLevel::SAFE;
std::vector<FusedThreat> current_threats_;
bool avoidance_active_ = false;
std::set<std::string> published_ids_;
std::map<std::string, std::string> modality_status_;
uint32_t command_id_ = 0;
// ROS 接口
// Prometheus 发布者
ros::Publisher command_pub_; // /uav{N}/prometheus/command
ros::Publisher text_info_pub_; // /uav{N}/prometheus/text_info
ros::Publisher detection_pub_; // /uav{N}/prometheus/detection
// 自有话题
ros::Publisher status_pub_; // /uav{N}/threat_fusion/status
ros::Publisher threat_pub_; // /uav{N}/threat_fusion/fused_threats
ros::Publisher avoid_pub_; // /uav{N}/threat_fusion/avoidance_cmd
ros::Publisher diag_pub_; // /uav{N}/threat_fusion/diagnostics
// Prometheus 订阅者
ros::Subscriber uav_state_sub_; // /uav{N}/prometheus/state
ros::Subscriber ctrl_state_sub_; // /uav{N}/prometheus/control_state
// 图像/检测订阅者
ros::Subscriber thermal_sub_;
ros::Subscriber flash_bool_sub_;
ros::Subscriber flash_det_sub_;
// 云台状态订阅
ros::Subscriber gimbal_state_sub_; // /uav{N}/gimbal/state
ros::Timer fusion_timer_;
ros::Timer status_timer_;
ros::Timer diag_timer_;
void load_params() {
auto& nh = *ros::NodeHandle("~");
// Prometheus uav_control 参数
cfg_.uav_id = nh.param("uav_id", 1);
cfg_.uav_namespace = "/uav" + std::to_string(cfg_.uav_id);
cfg_.thermal_enabled = nh.param("thermal_enabled", true);
cfg_.flash_enabled = nh.param("flash_enabled", true);
cfg_.acoustic_enabled = nh.param("acoustic_enabled", true);
cfg_.thermal_image_topic = nh.param("thermal_image_topic",
cfg_.uav_namespace + "/gimbal/image_original");
cfg_.fusion_time_window = nh.param("fusion_time_window", 0.5);
cfg_.fusion_confidence_threshold = nh.param("fusion_confidence_threshold", 0.5);
cfg_.acoustic_confidence_threshold = nh.param("acoustic_confidence_threshold", 0.6);
cfg_.avoidance_enabled = nh.param("avoidance_enabled", true);
cfg_.avoidance_speed = nh.param("avoidance_speed", 2.0);
cfg_.avoidance_decel_distance = nh.param("avoidance_decel_distance", 10.0);
cfg_.avoidance_cooldown = nh.param("avoidance_cooldown", 5.0);
cfg_.avoidance_hold_time = nh.param("avoidance_hold_time", 2.0);
cfg_.avoidance_smoothing = nh.param("avoidance_smoothing", 0.3);
cfg_.thermal_hfov = nh.param("thermal_hfov", 32.0);
// 安全限制 (对齐 uav_control_outdoor.yaml)
cfg_.maximum_safe_vel_xy = nh.param("maximum_safe_vel_xy", 5.0);
cfg_.maximum_safe_vel_z = nh.param("maximum_safe_vel_z", 4.0);
// P600 吊舱参数
cfg_.gimbal_port = nh.param("gimbal_port", std::string("/dev/ttyUSB1"));
cfg_.gimbal_kp = nh.param("gimbal_kp", 1.0);
cfg_.tracking_kp_x = nh.param("tracking_kp_x", 0.3);
cfg_.tracking_kp_z = nh.param("tracking_kp_z", 0.1);
cfg_.tracking_max_velocity = nh.param("tracking_max_velocity", 2.5);
cfg_.tracking_distance = nh.param("tracking_distance", 10.0);
cfg_.gimbal_max_yaw_rate = nh.param("gimbal_max_yaw_rate", 40);
modality_status_["thermal"] = cfg_.thermal_enabled ? "OK" : "DISABLED";
modality_status_["flash"] = cfg_.flash_enabled ? "OK" : "DISABLED";
modality_status_["acoustic"] = cfg_.acoustic_enabled ? "OK" : "DISABLED";
}
void setup_ros() {
ros::NodeHandle nh;
// ── Prometheus 发布者 ──
// 发布避障速度指令到 uav_control
command_pub_ = nh.advertise<prometheus_msgs::UAVCommand>(
cfg_.uav_namespace + "/prometheus/command", 10);
// 发布地面站文本消息
text_info_pub_ = nh.advertise<prometheus_msgs::TextInfo>(
cfg_.uav_namespace + "/prometheus/text_info", 5);
// 发布检测结果 (供其他模块使用, 如 yolov5_tracking)
detection_pub_ = nh.advertise<prometheus_msgs::MultiDetectionInfo>(
cfg_.uav_namespace + "/prometheus/detection", 5);
// ── 自有话题发布者 ──
status_pub_ = nh.advertise<std_msgs::String>(
cfg_.uav_namespace + "/threat_fusion/status", 5);
threat_pub_ = nh.advertise<std_msgs::String>(
cfg_.uav_namespace + "/threat_fusion/fused_threats", 10);
avoid_pub_ = nh.advertise<prometheus_msgs::UAVCommand>(
cfg_.uav_namespace + "/threat_fusion/avoidance_cmd", 5);
diag_pub_ = nh.advertise<diagnostic_msgs::DiagnosticArray>(
cfg_.uav_namespace + "/threat_fusion/diagnostics", 5);
// ── Prometheus 订阅者 ──
// 订阅无人机状态 (替代 MAVROS pose 订阅)
uav_state_sub_ = nh.subscribe(
cfg_.uav_namespace + "/prometheus/state", 5,
&ThreatFusionNode::uav_state_cb, this);
// 订阅控制状态 (检查是否处于 COMMAND_CONTROL 模式)
ctrl_state_sub_ = nh.subscribe(
cfg_.uav_namespace + "/prometheus/control_state", 5,
&ThreatFusionNode::ctrl_state_cb, this);
// 订阅云台状态
gimbal_state_sub_ = nh.subscribe(
cfg_.uav_namespace + "/gimbal/state", 5,
&ThreatFusionNode::gimbal_state_cb, this);
// ── 图像/检测订阅者 ──
if (cfg_.thermal_enabled) {
thermal_sub_ = nh.subscribe(cfg_.thermal_image_topic, 1,
&ThreatFusionNode::thermal_image_cb, this);
}
if (cfg_.flash_enabled) {
flash_bool_sub_ = nh.subscribe("/flash_detector/flash_detected", 5,
&ThreatFusionNode::flash_bool_cb, this);
flash_det_sub_ = nh.subscribe("/flash_detector/detection", 5,
&ThreatFusionNode::flash_detection_cb, this);
}
// ── 定时器 ──
fusion_timer_ = nh.createTimer(ros::Duration(0.1),
&ThreatFusionNode::fusion_timer_cb, this);
status_timer_ = nh.createTimer(ros::Duration(0.5),
&ThreatFusionNode::status_timer_cb, this);
diag_timer_ = nh.createTimer(ros::Duration(1.0),
&ThreatFusionNode::diag_timer_cb, this);
}
// ── Prometheus 回调 ──
// 从 UAVState 获取无人机状态 (替代 MAVROS pose)
// UAVState.attitude[2] = yaw (rad, ENU 坐标系)
void uav_state_cb(const prometheus_msgs::UAVState::ConstPtr& msg) {
uav_state_received_ = true;
uav_armed_ = msg->armed;
// 位置 (ENU)
drone_pos_x_ = msg->position[0];
drone_pos_y_ = msg->position[1];
drone_pos_z_ = msg->position[2];
// 航向: UAVState.attitude[2] 为 yaw (rad), ENU 坐标系
// Prometheus 约定: yaw=0 指向东, 逆时针为正
// 我们需要: 0=北, 顺时针为正
double yaw_rad = msg->attitude[2];
drone_heading_ = std::fmod((90.0 - yaw_rad * 180.0 / M_PI) + 360.0, 360.0);
}
void ctrl_state_cb(const prometheus_msgs::UAVControlState::ConstPtr& msg) {
control_state_ = msg->control_state;
}
void gimbal_state_cb(const prometheus_msgs::GimbalState::ConstPtr& msg) {
// 可用于同步云台角度状态
}
// ── 图像/检测回调 ──
void thermal_image_cb(const sensor_msgs::Image::ConstPtr& msg) {
try {
auto cv_img = cv_bridge::toCvShare(msg, "bgr8");
auto entry = bridge_.process(cv_img->image);
if (!entry.detections.empty()) {
entry.timestamp = get_time();
cache_.add_thermal(entry);
// 发布检测结果为 Prometheus DetectionInfo (供追踪模块使用)
publish_detections(entry, msg->header);
// 用第一个人员检测的偏移量控制云台追踪
for (auto& d : entry.detections) {
if (d.type == "Person" && d.bbox_w > 0) {
double img_cx = msg->width / 2.0;
double img_cy = msg->height / 2.0;
double det_cx = d.bbox_x + d.bbox_w / 2.0;
double det_cy = d.bbox_y + d.bbox_h / 2.0;
double offset_x = (det_cx - img_cx) / img_cx;
double offset_y = (det_cy - img_cy) / img_cy;
gimbal_ctrl_.trackTarget(offset_x, offset_y);
break;
}
}
}
} catch (const cv_bridge::Exception& e) {
ROS_WARN("[ThreatFusion] cv_bridge 异常: %s", e.what());
}
}
void flash_bool_cb(const std_msgs::Bool::ConstPtr& msg) {}
void flash_detection_cb(const std_msgs::Float32MultiArray::ConstPtr& msg) {
auto& data = msg->data;
if (data.size() >= 5) {
FlashDetection f;
f.cx = data[0]; f.cy = data[1]; f.area = data[2];
f.sight_x = data[3]; f.sight_y = data[4];
f.timestamp = get_time();
cache_.add_flash(f);
}
}
// ── 定时器 ──
void fusion_timer_cb(const ros::TimerEvent&) {
double now = get_time();
auto threats = fusion_engine_.fuse(now, drone_heading_);
current_threats_ = threats;
current_level_ = FusionThreatLevel::SAFE;
for (auto& t : threats) {
if (t.level > current_level_) current_level_ = t.level;
}
// 发布新威胁
for (auto& t : threats) {
if (published_ids_.find(t.threat_id) == published_ids_.end()) {
publish_fused_threat(t);
published_ids_.insert(t.threat_id);
}
}
if (published_ids_.size() > 100) {
std::set<std::string> keep(published_ids_.rbegin(), std::next(published_ids_.rbegin(), 50));
published_ids_ = keep;
}
// 避障: 通过 Prometheus UAVCommand 发送速度指令
AvoidanceCmd cmd;
avoidance_active_ = avoidance_ctrl_.compute(threats, now, cmd);
if (avoidance_active_ && uav_armed_) {
// 限速 (与 uav_control 安全限制对齐)
cmd.vx = std::max(-cfg_.maximum_safe_vel_xy, std::min(cfg_.maximum_safe_vel_xy, cmd.vx));
cmd.vy = std::max(-cfg_.maximum_safe_vel_xy, std::min(cfg_.maximum_safe_vel_xy, cmd.vy));
cmd.vz = std::max(-cfg_.maximum_safe_vel_z, std::min(cfg_.maximum_safe_vel_z, cmd.vz));
// 地理围栏检查
double new_x = drone_pos_x_ + cmd.vx * 0.1;
double new_y = drone_pos_y_ + cmd.vy * 0.1;
double new_z = drone_pos_z_ + cmd.vz * 0.1;
if (new_x < cfg_.geo_fence_x_min || new_x > cfg_.geo_fence_x_max ||
new_y < cfg_.geo_fence_y_min || new_y > cfg_.geo_fence_y_max ||
new_z < cfg_.geo_fence_z_min || new_z > cfg_.geo_fence_z_max) {
ROS_WARN("[ThreatFusion] 避障指令超出地理围栏, 已拦截");
avoidance_active_ = false;
} else {
// 发布到 Prometheus 命令话题
auto uav_cmd = make_avoidance_command(cmd);
command_pub_.publish(uav_cmd);
avoid_pub_.publish(uav_cmd);
}
}
}
void status_timer_cb(const ros::TimerEvent&) {
// 发布自有状态 (JSON)
char buf[512];
std::snprintf(buf, sizeof(buf),
"{\"threat_level\":\"%s\",\"threat_count\":%d,\"avoidance_active\":%s,"
"\"drone_heading\":%.1f,\"uav_armed\":%s,\"control_state\":%d,"
"\"modalities\":{\"thermal\":\"%s\",\"flash\":\"%s\",\"acoustic\":\"%s\"},"
"\"timestamp\":%.3f}",
FusionThreatLevelInfo::label(current_level_),
(int)current_threats_.size(),
avoidance_active_ ? "true" : "false",
drone_heading_,
uav_armed_ ? "true" : "false",
(int)control_state_,
modality_status_["thermal"].c_str(),
modality_status_["flash"].c_str(),
modality_status_["acoustic"].c_str(),
get_time());
std_msgs::String msg;
msg.data = buf;
status_pub_.publish(msg);
// 同时发布 Prometheus TextInfo (地面站可见)
if (current_level_ >= FusionThreatLevel::WARNING) {
prometheus_msgs::TextInfo info;
info.header.stamp = ros::Time::now();
if (current_level_ >= FusionThreatLevel::CRITICAL)
info.MessageType = prometheus_msgs::TextInfo::FATAL;
else if (current_level_ >= FusionThreatLevel::DANGER)
info.MessageType = prometheus_msgs::TextInfo::ERROR;
else
info.MessageType = prometheus_msgs::TextInfo::WARN;
char info_buf[256];
std::snprintf(info_buf, sizeof(info_buf),
"ThreatFusion: %s | %d threats | avoidance=%s",
FusionThreatLevelInfo::label(current_level_),
(int)current_threats_.size(),
avoidance_active_ ? "ON" : "OFF");
info.Message = info_buf;
text_info_pub_.publish(info);
}
}
void diag_timer_cb(const ros::TimerEvent&) {
diagnostic_msgs::DiagnosticArray diag;
diag.header.stamp = ros::Time::now();
diagnostic_msgs::DiagnosticStatus ds;
ds.name = cfg_.uav_namespace + "/threat_fusion";
ds.level = (current_level_ >= FusionThreatLevel::DANGER)
? diagnostic_msgs::DiagnosticStatus::WARN
: diagnostic_msgs::DiagnosticStatus::OK;
char buf[128];
std::snprintf(buf, sizeof(buf), "Level: %s, Threats: %d",
FusionThreatLevelInfo::label(current_level_),
(int)current_threats_.size());
ds.message = buf;
diagnostic_msgs::KeyValue kv;
kv.key = "thermal"; kv.value = modality_status_["thermal"]; ds.values.push_back(kv);
kv.key = "flash"; kv.value = modality_status_["flash"]; ds.values.push_back(kv);
kv.key = "acoustic"; kv.value = modality_status_["acoustic"]; ds.values.push_back(kv);
kv.key = "avoidance_active"; kv.value = avoidance_active_ ? "true" : "false"; ds.values.push_back(kv);
kv.key = "uav_state_received"; kv.value = uav_state_received_ ? "true" : "false"; ds.values.push_back(kv);
diag.status.push_back(ds);
diag_pub_.publish(diag);
}
// ── 辅助 ──
// 构建 Prometheus 避障命令 (ENU 速度模式)
prometheus_msgs::UAVCommand make_avoidance_command(const AvoidanceCmd& cmd) {
prometheus_msgs::UAVCommand ucmd;
ucmd.header.stamp = ros::Time::now();
ucmd.Agent_CMD = prometheus_msgs::UAVCommand::Move;
ucmd.Move_mode = prometheus_msgs::UAVCommand::XYZ_VEL; // ENU 速度控制
ucmd.velocity_ref[0] = cmd.vx; // East
ucmd.velocity_ref[1] = cmd.vy; // North
ucmd.velocity_ref[2] = cmd.vz; // Up
ucmd.yaw_ref = drone_heading_ * M_PI / 180.0; // 保持当前航向
ucmd.Command_ID = ++command_id_;
return ucmd;
}
// 发布热成像检测结果为 Prometheus MultiDetectionInfo
void publish_detections(const ThermalCacheEntry& entry,
const std_msgs::Header& img_header) {
prometheus_msgs::MultiDetectionInfo multi;
multi.header = img_header;
multi.num_objs = (int32_t)entry.detections.size();
multi.detect_or_track = 0; // 0=detection
for (auto& d : entry.detections) {
prometheus_msgs::DetectionInfo det;
det.header = img_header;
det.object_name = d.type;
det.detected = true;
det.frame = 0; // 本地坐标系
det.pixel_position[0] = d.bbox_x + d.bbox_w / 2;
det.pixel_position[1] = d.bbox_y + d.bbox_h / 2;
// 类别映射
if (d.type == "Person") det.category = 1;
else if (d.type == "Hotspot") det.category = 2;
else if (d.type.find("Barrel") != std::string::npos) det.category = 3;
else if (d.type.find("Weapon") != std::string::npos || d.type.find("Gun") != std::string::npos)
det.category = 4;
else det.category = 99;
multi.detection_infos.push_back(det);
}
detection_pub_.publish(multi);
}
void publish_fused_threat(const FusedThreat& t) {
char buf[512];
std::string sources_str = "[";
for (size_t i = 0; i < t.sources.size(); i++) {
if (i > 0) sources_str += ",";
sources_str += "\"" + t.sources[i] + "\"";
}
sources_str += "]";
std::snprintf(buf, sizeof(buf),
"{\"id\":\"%s\",\"level\":\"%s\",\"confidence\":%.3f,"
"\"bearing\":%.1f,\"elevation\":%.1f,\"distance\":%.1f,"
"\"sources\":%s,\"description\":\"%s\",\"timestamp\":%.3f}",
t.threat_id.c_str(),
FusionThreatLevelInfo::label(t.level),
t.confidence,
t.bearing, t.elevation, t.distance,
sources_str.c_str(),
t.description.c_str(),
t.timestamp);
std_msgs::String msg;
msg.data = buf;
threat_pub_.publish(msg);
}
};
#endif // USE_ROS
// ══════════════════════════════════════════════════════════════
// 独立测试模式 (无 ROS)
// ══════════════════════════════════════════════════════════════
#ifndef USE_ROS
static void print_usage(const char* prog) {
std::cout << "多模态威胁融合 — 独立测试模式\n"
<< "用法:\n"
<< " " << prog << " <image> [options]\n"
<< " " << prog << " <directory> [options]\n\n"
<< "选项:\n"
<< " --no-show 不显示结果\n"
<< " --json JSON 输出\n"
<< " --simulate 模拟融合流程 (用热成像结果模拟多模态)\n"
<< " --gimbal-test 测试云台控制 (需要 SpireCV)\n"
<< " --help 显示帮助\n";
}
static std::string get_output_path(const std::string& input_path) {
auto pos = input_path.find_last_of("/\\");
std::string dir = (pos != std::string::npos) ? input_path.substr(0, pos + 1) : "";
std::string fname = (pos != std::string::npos) ? input_path.substr(pos + 1) : input_path;
return dir + "fusion_" + fname;
}
static bool has_image_ext(const std::string& path) {
std::string ext;
auto pos = path.rfind('.');
if (pos != std::string::npos) ext = path.substr(pos);
return ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp" || ext == ".tif";
}
// 模拟融合: 用热成像检测结果模拟多模态融合
static void simulate_fusion(const ThermalCacheEntry& thermal_entry,
const FusionConfig& cfg,
double heading,
int image_width)
{
ThreatCache cache(cfg.fusion_time_window);
cache.add_thermal(thermal_entry);
FusionEngine engine(cache, cfg);
auto threats = engine.fuse(get_time(), heading, image_width);
std::cout << "\n── 融合结果 ──\n";
std::cout << "威胁数量: " << threats.size() << "\n";
for (auto& t : threats) {
std::cout << " [" << FusionThreatLevelInfo::label(t.level) << "] "
<< t.threat_id << " conf=" << (int)(t.confidence * 100) << "% "
<< "bearing=" << (int)t.bearing << "° "
<< "dist=" << t.distance << "m "
<< "sources=";
for (auto& s : t.sources) std::cout << s << ",";
std::cout << " " << t.description << "\n";
}
// 避障
AvoidanceController avoid(cfg);
AvoidanceCmd cmd;
if (avoid.compute(threats, get_time(), cmd)) {
std::cout << " 避障指令: vx=" << cmd.vx << " vy=" << cmd.vy << " vz=" << cmd.vz << "\n";
} else {
std::cout << " 无需避障\n";
}
}
int main(int argc, char* argv[]) {
if (argc < 2) { print_usage(argv[0]); return 1; }
std::string source;
bool show = true, json_out = false, simulate = false, gimbal_test = false;
for (int i = 1; i < argc; i++) {
if (std::strcmp(argv[i], "--no-show") == 0) show = false;
else if (std::strcmp(argv[i], "--json") == 0) json_out = true;
else if (std::strcmp(argv[i], "--simulate") == 0) simulate = true;
else if (std::strcmp(argv[i], "--gimbal-test") == 0) gimbal_test = true;
else if (std::strcmp(argv[i], "--help") == 0) { print_usage(argv[0]); return 0; }
else if (source.empty()) source = argv[i];
}
if (!gimbal_test && source.empty()) { print_usage(argv[0]); return 1; }
// 云台测试
if (gimbal_test) {
FusionConfig cfg;
GimbalController gimbal(cfg);
std::cout << "连接 AT10 吊舱...\n";
if (!gimbal.connect()) {
std::cerr << "连接失败\n";
return 1;
}
std::cout << "已连接, 测试控制...\n";
// 切换到红外白热
gimbal.setFrameType(GimbalImageType::IR_WHITEHOT);
// 俯视 45 度
gimbal.setDownwardAngle(45.0);
// 追踪偏移
gimbal.trackTarget(0.3, -0.2);
// 拍照
gimbal.takePhoto();
std::cout << "测试完成\n";
gimbal.disconnect();
return 0;
}
// 图像处理
cv::Mat img = cv::imread(source, cv::IMREAD_COLOR);
if (img.empty()) img = cv::imread(source, cv::IMREAD_GRAYSCALE);
if (img.empty()) {
std::cerr << "无法读取: " << source << "\n";
return 1;
}
// 热成像检测 (直接 C++ 调用, 无 subprocess)
ThermalBridge bridge;
auto t0 = std::chrono::high_resolution_clock::now();
auto entry = bridge.process(img);
auto t1 = std::chrono::high_resolution_clock::now();
double ms = std::chrono::duration<double, std::milli>(t1 - t0).count();
// 输出
if (json_out) {
std::cout << "{\n";
std::cout << " \"detection_count\": " << entry.detections.size() << ",\n";
std::cout << " \"ambient_temp\": " << entry.ambient_temp << ",\n";
std::cout << " \"time_ms\": " << ms << ",\n";
std::cout << " \"detections\": [\n";
for (size_t i = 0; i < entry.detections.size(); i++) {
auto& d = entry.detections[i];
std::cout << " {\"type\":\"" << d.type
<< "\", \"confidence\":" << d.confidence
<< ", \"max_temp\":" << d.max_temp
<< ", \"bbox\":{\"x\":" << d.bbox_x
<< ",\"y\":" << d.bbox_y
<< ",\"w\":" << d.bbox_w
<< ",\"h\":" << d.bbox_h << "}}";
if (i + 1 < entry.detections.size()) std::cout << ",";
std::cout << "\n";
}
std::cout << " ]\n}\n";
} else {
std::cout << "========================================\n";
std::cout << " Image: " << source << "\n";
std::cout << " Time: " << ms << " ms\n";
std::cout << " Ambient: " << entry.ambient_temp << " C\n";
std::cout << " Detections: " << entry.detections.size() << "\n";
for (auto& d : entry.detections) {
std::cout << " [" << d.type << "] conf:" << (int)(d.confidence * 100)
<< "% temp:" << d.max_temp << "C area:" << d.bbox_w * d.bbox_h << "\n";
}
std::cout << "========================================\n";
}
// 模拟融合
if (simulate && !entry.detections.empty()) {
simulate_fusion(entry, FusionConfig{}, 0.0, img.cols);
}
// 可视化 (复用 thermal_detector 的绘制)
ThermalPreprocessor preprocessor;
ThermalDetector detector;
auto preprocessed = preprocessor.preprocess(img);
auto assessment = detector.detect(preprocessed);
cv::Mat vis = ThermalDetector::draw_detections(img, assessment);
// 在可视化图上叠加融合信息
if (simulate && !entry.detections.empty()) {
ThreatCache cache_vis;
cache_vis.add_thermal(entry);
FusionEngine engine_vis(cache_vis, FusionConfig{});
auto threats = engine_vis.fuse(get_time(), 0.0, img.cols);
int y_off = 30;
for (auto& t : threats) {
std::string text = std::string("[") + FusionThreatLevelInfo::label(t.level)
+ "] " + t.description;
cv::putText(vis, text, {10, y_off}, cv::FONT_HERSHEY_SIMPLEX, 0.5,
{0, 0, 255}, 1);
y_off += 20;
}
}
std::string out_path = get_output_path(source);
cv::imwrite(out_path, vis);
if (!json_out) std::cout << " Saved: " << out_path << "\n";
if (show) {
cv::imshow("Fusion Detection", vis);
cv::waitKey(0);
cv::destroyAllWindows();
}
return 0;
}
#else // USE_ROS
int main(int argc, char** argv) {
ros::init(argc, argv, "threat_fusion_node");
ThreatFusionNode node;
node.run();
return 0;
}
#endif // USE_ROS

@ -0,0 +1,920 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
多模态威胁融合节点 热成像 + 闪光 + 声源 避障
融合三条感知管道的输出生成综合威胁评估和避障速度指令
通过 MAVROS 发送给 PX4 执行
架构:
热成像 exe (subprocess)
闪光检测 ROS Node ThreatFusionNode MAVROS PX4
声源检测 ROS Node
地面站 (rosbridge 浏览器)
用法:
rosrun threat_fusion threat_fusion_node.py
rosrun threat_fusion threat_fusion_node.py _thermal_exe_path:=/path/to/thermal_detector
"""
from __future__ import print_function
import json
import math
import os
import subprocess
import sys
import tempfile
import threading
import time
from collections import deque
from concurrent.futures import ThreadPoolExecutor
from dataclasses import dataclass, field
from enum import IntEnum
from typing import Any, Dict, List, Optional, Tuple
import numpy as np
import rospy
import std_msgs.msg
from geometry_msgs.msg import PoseStamped, TwistStamped, Vector3
from sensor_msgs.msg import Image
from std_msgs.msg import Bool, Float32MultiArray, String
from diagnostic_msgs.msg import DiagnosticArray, DiagnosticStatus, KeyValue
try:
from cv_bridge import CvBridge
HAS_CV_BRIDGE = True
except ImportError:
HAS_CV_BRIDGE = False
try:
import cv2
HAS_CV2 = True
except ImportError:
HAS_CV2 = False
# acoustic_analyzer 的自定义消息
try:
from acoustic_analyzer.msg import AcousticThreat, AcousticThreatArray
HAS_ACOUSTIC_MSG = True
except ImportError:
HAS_ACOUSTIC_MSG = False
# ══════════════════════════════════════════════════════════════
# 数据结构
# ══════════════════════════════════════════════════════════════
class ThreatLevel(IntEnum):
SAFE = 0
CAUTION = 1
WARNING = 2
DANGER = 3
CRITICAL = 4
@property
def label(self):
return ["Safe", "Caution", "Warning", "Danger", "Critical"][self.value]
@dataclass
class FusedThreat:
threat_id: str = ""
level: ThreatLevel = ThreatLevel.SAFE
confidence: float = 0.0
bearing: float = 0.0 # 方位角 (度), 0=北, 顺时针
elevation: float = 0.0 # 仰角 (度)
distance: float = -1.0 # 距离 (米), -1=未知
sources: list = field(default_factory=list)
description: str = ""
timestamp: float = 0.0
details: dict = field(default_factory=dict)
# ══════════════════════════════════════════════════════════════
# 时间窗口缓存
# ══════════════════════════════════════════════════════════════
class ThreatCache:
def __init__(self, time_window=0.5):
self.time_window = time_window
self._thermal = deque(maxlen=20)
self._flash = deque(maxlen=5)
self._acoustic = deque(maxlen=20)
self._lock = threading.Lock()
def add_thermal(self, detections, timestamp):
with self._lock:
self._thermal.append({"data": detections, "time": timestamp})
def add_flash(self, cx, cy, area, sight_x, sight_y, timestamp):
with self._lock:
self._flash.append({
"cx": cx, "cy": cy, "area": area,
"sight_x": sight_x, "sight_y": sight_y,
"time": timestamp,
})
def add_acoustic(self, threats, timestamp):
with self._lock:
for t in threats:
self._acoustic.append({"data": t, "time": timestamp})
def get_thermal(self, now):
cutoff = now - self.time_window
with self._lock:
return [e for e in self._thermal if e["time"] >= cutoff]
def get_flash(self, now):
cutoff = now - self.time_window
with self._lock:
items = [e for e in self._flash if e["time"] >= cutoff]
return items[-1] if items else None
def get_acoustic(self, now):
cutoff = now - self.time_window
with self._lock:
return [e for e in self._acoustic if e["time"] >= cutoff]
def clear(self):
with self._lock:
self._thermal.clear()
self._flash.clear()
self._acoustic.clear()
# ══════════════════════════════════════════════════════════════
# 热成像 exe 子进程封装
# ══════════════════════════════════════════════════════════════
class ThermalBridge:
def __init__(self, exe_path, timeout=5.0, max_rate=2.0):
self.exe_path = exe_path
self.timeout = timeout
self.max_rate = max_rate
self._processing = False
self._last_time = 0.0
self._fail_count = 0
self._enabled = os.path.isfile(exe_path) if exe_path else False
self._bridge = CvBridge() if HAS_CV_BRIDGE else None
self._executor = ThreadPoolExecutor(max_workers=1)
self._temp_files = []
if not self._enabled:
if exe_path:
rospy.logwarn("[ThermalBridge] exe 不存在: %s, 热成像模态已禁用", exe_path)
else:
rospy.logwarn("[ThermalBridge] 未配置 thermal_exe_path, 热成像模态已禁用")
@property
def enabled(self):
return self._enabled
def process_image(self, image_msg, callback):
if not self._enabled or not HAS_CV2 or not HAS_CV_BRIDGE:
return
now = time.time()
if self._processing:
return
if now - self._last_time < 1.0 / max(self.max_rate, 0.1):
return
self._processing = True
self._last_time = now
self._executor.submit(self._process, image_msg, callback)
def _process(self, image_msg, callback):
tmp_path = None
try:
tmp_path = self._save_temp_image(image_msg)
stdout = self._invoke_exe(tmp_path)
if stdout:
result = self._parse_json(stdout)
if result is not None:
self._fail_count = 0
callback(result)
return
self._fail_count += 1
if self._fail_count >= 5:
rospy.logerr("[ThermalBridge] 连续 %d 次失败, 禁用热成像模态", self._fail_count)
self._enabled = False
except Exception as e:
rospy.logwarn("[ThermalBridge] 处理异常: %s", str(e))
self._fail_count += 1
finally:
self._processing = False
if tmp_path and os.path.exists(tmp_path):
try:
os.unlink(tmp_path)
except OSError:
pass
def _save_temp_image(self, image_msg):
cv_image = self._bridge.imgmsg_to_cv2(image_msg, desired_encoding="bgr8")
fd, path = tempfile.mkstemp(suffix=".jpg", prefix="thermal_fusion_")
os.close(fd)
cv2.imwrite(path, cv_image)
return path
def _invoke_exe(self, image_path):
env = os.environ.copy()
# 常见 OpenCV DLL 路径
for p in [
os.path.expanduser("~/.conda/envs/opencv-build/Library/bin"),
os.path.expanduser("~/miniconda3/envs/opencv-build/Library/bin"),
]:
if os.path.isdir(p):
env["PATH"] = p + os.pathsep + env.get("PATH", "")
try:
result = subprocess.run(
[self.exe_path, image_path, "--json", "--no-show"],
capture_output=True, text=True, timeout=self.timeout,
encoding="utf-8", errors="replace", env=env,
)
if result.returncode == 0:
return result.stdout
else:
rospy.logwarn("[ThermalBridge] exe 返回 %d: %s", result.returncode, result.stderr[:200])
except subprocess.TimeoutExpired:
rospy.logwarn("[ThermalBridge] exe 超时 (%.1fs)", self.timeout)
except FileNotFoundError:
rospy.logerr("[ThermalBridge] exe 未找到: %s", self.exe_path)
return None
def _parse_json(self, stdout):
start = stdout.find("{")
if start < 0:
return None
try:
text = stdout[start:]
decoder = json.JSONDecoder()
obj, _ = decoder.raw_decode(text)
# 移除 file 字段 (中文路径可能含非法转义)
obj.pop("file", None)
return obj
except json.JSONDecodeError:
rospy.logwarn("[ThermalBridge] JSON 解析失败: %.100s", stdout[:100])
return None
def shutdown(self):
self._executor.shutdown(wait=False)
# ══════════════════════════════════════════════════════════════
# 融合引擎
# ══════════════════════════════════════════════════════════════
class FusionEngine:
# 权重配置
WEIGHTS = {"thermal": 0.35, "flash": 0.30, "acoustic": 0.35}
CROSS_BOOST_2 = 0.25
CROSS_BOOST_3 = 0.15
# 热成像类型 → 单独威胁等级
THERMAL_SOLO_LEVEL = {
"Person": ThreatLevel.WARNING,
"Barrel Overheat": ThreatLevel.DANGER,
"Cold Weapon": ThreatLevel.CAUTION,
"Flash Residue": ThreatLevel.CAUTION,
"Hotspot": ThreatLevel.CAUTION,
}
# 声源类型 → 单独威胁等级
ACOUSTIC_SOLO_LEVEL = {
"gunshot": ThreatLevel.WARNING,
"artillery": ThreatLevel.DANGER,
"explosion": ThreatLevel.DANGER,
"ambient": ThreatLevel.SAFE,
}
def __init__(self, cache, params):
self.cache = cache
self.params = params
self._threat_counter = 0
def fuse(self, now, drone_heading, image_width=640):
thermal_list = self.cache.get_thermal(now) if self.params.get("thermal_enabled") else []
flash_item = self.cache.get_flash(now) if self.params.get("flash_enabled") else None
acoustic_list = self.cache.get_acoustic(now) if self.params.get("acoustic_enabled") else []
threats = []
# 将各模态检测转为统一格式: (source, azimuth, confidence, level, details)
unified = []
for entry in thermal_list:
for det in entry["data"].get("detections", []):
azimuth = self._bbox_to_azimuth(det.get("bbox", {}), image_width, drone_heading)
conf = det.get("confidence", 0.5)
det_type = det.get("type", "Hotspot")
level = self.THERMAL_SOLO_LEVEL.get(det_type, ThreatLevel.CAUTION)
unified.append(("thermal", azimuth, conf, level, det))
if flash_item:
azimuth = self._sight_to_azimuth(flash_item["sight_x"], drone_heading)
area = flash_item.get("area", 0)
conf = min(1.0, area / 400.0) if area > 0 else 0.3
level = ThreatLevel.WARNING if area > 200 else ThreatLevel.CAUTION
unified.append(("flash", azimuth, conf, level, flash_item))
for entry in acoustic_list:
t = entry["data"]
azimuth = t.get("azimuth", 0.0)
conf = t.get("confidence", 0.0)
sound_type = t.get("sound_type", "ambient")
level = self.ACOUSTIC_SOLO_LEVEL.get(sound_type, ThreatLevel.SAFE)
if conf >= self.params.get("acoustic_confidence_threshold", 0.6):
unified.append(("acoustic", azimuth, conf, level, t))
if not unified:
return threats
# 空间关联分组
groups = self._spatial_group(unified)
for group in groups:
threat = self._build_threat(group, now)
if threat and threat.confidence >= self.params.get("fusion_confidence_threshold", 0.5):
threats.append(threat)
# 保守策略: 单模态高置信度告警
for source, azimuth, conf, level, details in unified:
if conf >= 0.8 and level >= ThreatLevel.WARNING:
already = any(
abs(_angle_diff(t.bearing, azimuth)) < 20
for t in threats
)
if not already:
self._threat_counter += 1
threats.append(FusedThreat(
threat_id="FT-{:04d}".format(self._threat_counter),
level=level,
confidence=conf,
bearing=azimuth,
elevation=0.0,
distance=-1.0,
sources=[source],
description="{} high-confidence alert".format(source),
timestamp=now,
details={source: details},
))
return threats
def _bbox_to_azimuth(self, bbox, image_width, drone_heading):
cx = bbox.get("x", 0) + bbox.get("w", 0) / 2.0
hfov = self.params.get("thermal_hfov", 32.0)
norm = (cx / max(image_width, 1) - 0.5) * hfov
return (drone_heading + norm) % 360
def _sight_to_azimuth(self, sight_x, drone_heading):
return (drone_heading + math.degrees(sight_x)) % 360
def _spatial_group(self, unified, threshold=15.0):
if not unified:
return []
groups = []
assigned = [False] * len(unified)
for i in range(len(unified)):
if assigned[i]:
continue
group = [unified[i]]
assigned[i] = True
for j in range(i + 1, len(unified)):
if assigned[j]:
continue
if unified[i][0] == unified[j][0]:
continue # 同一模态不合并
diff = abs(_angle_diff(unified[i][1], unified[j][1]))
if diff < threshold:
group.append(unified[j])
assigned[j] = True
groups.append(group)
# 未分配的也各自成组
for i in range(len(unified)):
if not assigned[i]:
groups.append([unified[i]])
return groups
def _build_threat(self, group, now):
if not group:
return None
self._threat_counter += 1
sources = list(set(g[0] for g in group))
# 加权置信度
total_w = 0.0
total_wc = 0.0
for src, az, conf, level, det in group:
w = self.WEIGHTS.get(src, 0.3)
total_w += w
total_wc += w * conf
fused_conf = total_wc / max(total_w, 0.01)
# 跨模态奖励
if len(sources) >= 2:
fused_conf = min(1.0, fused_conf + self.CROSS_BOOST_2)
if len(sources) >= 3:
fused_conf = min(1.0, fused_conf + self.CROSS_BOOST_3)
# 方位角: 加权圆均值
bearings_weights = [(g[1], self.WEIGHTS.get(g[0], 0.3) * max(g[2], 0.1)) for g in group]
fused_bearing = _circular_weighted_mean(bearings_weights)
# 距离: 取已知距离中最小的
distances = [g[4].get("distance", -1) for g in group if isinstance(g[4], dict)]
fused_distance = min((d for d in distances if d > 0), default=-1.0)
# 仰角: 取声源的 elevation (如果有)
elevations = [g[4].get("elevation", 0.0) for g in group
if g[0] == "acoustic" and isinstance(g[4], dict)]
fused_elevation = elevations[0] if elevations else 0.0
# 威胁等级: 基于组合规则
fused_level = self._escalate(group)
# 描述
descriptions = []
for src, az, conf, level, det in group:
if src == "thermal" and isinstance(det, dict):
descriptions.append("{}({:.0f}%)".format(det.get("type", "?"), conf * 100))
elif src == "flash":
descriptions.append("Flash({:.0f}px)".format(det.get("area", 0)))
elif src == "acoustic" and isinstance(det, dict):
descriptions.append("{}({:.0f}%)".format(det.get("sound_type", "?"), conf * 100))
desc = " + ".join(descriptions) if descriptions else "Unknown"
return FusedThreat(
threat_id="FT-{:04d}".format(self._threat_counter),
level=fused_level,
confidence=fused_conf,
bearing=fused_bearing,
elevation=fused_elevation,
distance=fused_distance,
sources=sources,
description=desc,
timestamp=now,
details={g[0]: g[4] for g in group if isinstance(g[4], dict)},
)
def _escalate(self, group):
sources_map = {}
for src, az, conf, level, det in group:
sources_map.setdefault(src, []).append((det, conf, level))
has_thermal_type = set()
has_acoustic_type = set()
has_flash = "flash" in sources_map
max_level = ThreatLevel.SAFE
for det, conf, level in sources_map.get("thermal", []):
if isinstance(det, dict):
has_thermal_type.add(det.get("type", ""))
max_level = max(max_level, level)
for det, conf, level in sources_map.get("acoustic", []):
if isinstance(det, dict):
has_acoustic_type.add(det.get("sound_type", ""))
max_level = max(max_level, level)
if has_flash:
max_level = max(max_level, ThreatLevel.CAUTION)
# 跨模态组合升级 (沿用 thermal_types.h Assessment::level() 逻辑)
has_person = "Person" in has_thermal_type
has_barrel = "Barrel Overheat" in has_thermal_type
has_weapon = "Cold Weapon" in has_thermal_type
has_gunshot = "gunshot" in has_acoustic_type
has_explosion = any(t in has_acoustic_type for t in ("artillery", "explosion"))
if has_person and has_barrel:
return ThreatLevel.CRITICAL
if has_person and has_weapon:
return ThreatLevel.CRITICAL
if has_person and has_gunshot:
return ThreatLevel.CRITICAL
if has_barrel and has_gunshot:
return ThreatLevel.CRITICAL
if has_weapon and has_gunshot:
return ThreatLevel.CRITICAL
if has_person and has_flash:
return ThreatLevel.DANGER
if has_gunshot and has_flash:
return ThreatLevel.DANGER
if has_explosion:
return ThreatLevel.DANGER
if has_person:
return ThreatLevel.WARNING
if has_barrel:
return ThreatLevel.DANGER
if has_weapon:
return ThreatLevel.CAUTION
if has_gunshot:
return ThreatLevel.WARNING
return max_level
# ══════════════════════════════════════════════════════════════
# 避障控制器
# ══════════════════════════════════════════════════════════════
class AvoidanceController:
def __init__(self, params):
self.params = params
self._smooth_vx = 0.0
self._smooth_vy = 0.0
self._smooth_vz = 0.0
self._last_avoidance_time = 0.0
self._active = False
@property
def active(self):
return self._active
def compute(self, threats, now, drone_heading=0.0):
if not self.params.get("avoidance_enabled", True):
return None
dangerous = [t for t in threats if t.level >= ThreatLevel.WARNING]
if not dangerous:
# 衰减
if self._active:
self._smooth_vx *= 0.8
self._smooth_vy *= 0.8
self._smooth_vz *= 0.8
if abs(self._smooth_vx) < 0.01 and abs(self._smooth_vy) < 0.01:
self._active = False
return None
return self._make_twist(self._smooth_vx, self._smooth_vy, self._smooth_vz, now)
return None
# 冷却检查
cooldown = self.params.get("avoidance_cooldown", 5.0)
if self._active and (now - self._last_avoidance_time) < cooldown:
# 冷却中,衰减
hold_time = self.params.get("avoidance_hold_time", 2.0)
elapsed = now - self._last_avoidance_time
if elapsed < hold_time:
return self._make_twist(self._smooth_vx, self._smooth_vy, self._smooth_vz, now)
decay = max(0, 1.0 - (elapsed - hold_time) / (cooldown - hold_time))
return self._make_twist(
self._smooth_vx * decay,
self._smooth_vy * decay,
self._smooth_vz * decay,
now,
)
# 计算斥力向量
speed = self.params.get("avoidance_speed", 2.0)
decel_dist = self.params.get("avoidance_decel_distance", 10.0)
vectors = []
for t in dangerous:
vx, vy, vz = self._repulsion(t, speed, decel_dist)
vectors.append((vx, vy, vz, t))
# 合成
cx, cy, cz = self._combine(vectors)
# 平滑
alpha = self.params.get("avoidance_smoothing", 0.3)
self._smooth_vx = alpha * cx + (1 - alpha) * self._smooth_vx
self._smooth_vy = alpha * cy + (1 - alpha) * self._smooth_vy
self._smooth_vz = alpha * cz + (1 - alpha) * self._smooth_vz
self._active = True
self._last_avoidance_time = now
return self._make_twist(self._smooth_vx, self._smooth_vy, self._smooth_vz, now)
def _repulsion(self, threat, speed, decel_dist):
# 方位角 → ENU 反方向
az_rad = math.radians(threat.bearing)
avoid_x = -math.sin(az_rad) # ENU: x=East
avoid_y = -math.cos(az_rad) # ENU: y=North
# 距离缩放
d = threat.distance
if d > 0 and d < decel_dist:
scale = ((decel_dist - d) / decel_dist) ** 2
elif d > 0:
scale = 0.0 # 远处不避障
else:
scale = 1.0 # 未知距离,全力避障
mag = math.sqrt(avoid_x ** 2 + avoid_y ** 2)
if mag > 0:
avoid_x = avoid_x / mag * speed * scale
avoid_y = avoid_y / mag * speed * scale
# 垂直避障
vz = 0.0
if self.params.get("avoidance_vertical_enabled", True) and abs(threat.elevation) > 10:
vz = -math.sin(math.radians(threat.elevation)) * speed * 0.5 * scale
return avoid_x, avoid_y, vz
def _combine(self, vectors):
cx, cy, cz = 0.0, 0.0, 0.0
speed = self.params.get("avoidance_speed", 2.0)
for vx, vy, vz, threat in vectors:
w = 1.0 / max(threat.distance, 1.0) if threat.distance > 0 else 2.0
w *= threat.confidence
cx += vx * w
cy += vy * w
cz += vz * w
mag = math.sqrt(cx ** 2 + cy ** 2 + cz ** 2)
if mag > speed:
f = speed / mag
cx *= f
cy *= f
cz *= f
return cx, cy, cz
def _make_twist(self, vx, vy, vz, now):
t = TwistStamped()
t.header.stamp = rospy.Time.now()
t.header.frame_id = "map"
t.twist.linear = Vector3(vx, vy, vz)
t.twist.angular = Vector3(0, 0, 0)
return t
def reset(self):
self._smooth_vx = 0.0
self._smooth_vy = 0.0
self._smooth_vz = 0.0
self._active = False
# ══════════════════════════════════════════════════════════════
# 工具函数
# ══════════════════════════════════════════════════════════════
def _angle_diff(a, b):
d = (a - b) % 360
if d > 180:
d -= 360
return d
def _circular_weighted_mean(azimuths_weights):
sin_sum = sum(w * math.sin(math.radians(a)) for a, w in azimuths_weights)
cos_sum = sum(w * math.cos(math.radians(a)) for a, w in azimuths_weights)
return math.degrees(math.atan2(sin_sum, cos_sum)) % 360
# ══════════════════════════════════════════════════════════════
# 主 ROS 节点
# ══════════════════════════════════════════════════════════════
class ThreatFusionNode:
def __init__(self):
rospy.init_node("threat_fusion_node", anonymous=False)
# 参数
self.params = self._load_params()
# 状态
self._drone_heading = 0.0
self._current_level = ThreatLevel.SAFE
self._current_threats = []
self._avoidance_active = False
self._modality_status = {"thermal": "DISABLED", "flash": "DISABLED", "acoustic": "DISABLED"}
self._published_ids = set()
# 核心组件
self.cache = ThreatCache(self.params.get("fusion_time_window", 0.5))
self.thermal_bridge = ThermalBridge(
self.params.get("thermal_exe_path", ""),
max_rate=2.0,
)
self._modality_status["thermal"] = "OK" if self.thermal_bridge.enabled else "DISABLED"
self.fusion_engine = FusionEngine(self.cache, self.params)
self.avoidance_ctrl = AvoidanceController(self.params)
# 订阅者
self._setup_subscribers()
# 发布者
self._setup_publishers()
# 服务
self._setup_services()
# 定时器
self._setup_timers()
rospy.loginfo("[ThreatFusion] 节点已启动")
rospy.loginfo("[ThreatFusion] 热成像: %s | 闪光: %s | 声源: %s",
self._modality_status["thermal"],
self._modality_status["flash"],
self._modality_status["acoustic"])
def _load_params(self):
p = {}
p["thermal_exe_path"] = rospy.get_param("~thermal_exe_path", "")
p["thermal_image_topic"] = rospy.get_param("~thermal_image_topic", "/camera/thermal/image_raw")
p["thermal_enabled"] = rospy.get_param("~thermal_enabled", True)
p["flash_enabled"] = rospy.get_param("~flash_enabled", True)
p["acoustic_enabled"] = rospy.get_param("~acoustic_enabled", True)
p["acoustic_confidence_threshold"] = rospy.get_param("~acoustic_confidence_threshold", 0.6)
p["fusion_time_window"] = rospy.get_param("~fusion_time_window", 0.5)
p["fusion_confidence_threshold"] = rospy.get_param("~fusion_confidence_threshold", 0.5)
p["avoidance_enabled"] = rospy.get_param("~avoidance_enabled", True)
p["avoidance_speed"] = rospy.get_param("~avoidance_speed", 2.0)
p["avoidance_decel_distance"] = rospy.get_param("~avoidance_decel_distance", 10.0)
p["avoidance_cooldown"] = rospy.get_param("~avoidance_cooldown", 5.0)
p["avoidance_hold_time"] = rospy.get_param("~avoidance_hold_time", 2.0)
p["avoidance_smoothing"] = rospy.get_param("~avoidance_smoothing", 0.3)
p["avoidance_vertical_enabled"] = rospy.get_param("~avoidance_vertical_enabled", True)
p["uav_namespace"] = rospy.get_param("~uav_namespace", "/uav1")
p["thermal_hfov"] = rospy.get_param("~thermal_hfov", 32.0)
return p
# ── 订阅 ──
def _setup_subscribers(self):
ns = self.params["uav_namespace"]
# 热成像图像
if self.thermal_bridge.enabled:
rospy.Subscriber(
self.params["thermal_image_topic"], Image,
self._thermal_image_cb, queue_size=1,
)
# 闪光检测
if self.params["flash_enabled"]:
rospy.Subscriber("/flash_detector/flash_detected", Bool,
self._flash_detected_cb, queue_size=5)
rospy.Subscriber("/flash_detector/detection", Float32MultiArray,
self._flash_detection_cb, queue_size=5)
self._modality_status["flash"] = "OK"
# 声源检测
if self.params["acoustic_enabled"]:
if HAS_ACOUSTIC_MSG:
rospy.Subscriber("/acoustic/threats", AcousticThreatArray,
self._acoustic_threats_cb, queue_size=5)
self._modality_status["acoustic"] = "OK"
else:
rospy.logwarn("[ThreatFusion] acoustic_analyzer 消息包不可用, 声源模态禁用")
self.params["acoustic_enabled"] = False
# 无人机位姿 (获取航向角)
rospy.Subscriber(ns + "/mavros/local_position/pose", PoseStamped,
self._pose_cb, queue_size=5)
def _thermal_image_cb(self, msg):
self.thermal_bridge.process_image(msg, self._on_thermal_result)
def _on_thermal_result(self, result):
now = time.time()
self.cache.add_thermal(result, now)
def _flash_detected_cb(self, msg):
pass # 状态由 detection 回调处理
def _flash_detection_cb(self, msg):
data = msg.data
if len(data) >= 5:
now = time.time()
self.cache.add_flash(data[0], data[1], data[2], data[3], data[4], now)
def _acoustic_threats_cb(self, msg):
now = time.time()
threats = []
for t in msg.threats:
threats.append({
"threat_id": t.threat_id,
"sound_type": t.sound_type,
"confidence": t.confidence,
"azimuth": t.azimuth,
"elevation": t.elevation,
"distance": t.distance,
"distance_confidence": t.distance_confidence,
})
self.cache.add_acoustic(threats, now)
def _pose_cb(self, msg):
q = msg.pose.orientation
# 四元数 → 偏航角 (ENU)
siny_cosp = 2.0 * (q.w * q.z + q.x * q.y)
cosy_cosp = 1.0 - 2.0 * (q.y * q.y + q.z * q.z)
self._drone_heading = math.degrees(math.atan2(siny_cosp, cosy_cosp)) % 360
# ── 发布 ──
def _setup_publishers(self):
self._status_pub = rospy.Publisher("/threat_fusion/status", String, queue_size=5)
self._threat_pub = rospy.Publisher("/threat_fusion/fused_threats", String, queue_size=10)
self._avoid_pub = rospy.Publisher("/threat_fusion/avoidance_cmd", TwistStamped, queue_size=5)
self._diag_pub = rospy.Publisher("/threat_fusion/diagnostics", DiagnosticArray, queue_size=5)
ns = self.params["uav_namespace"]
self._mavros_vel_pub = rospy.Publisher(
ns + "/mavros/setpoint_velocity/cmd_vel", TwistStamped, queue_size=5,
)
# ── 服务 ──
def _setup_services(self):
rospy.Service("/threat_fusion/reset", std_msgs.srv.Trigger, self._reset_cb)
def _reset_cb(self, req):
self.cache.clear()
self.avoidance_ctrl.reset()
self._published_ids.clear()
self._current_level = ThreatLevel.SAFE
self._current_threats = []
return std_msgs.srv.TriggerResponse(success=True, message="Fusion state reset")
# ── 定时器 ──
def _setup_timers(self):
# 10Hz 融合
rospy.Timer(rospy.Duration(0.1), self._fusion_timer_cb)
# 2Hz 状态
rospy.Timer(rospy.Duration(0.5), self._status_timer_cb)
# 1Hz 诊断
rospy.Timer(rospy.Duration(1.0), self._diag_timer_cb)
def _fusion_timer_cb(self, event):
now = time.time()
threats = self.fusion_engine.fuse(now, self._drone_heading)
self._current_threats = threats
self._current_level = max((t.level for t in threats), default=ThreatLevel.SAFE)
# 发布新威胁事件
for t in threats:
if t.threat_id not in self._published_ids:
self._publish_fused_threat(t)
self._published_ids.add(t.threat_id)
# 清理旧 ID (保留最近 100 个)
if len(self._published_ids) > 100:
self._published_ids = set(list(self._published_ids)[-50:])
# 避障
avoidance_cmd = self.avoidance_ctrl.compute(threats, now, self._drone_heading)
self._avoidance_active = avoidance_cmd is not None
if avoidance_cmd:
self._avoid_pub.publish(avoidance_cmd)
self._mavros_vel_pub.publish(avoidance_cmd)
def _status_timer_cb(self, event):
status = {
"threat_level": self._current_level.label,
"threat_count": len(self._current_threats),
"avoidance_active": self._avoidance_active,
"drone_heading": round(self._drone_heading, 1),
"modalities": dict(self._modality_status),
"timestamp": time.time(),
}
self._status_pub.publish(String(json.dumps(status, ensure_ascii=False)))
def _diag_timer_cb(self, event):
diag = DiagnosticArray()
diag.header.stamp = rospy.Time.now()
ds = DiagnosticStatus()
ds.name = "threat_fusion"
ds.level = DiagnosticStatus.OK if self._current_level < ThreatLevel.DANGER else DiagnosticStatus.WARN
ds.message = "Level: {}, Threats: {}".format(self._current_level.label, len(self._current_threats))
ds.values = [
KeyValue("thermal", self._modality_status["thermal"]),
KeyValue("flash", self._modality_status["flash"]),
KeyValue("acoustic", self._modality_status["acoustic"]),
KeyValue("avoidance_active", str(self._avoidance_active)),
]
diag.status.append(ds)
self._diag_pub.publish(diag)
# ── 发布辅助 ──
def _publish_fused_threat(self, threat):
data = {
"id": threat.threat_id,
"level": threat.level.label,
"confidence": round(threat.confidence, 3),
"bearing": round(threat.bearing, 1),
"elevation": round(threat.elevation, 1),
"distance": round(threat.distance, 1),
"sources": threat.sources,
"description": threat.description,
"timestamp": threat.timestamp,
}
self._threat_pub.publish(String(json.dumps(data, ensure_ascii=False)))
def run(self):
rospy.spin()
self.thermal_bridge.shutdown()
# ══════════════════════════════════════════════════════════════
# 入口
# ══════════════════════════════════════════════════════════════
if __name__ == "__main__":
try:
node = ThreatFusionNode()
node.run()
except rospy.ROSInterruptException:
pass

@ -0,0 +1,331 @@
# 热成像威胁检测算法
面向城市巷战无人机场景,基于温度频段分解的多类型威胁实时检测算法。
C++ 实现,用于无人机机载部署。
---
## 检测能力
输入一张红外热成像图片,输出检测到的威胁目标和整体威胁等级。
| 威胁类型 | 检测原理 | 对应场景 |
|----------|----------|----------|
| **Person** (人员) | 体温频段 30-42°C + 形状筛选 | 敌方步兵 |
| **Barrel Overheat** (枪管过热) | 热频段 >55°C + 细长形状 + 靠近人员 | 连续射击后枪管热辐射 |
| **Flash Residue** (闪光残留) | 小面积圆形 + 极高温 >90°C + 靠近人员 | 枪口火焰热残留 |
| **Cold Weapon** (冷武器) | 人员区域内 Canny 边缘 + 细长 + 宽度恒定 | 金属武器 |
| **Hotspot** (异常热点) | 高温区域 >80°C + 温差/面积/置信度过滤 | 爆炸残留、火灾 |
**威胁等级评估:**
```
SAFE → CAUTION → WARNING → DANGER → CRITICAL → SUSPECTED_FIRE
人员 + 枪管/冷武器 → CRITICAL武装人员
人员 + 多处闪光 → SUSPECTED_FIRE疑似交火
仅人员 → WARNING
仅枪管/冷武器 → DANGER / CAUTION
仅热点 → CAUTION
无检测 → SAFE
```
---
## 文件结构
```
热成像识别/
├── cpp/ C++ 实现
│ ├── CMakeLists.txt 构建配置
│ ├── include/
│ │ ├── thermal_types.h 类型定义(威胁类型、等级、配置参数)
│ │ ├── thermal_preprocessor.h 预处理模块接口
│ │ └── thermal_detector.h 检测模块接口
│ ├── src/
│ │ ├── thermal_preprocessor.cpp 预处理实现
│ │ ├── thermal_detector.cpp 检测实现
│ │ └── main.cpp 命令行入口
│ └── thermal_detector.exe 编译产物Windows x64
├── README.md 本文档
└── test/
└── test_images/ 12 张测试热成像图片
```
---
## 算法原理
### 整体流程
```
输入热成像图片
[预处理] 灰度自动转彩色 → 色板检测 → 温度图提取 → 温度频段分解
[Pass 1] 人员检测 ──── 体温段(G通道) 阈值分割 → 形态学 → 连通域 → 形状+温度评分
[Pass 2] 热威胁检测 ── 热频段(R通道) 阈值分割 → 连通域 → 分类为 枪管/闪光/热点
[Pass 3] 冷武器检测 ── 人员区域内 Canny边缘 → 细长形状 → 宽度一致性分析
[NMS] 非极大值抑制(按类型分组去重)
[评估] 综合威胁等级 → 输出结果
```
### 步骤 1: 预处理(最关键)
预处理将各种格式的热成像图片统一转换为温度图和频段图,是整个算法的基础。
**1.1 灰度输入自动转彩色**
当输入为黑白/灰度热成像(白热或黑热模式)时,预处理器自动将其转换为 JET 彩色热图再处理,无需手动干预。灰度图 → CLAHE 对比度增强 → JET 色板映射 → 彩色图。
**1.2 色板自动检测**
热成像传感器输出格式各异,算法自动识别输入格式:
| 格式 | 判断方法 | 温度提取方式 |
|------|----------|-------------|
| 白热 (whitehot) | 灰度图,边缘暗于中心 | 像素值线性映射T = tmin + (pixel/255) × (tmax-tmin) |
| 黑热 (blackhot) | 灰度图,边缘亮于中心 | 反转后线性映射T = tmin + ((255-pixel)/255) × (tmax-tmin) |
| JET 彩虹 | 蓝+红通道同时显著 | 通过逆查找表从伪彩色反推灰度索引 |
| Ironbow | 红橙为主、极少纯蓝 | 逆查找表恢复 |
| 通用 RGB 热图 | 红色通道显著 | 加权组合T = R×0.50 + G×0.30 + (1-B)×0.20,直方图拉伸 |
| 灰度 | 兜底 | 自动转彩色后按 JET 处理 |
**1.3 温度频段分解**
将温度图分解为三个独立频段(对应 BGR 三通道):
```
R 通道(热频段): T > 55°C → 线性映射到 0-255
G 通道(体温段): 30-42°C → 高斯核突出 (中心 36°C, σ=4°C)
B 通道(环境段): T < 20°C 线 0-255
```
体温段使用高斯核 `exp(-((T-36)/4)²)` 而非硬阈值,使体温附近像素获得高权重,远离体温的像素迅速衰减。
环境温度通过图像边缘 10% 区域的中位数估计。
### 步骤 2: 人员检测
在体温段G 通道)上操作:
1. **阈值分割**: G 通道 > 40 的像素标记为候选
2. **形态学处理**: 开运算去噪 + 闭运算填充,核大小根据图像分辨率自适应(>500px 用 5×5否则 3×3
3. **连通域分析**: 提取所有连通域,过滤条件:
- 面积400 ~ 图像面积×15%
- 长宽比:≥ 1.3(人竖直站立)
- 方向:高度 ≥ 宽度
- 温度:最高温 ≥ 30°C平均温 ≤ 47°C
4. **综合评分** (加权求和):
```
confidence = aspect_ratio × 0.15
+ solidity × 0.15 (凸包面积比,人体较密实)
+ fill × 0.10 (bbox填充率)
+ temp_score × 0.20 (体温合理性 + 温度均匀性)
+ size × 0.15 (面积得分)
+ band_coverage × 0.25 (体温段像素占比)
```
最多保留 8 个人员(按置信度排序)。
### 步骤 3: 热威胁检测
在热频段R 通道)上操作:
1. **阈值分割**: R 通道 > 80比人员检测更严格减少噪声
2. **形态学处理**: 5×5 椭圆核开闭运算
3. **连通域分析**: 面积 ≥ 80px 的连通域进入分类
**分类逻辑**(按优先级):
- **闪光残留**: 面积 < 400px 圆度 0.5 最高温 90°C 靠近人员
- **枪管过热**: 长宽比 2.5-12 且 最高温 ≥ 55°C 且 靠近人员
- **热点**: 最高温 ≥ 80°C 且 最高温 ≥ 环境温度+40°C 且 面积 80-5000px
"靠近人员"定义为:连通域中心到最近人员中心的距离 < 人员尺寸的指定倍数。
热点按置信度排序,最多保留 20 个。
### 步骤 4: 冷武器检测
在每个检测到的人员 ROI扩展 30%)内操作:
1. **边缘检测**: Canny(edge=30, threshold=100)
2. **方向膨胀**: 分别用 5×1 和 1×5 矩形核膨胀,检测水平和垂直细长形状
3. **连通域筛选**:
- 长宽比 2.0-10.0
- 最短长度 ≥ 15px
- 短边 < 人员最短边的 15%(比手臂更细)
4. **宽度一致性分析**(核心判据):
沿长轴方向将连通域切成 N 片,统计每片宽度,计算变异系数 CV = 标准差/均值。
```
CV < 0.20 1.0 ()
CV < 0.35 0.7
CV < 0.50 0.3
CV ≥ 0.50 → 0.0 (宽度变化大,非刚性如手臂/布料)
```
5. **温度过滤**: 平均温度 < 38°C(排除体温区域)
6. **位置过滤**: 必须与人员 bbox 有 ≥ 5% 的重叠
### 步骤 5: NMS 和输出
按威胁类型分组每组内按置信度降序排列IoU > 0.35 的低置信度框被抑制。
---
## 关键参数
所有参数在 `thermal_types.h``DetectorConfig` 结构体中集中定义,可根据场景调整。
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `person_min_area` | 400 | 人员最小面积 (px) |
| `person_ar_min` | 1.3 | 人员最小长宽比 |
| `person_temp_min/max` | 30 / 42 | 人员温度范围 (°C) |
| `max_persons` | 8 | 最大人数 |
| `barrel_ar_min/max` | 2.5 / 12.0 | 枪管长宽比范围 |
| `barrel_temp_min` | 55 | 枪管温度下限 (°C) |
| `barrel_proximity_ratio` | 2.0 | 枪管与人员最大距离(倍数于人员尺寸) |
| `flash_area_max` | 400 | 闪光最大面积 (px) |
| `flash_temp_min` | 90 | 闪光温度下限 (°C) |
| `hotspot_absolute_min_temp` | 80 | 热点绝对温度下限 (°C) |
| `hotspot_temp_offset` | 40 | 热点需超过环境温度的偏移 (°C) |
| `hotspot_min_area` | 80 | 热点最小面积 (px) |
| `hotspot_max_count` | 20 | 最多保留热点数 |
| `cold_weapon_ar_min/max` | 2.0 / 10.0 | 冷武器长宽比范围 |
| `cold_weapon_width_cv` | 0.35 | 冷武器宽度变异系数阈值 |
| `confidence_threshold` | 0.25 | 通用置信度下限 |
| `nms_iou_threshold` | 0.35 | NMS IoU 阈值 |
---
## 编译
依赖OpenCV ≥ 4.5(需包含 core, imgproc, imgcodecs, highguiCMake ≥ 3.16C++17 编译器。
```bash
cd cpp
mkdir build && cd build
# 方式一:用 vcpkg 安装的 OpenCV
cmake .. -DCMAKE_TOOLCHAIN_FILE=<vcpkg>/scripts/buildsystems/vcpkg.cmake
# 方式二:用预编译 OpenCV
cmake .. -DOpenCV_DIR=<opencv>/build/x64/vc16/lib
# 方式三:用 conda 安装的 OpenCV
cmake .. -DCMAKE_PREFIX_PATH=<conda_env>/Library
cmake --build . --config Release
```
---
## 运行
```bash
# 分析单张图片
thermal_detector.exe image.jpg
# 分析并输出 JSON供其他程序调用
thermal_detector.exe image.jpg --json
# 不弹窗,只保存结果图
thermal_detector.exe image.jpg --no-show
# 查看帮助
thermal_detector.exe --help
```
**输出示例:**
```
========================================
Image: 20260510170127_1.jpg
========================================
Time: 427 ms
Ambient: 24 C
Level: [Critical] 37 detection(s)
Person x3
Barrel Overheat x11
Cold Weapon x9
Flash Residue x1
Hotspot x13
[Hotspot] conf:93% temp:132C area:288px
[Person] conf:87% temp:37C area:2667px
...
========================================
Saved: result_20260510170127_1.jpg
```
---
## 作为库调用
C++ 检测器可以编译为库供其他代码调用,只需包含两个头文件:
```cpp
#include "thermal_preprocessor.h"
#include "thermal_detector.h"
// 初始化(只需一次)
ThermalPreprocessor preprocessor(-20.0, 150.0); // 温度范围
ThermalDetector detector; // 使用默认参数
// 检测(灰度图自动转彩色,无需预处理)
cv::Mat image = cv::imread("thermal.jpg");
auto preprocessed = preprocessor.preprocess(image);
Assessment assessment = detector.detect(preprocessed);
// 获取结果
if (assessment.is_dangerous()) {
ThreatLevel level = assessment.level();
for (const auto& person : assessment.persons) {
// person.bbox, person.confidence, person.max_temp ...
}
}
// 可视化
cv::Mat vis = ThermalDetector::draw_detections(image, assessment);
cv::imwrite("result.jpg", vis);
```
### 灰度转彩色(手动调用)
```cpp
// 手动将灰度图转为 JET 彩色
cv::Mat colorized = preprocessor.colorize(gray_image, "jet", ColormapType::WHITEHOT);
```
预处理默认开启 `auto_colorize=true`,黑白热成像会自动转彩色后再检测。
---
## 移植到其他语言的要点
算法核心只使用了 OpenCV 的基础操作,不依赖任何框架特有的 API。移植时需关注
1. **温度频段分解**: 纯数学运算(线性映射 + 高斯函数 + 阈值),任何语言都能实现
2. **连通域分析**: OpenCV 的 `connectedComponentsWithStats` 在所有语言绑定中都有
3. **形状特征**: 圆度 = 4π×面积/周长²,实心度 = 面积/凸包面积,是通用几何公式
4. **NMS**: 标准 IoU 计算和贪心抑制,约 20 行代码
5. **宽度一致性**: 沿长轴切片统计宽度,计算 CV 值,不依赖任何库
唯一需要注意的:色板自动检测部分有较多启发式规则(判断灰度图边缘/中心的亮度关系等),需要根据实际传感器输出调整判断条件。

@ -0,0 +1,475 @@
"""
热成像检测参数自动优化 基于标注数据调优 C++ 检测器参数
通过调用 thermal_detector.exe (--json 模式) 运行检测
将结果与手动标注的 ground truth 比对搜索最优参数
由于 C++ 参数在头文件中是编译时常量本工具的优化策略是
1. 运行默认参数检测计算 baseline F1
2. 生成候选参数值逐个写入临时配置文件
3. 输出最优参数供用户手动更新到 thermal_types.h
用法:
python auto_tune.py # 使用 labels.json + test/test_images/
python auto_tune.py --label-file my_labels.json # 指定标注文件
python auto_tune.py --image-dir path/to/images # 指定图片目录
python auto_tune.py --metric precision # 优化目标改为精确率
python auto_tune.py --export best_params.json # 导出最优参数
"""
import cv2
import numpy as np
import json
import os
import sys
import glob
import subprocess
import re
import copy
# 标注类型 → 检测器输出类型映射
LABEL_TO_DETECT = {
'Person': 'Person',
'Barrel_Overheat': 'Barrel Overheat',
'Cold_Weapon': 'Cold Weapon',
'Flash_Residue': 'Flash Residue',
'Hotspot': 'Hotspot',
}
def load_labels(label_path):
with open(label_path, 'r', encoding='utf-8') as f:
return json.load(f)
def iou(box_a, box_b):
"""计算两个 bbox 的 IoU。box = [x, y, w, h]"""
ax1, ay1 = box_a[0], box_a[1]
ax2, ay2 = ax1 + box_a[2], ay1 + box_a[3]
bx1, by1 = box_b[0], box_b[1]
bx2, by2 = bx1 + box_b[2], by1 + box_b[3]
ix1 = max(ax1, bx1)
iy1 = max(ay1, by1)
ix2 = min(ax2, bx2)
iy2 = min(ay2, by2)
inter = max(0, ix2 - ix1) * max(0, iy2 - iy1)
area_a = box_a[2] * box_a[3]
area_b = box_b[2] * box_b[3]
union = area_a + area_b - inter
return inter / max(union, 1)
def match_detections(gt_labels, detections, iou_threshold=0.1):
"""匹配 ground truth 和检测结果,返回 TP, FP, FN
使用混合匹配策略先尝试 IoU IoU < threshold 则用中心点距离匹配
"""
gt_by_type = {}
for lb in gt_labels:
t = LABEL_TO_DETECT.get(lb['type'], lb['type'])
gt_by_type.setdefault(t, []).append(lb)
det_by_type = {}
for d in detections:
t = d.get('type', '')
det_by_type.setdefault(t, []).append(d)
tp, fp, fn = 0, 0, 0
all_types = set(list(gt_by_type.keys()) + list(det_by_type.keys()))
for t in all_types:
gts = gt_by_type.get(t, [])
dets = det_by_type.get(t, [])
matched_gt = set()
matched_det = set()
pairs = []
for gi, g in enumerate(gts):
gx = g['bbox'][0] + g['bbox'][2] / 2
gy = g['bbox'][1] + g['bbox'][3] / 2
for di, d in enumerate(dets):
db = d.get('bbox', {})
dbox = [db.get('x', 0), db.get('y', 0), db.get('w', 0), db.get('h', 0)]
dx = dbox[0] + dbox[2] / 2
dy = dbox[1] + dbox[3] / 2
# IoU 匹配
iou_score = iou(g['bbox'], dbox)
# 中心点距离匹配(当 IoU 低时)
gt_size = max(g['bbox'][2], g['bbox'][3])
det_size = max(dbox[2], dbox[3])
max_size = max(gt_size, det_size, 1)
dist = ((gx - dx) ** 2 + (gy - dy) ** 2) ** 0.5
dist_ratio = dist / max_size
# 综合分数IoU 优先,中心点距离兜底
if iou_score >= iou_threshold:
score = iou_score
elif dist_ratio < 1.5:
score = iou_threshold * 0.5 # 给一个较低的匹配分数
else:
continue
pairs.append((score, gi, di))
pairs.sort(reverse=True)
for score, gi, di in pairs:
if gi not in matched_gt and di not in matched_det:
matched_gt.add(gi)
matched_det.add(di)
tp += len(matched_gt)
fp += len(dets) - len(matched_det)
fn += len(gts) - len(matched_gt)
return tp, fp, fn
def _get_env_with_opencv():
"""构建包含 OpenCV DLL 路径的环境变量"""
import copy
env = copy.deepcopy(os.environ)
# 常见 OpenCV 安装位置
opencv_paths = [
os.path.join(os.path.expanduser('~'), '.conda', 'envs', 'opencv-build', 'Library', 'bin'),
os.path.join(os.path.expanduser('~'), 'miniconda3', 'envs', 'opencv-build', 'Library', 'bin'),
os.path.join(os.path.expanduser('~'), 'anaconda3', 'envs', 'opencv-build', 'Library', 'bin'),
os.path.join(os.path.expanduser('~'), 'opencv', 'build', 'x64', 'vc16', 'bin'),
os.path.join(os.path.expanduser('~'), 'opencv', 'build', 'x64', 'vc17', 'bin'),
]
extra = ';'.join(p for p in opencv_paths if os.path.isdir(p))
if extra:
env['PATH'] = extra + ';' + env.get('PATH', '')
return env
def run_detector(exe_path, image_path):
"""调用 C++ 检测器,返回 JSON 结果"""
try:
env = _get_env_with_opencv()
result = subprocess.run(
[exe_path, image_path, '--json', '--no-show'],
capture_output=True, text=True, timeout=30,
encoding='utf-8', errors='replace',
env=env,
)
output = result.stdout.strip()
# 找到 JSON 块
start = output.find('{')
end = output.rfind('}') + 1
if start >= 0 and end > start:
json_str = output[start:end]
# 移除 file 字段(中文路径含反斜杠会导致 JSON 解析失败)
import re
json_str = re.sub(r'"file"\s*:\s*"[^"]*"\s*,?', '', json_str)
# 修复尾部逗号
json_str = re.sub(r',\s*}', '}', json_str)
json_str = re.sub(r',\s*]', ']', json_str)
return json.loads(json_str)
except Exception as e:
print(f" 检测器运行失败: {e}")
return None
def evaluate_default(exe_path, image_paths, all_labels):
"""用默认参数评估所有图片"""
total_tp, total_fp, total_fn = 0, 0, 0
for path in image_paths:
fname = os.path.basename(path)
if fname not in all_labels:
continue
result = run_detector(exe_path, path)
if result is None:
continue
detections = result.get('detections', [])
tp, fp, fn = match_detections(all_labels[fname], detections)
total_tp += tp
total_fp += fp
total_fn += fn
precision = total_tp / max(total_tp + total_fp, 1)
recall = total_tp / max(total_tp + total_fn, 1)
f1 = 2 * precision * recall / max(precision + recall, 1e-8)
return {
'f1': f1, 'precision': precision, 'recall': recall,
'tp': total_tp, 'fp': total_fp, 'fn': total_fn,
}
def evaluate_with_filter(exe_path, image_paths, all_labels, filters):
"""用默认参数运行检测器,但对结果做后处理过滤来模拟参数变化
可以模拟的参数
- confidence_threshold: 过滤低置信度检测
- hotspot_max_count: 限制热点数量
- 按类型过滤面积范围
"""
total_tp, total_fp, total_fn = 0, 0, 0
conf_thresh = filters.get('confidence_threshold', 0.0)
hotspot_max = filters.get('hotspot_max_count', 999)
person_min_area = filters.get('person_min_area', 0)
for path in image_paths:
fname = os.path.basename(path)
if fname not in all_labels:
continue
result = run_detector(exe_path, path)
if result is None:
continue
detections = result.get('detections', [])
# 后处理过滤
filtered = []
hotspot_count = 0
for d in detections:
# 置信度过滤
if d.get('confidence', 1.0) < conf_thresh:
continue
# 面积过滤 (Person)
bbox = d.get('bbox', {})
area = bbox.get('w', 0) * bbox.get('h', 0)
if d.get('type') == 'Person' and area < person_min_area:
continue
# 热点数量限制
if d.get('type') == 'Hotspot':
hotspot_count += 1
if hotspot_count > hotspot_max:
continue
filtered.append(d)
tp, fp, fn = match_detections(all_labels[fname], filtered)
total_tp += tp
total_fp += fp
total_fn += fn
precision = total_tp / max(total_tp + total_fp, 1)
recall = total_tp / max(total_tp + total_fn, 1)
f1 = 2 * precision * recall / max(precision + recall, 1e-8)
return {
'f1': f1, 'precision': precision, 'recall': recall,
'tp': total_tp, 'fp': total_fp, 'fn': total_fn,
}
def search_best_params(exe_path, image_paths, all_labels, metric='f1'):
"""搜索最优参数组合"""
print(f"\n{'='*60}")
print(f"参数优化 — 调用 C++ 检测器")
print(f"目标: {metric}")
print(f"标注图片: {len(all_labels)} 张, 标注数: {sum(len(v) for v in all_labels.values())}")
print(f"检测器: {exe_path}")
print(f"{'='*60}\n")
# 基准评估
print("基准参数评估...")
baseline = evaluate_default(exe_path, image_paths, all_labels)
print(f" 基准: F1={baseline['f1']:.3f} P={baseline['precision']:.3f} R={baseline['recall']:.3f}")
print(f" TP={baseline['tp']} FP={baseline['fp']} FN={baseline['fn']}\n")
# 可搜索参数 (通过后处理模拟)
search_grid = {
'confidence_threshold': [0.10, 0.20, 0.25, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80],
'hotspot_max_count': [3, 5, 8, 10, 15, 20],
'person_min_area': [100, 200, 300, 400, 500, 600, 800],
}
best_params = {}
best_score = baseline[metric]
improved = True
iteration = 0
while improved:
improved = False
iteration += 1
print(f"--- 第 {iteration} 轮搜索 ---")
for param_name, values in search_grid.items():
current_val = best_params.get(param_name, values[len(values)//2])
for val in values:
test_params = dict(best_params)
test_params[param_name] = val
result = evaluate_with_filter(
exe_path, image_paths, all_labels, test_params
)
score = result[metric]
if score > best_score + 0.001:
old_val = best_params.get(param_name, '?')
best_params[param_name] = val
best_score = score
improved = True
print(f" {param_name}: {old_val} -> {val} "
f"{metric}={score:.3f} "
f"(P={result['precision']:.3f} R={result['recall']:.3f} "
f"TP={result['tp']} FP={result['fp']} FN={result['fn']})")
if not improved:
print(" 未找到更优参数,搜索结束")
# 最终结果
print(f"\n{'='*60}")
print(f"优化结果 — {metric}={best_score:.3f}")
print(f"{'='*60}")
if best_params:
print("\n需要修改的参数 (在 cpp/include/thermal_types.h 中):")
param_map = {
'confidence_threshold': ('confidence_threshold', '通用置信度下限'),
'hotspot_max_count': ('hotspot_max_count', '最多保留热点数'),
'person_min_area': ('person_min_area', '人员最小面积'),
}
for k, v in best_params.items():
info = param_map.get(k, (k, ''))
cxx_name = info[0]
desc = info[1]
print(f" {cxx_name} = {v} // {desc}")
if cxx_name == 'confidence_threshold':
print(f" -> 在 thermal_detector.cpp 的 detect() 中修改阈值判断")
elif cxx_name == 'person_min_area':
print(f" -> 在 DetectorConfig::person_min_area 中修改")
elif cxx_name == 'hotspot_max_count':
print(f" -> 在 DetectorConfig::hotspot_max_count 中修改")
else:
print("\n默认参数已经是最优的,无需修改。")
final = evaluate_with_filter(exe_path, image_paths, all_labels, best_params) if best_params else baseline
print(f"\n最终指标: F1={final['f1']:.3f} P={final['precision']:.3f} R={final['recall']:.3f}")
print(f" TP={final['tp']} FP={final['fp']} FN={final['fn']}")
# 对比
if best_params:
print(f"\n对比:")
print(f" 优化前: F1={baseline['f1']:.3f} TP={baseline['tp']} FP={baseline['fp']} FN={baseline['fn']}")
print(f" 优化后: F1={final['f1']:.3f} TP={final['tp']} FP={final['fp']} FN={final['fn']}")
return best_params, final
def export_params(params, metrics, output_path):
data = {
'params': params,
'metrics': metrics,
'note': '由 auto_tune.py 自动优化生成,需手动更新到 cpp/include/thermal_types.h',
}
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"\n参数已导出: {output_path}")
def find_exe():
"""查找 thermal_detector.exe"""
script_dir = os.path.dirname(os.path.abspath(__file__))
# 同级 cpp 目录
exe = os.path.join(script_dir, 'cpp', 'thermal_detector.exe')
if os.path.isfile(exe):
return exe
# build 目录
exe = os.path.join(script_dir, 'cpp', 'build', 'Release', 'thermal_detector.exe')
if os.path.isfile(exe):
return exe
return None
def main():
script_dir = os.path.dirname(os.path.abspath(__file__))
args = sys.argv[1:]
label_file = None
image_dir = os.path.join(script_dir, 'test', 'test_images')
metric = 'f1'
export_path = None
exe_path = None
i = 0
while i < len(args):
if args[i] == '--label-file' and i + 1 < len(args):
label_file = args[i + 1]
i += 2
elif args[i] == '--image-dir' and i + 1 < len(args):
image_dir = args[i + 1]
i += 2
elif args[i] == '--metric' and i + 1 < len(args):
metric = args[i + 1]
i += 2
elif args[i] == '--export' and i + 1 < len(args):
export_path = args[i + 1]
i += 2
elif args[i] == '--exe' and i + 1 < len(args):
exe_path = args[i + 1]
i += 2
else:
i += 1
# 检测器
if exe_path is None:
exe_path = find_exe()
if exe_path is None:
print("找不到 thermal_detector.exe")
print("用法: python auto_tune.py --exe path/to/thermal_detector.exe")
return
print(f"检测器: {exe_path}")
# 标注
if label_file is None:
label_file = os.path.join(script_dir, 'test', 'labels.json')
if not os.path.exists(label_file):
label_file_alt = os.path.join(script_dir, 'labels.json')
if os.path.exists(label_file_alt):
label_file = label_file_alt
else:
print(f"标注文件不存在: {label_file}")
print("请先运行 label_tool.py 创建标注:")
print(" python label_tool.py")
return
all_labels = load_labels(label_file)
# 过滤掉 result_ 开头的图片(不对已标注的输出图做评估)
all_labels = {k: v for k, v in all_labels.items() if not os.path.basename(k).startswith('result_')}
print(f"标注文件: {label_file}")
print(f"标注图片数: {len(all_labels)} (已过滤 result_ 图像)")
if not all_labels:
print("标注为空,请先标注图片")
return
# 图片
image_paths = []
for ext in ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tif']:
image_paths.extend(glob.glob(os.path.join(image_dir, ext)))
image_paths.sort()
labeled_images = [p for p in image_paths if os.path.basename(p) in all_labels]
print(f"图片目录: {image_dir}")
print(f"有标注的图片: {len(labeled_images)} / {len(image_paths)}")
if not labeled_images:
print("没有匹配到有标注的图片")
return
# 搜索
best_params, metrics = search_best_params(exe_path, labeled_images, all_labels, metric)
# 导出
if export_path:
export_params(best_params, metrics, export_path)
else:
default_export = os.path.join(script_dir, 'best_params.json')
export_params(best_params, metrics, default_export)
if __name__ == '__main__':
main()

@ -0,0 +1,14 @@
{
"params": {
"confidence_threshold": 0.5
},
"metrics": {
"f1": 0.13793103448275862,
"precision": 0.09900990099009901,
"recall": 0.22727272727272727,
"tp": 10,
"fp": 91,
"fn": 34
},
"note": "由 auto_tune.py 自动优化生成,需手动更新到 cpp/include/thermal_types.h"
}

@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.16)
project(thermal_detector LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs highgui videoio)
add_executable(thermal_detector
src/main.cpp
src/thermal_preprocessor.cpp
src/thermal_detector.cpp
)
target_include_directories(thermal_detector PRIVATE
${CMAKE_SOURCE_DIR}/include
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(thermal_detector PRIVATE
${OpenCV_LIBS}
)
target_compile_options(thermal_detector PRIVATE /utf-8 /EHsc)
# Windows: 便
set_target_properties(thermal_detector PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}"
)

File diff suppressed because one or more lines are too long

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<CustomBuild Include="D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\热成像识别\cpp\CMakeLists.txt" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
</Project>

@ -0,0 +1,314 @@
# This is the CMakeCache file.
# For build in directory: d:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/热成像识别/cpp/build
# It was generated by CMake: C:/Users/29578/.conda/envs/opencv-build/Library/bin/cmake.exe
# You can edit this file to change values found and used by cmake.
# If you do not want to change any of the values, simply exit the editor.
# If you do want to change a value, simply edit, save, and exit the editor.
# The syntax for the file is as follows:
# KEY:TYPE=VALUE
# KEY is the name of a variable in the cache.
# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
# VALUE is the current value for the KEY.
########################
# EXTERNAL cache entries
########################
//Path to a program.
CMAKE_AR:FILEPATH=D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/lib.exe
//Semicolon separated list of supported configuration types, only
// supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything
// else will be ignored.
CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo
//Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=/DWIN32 /D_WINDOWS /GR /EHsc
//Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=/Zi /Ob0 /Od /RTC1
//Flags used by the CXX compiler during MINSIZEREL builds.
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=/O1 /Ob1 /DNDEBUG
//Flags used by the CXX compiler during RELEASE builds.
CMAKE_CXX_FLAGS_RELEASE:STRING=/O2 /Ob2 /DNDEBUG
//Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=/Zi /O2 /Ob1 /DNDEBUG
//Libraries linked by default with all C++ applications.
CMAKE_CXX_STANDARD_LIBRARIES:STRING=kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
//Flags used by the linker during all build types.
CMAKE_EXE_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the linker during DEBUG builds.
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
//Flags used by the linker during MINSIZEREL builds.
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
//Flags used by the linker during RELEASE builds.
CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
//Flags used by the linker during RELWITHDEBINFO builds.
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
//Value Computed by CMake.
CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/热成像识别/cpp/build/CMakeFiles/pkgRedirects
//Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/thermal_detector
//Path to a program.
CMAKE_LINKER:FILEPATH=D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/link.exe
//Flags used by the linker during the creation of modules during
// all build types.
CMAKE_MODULE_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the linker during the creation of modules during
// DEBUG builds.
CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
//Flags used by the linker during the creation of modules during
// MINSIZEREL builds.
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of modules during
// RELEASE builds.
CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of modules during
// RELWITHDEBINFO builds.
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
//Path to a program.
CMAKE_MT:FILEPATH=CMAKE_MT-NOTFOUND
//No help, variable specified on the command line.
CMAKE_PREFIX_PATH:UNINITIALIZED=C:/Users/29578/.conda/envs/opencv-build/Library
//Value Computed by CMake
CMAKE_PROJECT_COMPAT_VERSION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_DESCRIPTION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_HOMEPAGE_URL:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_NAME:STATIC=thermal_detector
//Value Computed by CMake
CMAKE_PROJECT_SPDX_LICENSE:STATIC=
//RC compiler
CMAKE_RC_COMPILER:FILEPATH=rc
//Flags for Windows Resource Compiler during all build types.
CMAKE_RC_FLAGS:STRING=-DWIN32
//Flags for Windows Resource Compiler during DEBUG builds.
CMAKE_RC_FLAGS_DEBUG:STRING=-D_DEBUG
//Flags for Windows Resource Compiler during MINSIZEREL builds.
CMAKE_RC_FLAGS_MINSIZEREL:STRING=
//Flags for Windows Resource Compiler during RELEASE builds.
CMAKE_RC_FLAGS_RELEASE:STRING=
//Flags for Windows Resource Compiler during RELWITHDEBINFO builds.
CMAKE_RC_FLAGS_RELWITHDEBINFO:STRING=
//Flags used by the linker during the creation of shared libraries
// during all build types.
CMAKE_SHARED_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the linker during the creation of shared libraries
// during DEBUG builds.
CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
//Flags used by the linker during the creation of shared libraries
// during MINSIZEREL builds.
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of shared libraries
// during RELEASE builds.
CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
//Flags used by the linker during the creation of shared libraries
// during RELWITHDEBINFO builds.
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
//If set, runtime paths are not added when installing shared libraries,
// but are added when building.
CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
//If set, runtime paths are not added when using shared libraries.
CMAKE_SKIP_RPATH:BOOL=NO
//Flags used by the archiver during the creation of static libraries
// during all build types.
CMAKE_STATIC_LINKER_FLAGS:STRING=/machine:x64
//Flags used by the archiver during the creation of static libraries
// during DEBUG builds.
CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the archiver during the creation of static libraries
// during MINSIZEREL builds.
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the archiver during the creation of static libraries
// during RELEASE builds.
CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the archiver during the creation of static libraries
// during RELWITHDEBINFO builds.
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//If this value is on, makefiles will be generated without the
// .SILENT directive, and all commands will be echoed to the console
// during the make. This is useful for debugging only. With Visual
// Studio IDE projects all commands are done without /nologo.
CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
//The directory containing a CMake configuration file for OpenCV.
OpenCV_DIR:PATH=C:/Users/29578/.conda/envs/opencv-build/Library/cmake
//Value Computed by CMake
thermal_detector_BINARY_DIR:STATIC=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/热成像识别/cpp/build
//Value Computed by CMake
thermal_detector_IS_TOP_LEVEL:STATIC=ON
//Value Computed by CMake
thermal_detector_SOURCE_DIR:STATIC=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/热成像识别/cpp
########################
# INTERNAL cache entries
########################
//ADVANCED property for variable: CMAKE_AR
CMAKE_AR-ADVANCED:INTERNAL=1
//This is the directory where this CMakeCache.txt was created
CMAKE_CACHEFILE_DIR:INTERNAL=d:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/热成像识别/cpp/build
//Major version of cmake used to create the current loaded cache
CMAKE_CACHE_MAJOR_VERSION:INTERNAL=4
//Minor version of cmake used to create the current loaded cache
CMAKE_CACHE_MINOR_VERSION:INTERNAL=3
//Patch version of cmake used to create the current loaded cache
CMAKE_CACHE_PATCH_VERSION:INTERNAL=2
//Path to CMake executable.
CMAKE_COMMAND:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/bin/cmake.exe
//Path to cpack program executable.
CMAKE_CPACK_COMMAND:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/bin/cpack.exe
//Path to ctest program executable.
CMAKE_CTEST_COMMAND:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/bin/ctest.exe
//ADVANCED property for variable: CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES
CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1
//Executable file format
CMAKE_EXECUTABLE_FORMAT:INTERNAL=Unknown
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//Name of external makefile project generator.
CMAKE_EXTRA_GENERATOR:INTERNAL=
//Name of generator.
CMAKE_GENERATOR:INTERNAL=Visual Studio 17 2022
//Generator instance identifier.
CMAKE_GENERATOR_INSTANCE:INTERNAL=D:/vs
//Name of generator platform.
CMAKE_GENERATOR_PLATFORM:INTERNAL=
//Name of generator toolset.
CMAKE_GENERATOR_TOOLSET:INTERNAL=
//Source directory with the top level CMakeLists.txt file for this
// project
CMAKE_HOME_DIRECTORY:INTERNAL=D:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件开发/热成像识别/cpp
//ADVANCED property for variable: CMAKE_LINKER
CMAKE_LINKER-ADVANCED:INTERNAL=1
//Name of CMakeLists files to read
CMAKE_LIST_FILE_NAME:INTERNAL=CMakeLists.txt
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MT
CMAKE_MT-ADVANCED:INTERNAL=1
//number of local generators
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1
//Platform information initialized
CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1
//noop for ranlib
CMAKE_RANLIB:INTERNAL=:
//ADVANCED property for variable: CMAKE_RC_COMPILER
CMAKE_RC_COMPILER-ADVANCED:INTERNAL=1
CMAKE_RC_COMPILER_WORKS:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS
CMAKE_RC_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_DEBUG
CMAKE_RC_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_MINSIZEREL
CMAKE_RC_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_RELEASE
CMAKE_RC_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RC_FLAGS_RELWITHDEBINFO
CMAKE_RC_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//Path to CMake installation.
CMAKE_ROOT:INTERNAL=C:/Users/29578/.conda/envs/opencv-build/Library/share/cmake-4.3
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH
CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_RPATH
CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG
CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE
CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
//Details about finding OpenCV
FIND_PACKAGE_MESSAGE_DETAILS_OpenCV:INTERNAL=[C:/Users/29578/.conda/envs/opencv-build/Library][found components: core imgproc imgcodecs highgui videoio ][v4.13.0()]

@ -0,0 +1,102 @@
set(CMAKE_CXX_COMPILER "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/cl.exe")
set(CMAKE_CXX_COMPILER_ARG1 "")
set(CMAKE_CXX_COMPILER_ID "MSVC")
set(CMAKE_CXX_COMPILER_VERSION "19.43.34808.0")
set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "")
set(CMAKE_CXX_COMPILER_WRAPPER "")
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14")
set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "OFF")
set(CMAKE_CXX_STANDARD_LATEST "23")
set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23")
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17")
set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20")
set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23")
set(CMAKE_CXX26_COMPILE_FEATURES "")
set(CMAKE_CXX_PLATFORM_ID "Windows")
set(CMAKE_CXX_SIMULATE_ID "")
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "MSVC")
set(CMAKE_CXX_COMPILER_APPLE_SYSROOT "")
set(CMAKE_CXX_SIMULATE_VERSION "")
set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x64")
set(MSVC_CXX_ARCHITECTURE_ID x64)
set(CMAKE_AR "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/lib.exe")
set(CMAKE_CXX_COMPILER_AR "")
set(CMAKE_RANLIB ":")
set(CMAKE_CXX_COMPILER_RANLIB "")
set(CMAKE_LINKER "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/link.exe")
set(CMAKE_LINKER_LINK "D:/vs/VC/Tools/MSVC/14.43.34808/bin/Hostx64/x64/link.exe")
set(CMAKE_LINKER_LLD "lld-link")
set(CMAKE_CXX_COMPILER_LINKER "D:/vs/VC/Tools/MSVC/14.43.34808/bin/HostX64/x64/link.exe")
set(CMAKE_CXX_COMPILER_LINKER_ID "MSVC")
set(CMAKE_CXX_COMPILER_LINKER_VERSION 14.43.34808.0)
set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT MSVC)
set(CMAKE_MT "CMAKE_MT-NOTFOUND")
set(CMAKE_TAPI "")
set(CMAKE_COMPILER_IS_GNUCXX )
set(CMAKE_CXX_COMPILER_LOADED 1)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_CXX_ABI_COMPILED TRUE)
set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
set(CMAKE_CXX_COMPILER_ID_RUN 1)
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m)
set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
foreach (lang IN ITEMS C OBJC OBJCXX)
if (CMAKE_${lang}_COMPILER_ID_RUN)
foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS)
list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension})
endforeach()
endif()
endforeach()
set(CMAKE_CXX_LINKER_PREFERENCE 30)
set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED )
set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED )
set(CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED )
# Save compiler ABI information.
set(CMAKE_CXX_SIZEOF_DATA_PTR "8")
set(CMAKE_CXX_COMPILER_ABI "")
set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN")
set(CMAKE_CXX_LIBRARY_ARCHITECTURE "")
if(CMAKE_CXX_SIZEOF_DATA_PTR)
set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
endif()
if(CMAKE_CXX_COMPILER_ABI)
set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
endif()
if(CMAKE_CXX_LIBRARY_ARCHITECTURE)
set(CMAKE_LIBRARY_ARCHITECTURE "")
endif()
set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "")
if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX)
set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}")
endif()
set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "")
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "")
set(CMAKE_CXX_COMPILER_IMPORT_STD "")
set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "Unsupported generator: Visual Studio 17 2022")
set(CMAKE_CXX_STDLIB_MODULES_JSON "")

@ -0,0 +1,6 @@
set(CMAKE_RC_COMPILER "rc")
set(CMAKE_RC_COMPILER_ARG1 "")
set(CMAKE_RC_COMPILER_LOADED 1)
set(CMAKE_RC_SOURCE_FILE_EXTENSIONS rc;RC)
set(CMAKE_RC_OUTPUT_EXTENSION .res)
set(CMAKE_RC_COMPILER_ENV_VAR "RC")

@ -0,0 +1,15 @@
set(CMAKE_HOST_SYSTEM "Windows-10.0.26200")
set(CMAKE_HOST_SYSTEM_NAME "Windows")
set(CMAKE_HOST_SYSTEM_VERSION "10.0.26200")
set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64")
set(CMAKE_SYSTEM "Windows-10.0.26200")
set(CMAKE_SYSTEM_NAME "Windows")
set(CMAKE_SYSTEM_VERSION "10.0.26200")
set(CMAKE_SYSTEM_PROCESSOR "AMD64")
set(CMAKE_CROSSCOMPILING "FALSE")
set(CMAKE_SYSTEM_LOADED 1)

@ -0,0 +1,949 @@
/* This source file must have a .cpp extension so that all C++ compilers
recognize the extension without flags. Borland does not know .cxx for
example. */
#ifndef __cplusplus
# error "A C compiler has been selected for C++."
#endif
#if !defined(__has_include)
/* If the compiler does not have __has_include, pretend the answer is
always no. */
# define __has_include(x) 0
#endif
/* Version number components: V=Version, R=Revision, P=Patch
Version date components: YYYY=Year, MM=Month, DD=Day */
#if defined(__INTEL_COMPILER) || defined(__ICC)
# define COMPILER_ID "Intel"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# if defined(__GNUC__)
# define SIMULATE_ID "GNU"
# endif
/* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later,
except that a few beta releases use the old format with V=2021. */
# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
# if defined(__INTEL_COMPILER_UPDATE)
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
# else
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
# endif
# else
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
/* The third version component from --version is an update index,
but no macro is provided for it. */
# define COMPILER_VERSION_PATCH DEC(0)
# endif
# if defined(__INTEL_COMPILER_BUILD_DATE)
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
# endif
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER)
# define COMPILER_ID "IntelLLVM"
#if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
#endif
#if defined(__GNUC__)
# define SIMULATE_ID "GNU"
#endif
/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and
* later. Look for 6 digit vs. 8 digit version number to decide encoding.
* VVVV is no smaller than the current year when a version is released.
*/
#if __INTEL_LLVM_COMPILER < 1000000L
# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10)
#else
# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000)
# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100)
#endif
#if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
#endif
#if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
#elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
#endif
#if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
#endif
#if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
#endif
#elif defined(__PATHCC__)
# define COMPILER_ID "PathScale"
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
# if defined(__PATHCC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
# endif
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
# define COMPILER_ID "Embarcadero"
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
#elif defined(__BORLANDC__)
# define COMPILER_ID "Borland"
/* __BORLANDC__ = 0xVRR */
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
# define COMPILER_ID "Watcom"
/* __WATCOMC__ = VVRR */
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__WATCOMC__)
# define COMPILER_ID "OpenWatcom"
/* __WATCOMC__ = VVRP + 1100 */
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__SUNPRO_CC)
# define COMPILER_ID "SunPro"
# if __SUNPRO_CC >= 0x5100
/* __SUNPRO_CC = 0xVRRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# else
/* __SUNPRO_CC = 0xVRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# endif
#elif defined(__HP_aCC)
# define COMPILER_ID "HP"
/* __HP_aCC = VVRRPP */
# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
#elif defined(__DECCXX)
# define COMPILER_ID "Compaq"
/* __DECCXX_VER = VVRRTPPPP */
# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
# define COMPILER_ID "zOS"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__open_xl__) && defined(__clang__)
# define COMPILER_ID "IBMClang"
# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__)
# define COMPILER_VERSION_MINOR DEC(__open_xl_release__)
# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(__ibmxl__) && defined(__clang__)
# define COMPILER_ID "XLClang"
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
# define COMPILER_ID "XL"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
# define COMPILER_ID "VisualAge"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__NVCOMPILER)
# define COMPILER_ID "NVHPC"
# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__)
# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__)
# if defined(__NVCOMPILER_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__)
# endif
#elif defined(__PGI)
# define COMPILER_ID "PGI"
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
# if defined(__PGIC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
# endif
#elif defined(__clang__) && defined(__cray__)
# define COMPILER_ID "CrayClang"
# define COMPILER_VERSION_MAJOR DEC(__cray_major__)
# define COMPILER_VERSION_MINOR DEC(__cray_minor__)
# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(_CRAYC)
# define COMPILER_ID "Cray"
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
#elif defined(__TI_COMPILER_VERSION__)
# define COMPILER_ID "TI"
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
#elif defined(__CLANG_FUJITSU)
# define COMPILER_ID "FujitsuClang"
# define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
# define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(__FUJITSU)
# define COMPILER_ID "Fujitsu"
# if defined(__FCC_version__)
# define COMPILER_VERSION __FCC_version__
# elif defined(__FCC_major__)
# define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
# define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
# endif
# if defined(__fcc_version)
# define COMPILER_VERSION_INTERNAL DEC(__fcc_version)
# elif defined(__FCC_VERSION)
# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION)
# endif
#elif defined(__ghs__)
# define COMPILER_ID "GHS"
/* __GHS_VERSION_NUMBER = VVVVRP */
# ifdef __GHS_VERSION_NUMBER
# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
# endif
#elif defined(__TASKING__)
# define COMPILER_ID "Tasking"
# define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000)
# define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100)
# define COMPILER_VERSION_INTERNAL DEC(__VERSION__)
#elif defined(__ORANGEC__)
# define COMPILER_ID "OrangeC"
# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__)
# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__)
# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__)
#elif defined(__RENESAS__)
# define COMPILER_ID "Renesas"
/* __RENESAS_VERSION__ = 0xVVRRPP00 */
# define COMPILER_VERSION_MAJOR HEX(__RENESAS_VERSION__ >> 24 & 0xFF)
# define COMPILER_VERSION_MINOR HEX(__RENESAS_VERSION__ >> 16 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__RENESAS_VERSION__ >> 8 & 0xFF)
#elif defined(__SCO_VERSION__)
# define COMPILER_ID "SCO"
#elif defined(__ARMCC_VERSION) && !defined(__clang__)
# define COMPILER_ID "ARMCC"
#if __ARMCC_VERSION >= 1000000
/* __ARMCC_VERSION = VRRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#else
/* __ARMCC_VERSION = VRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#endif
#elif defined(__clang__) && defined(__apple_build_version__)
# define COMPILER_ID "AppleClang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
# define COMPILER_ID "ARMClang"
# define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100)
# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
#elif defined(__clang__) && defined(__ti__)
# define COMPILER_ID "TIClang"
# define COMPILER_VERSION_MAJOR DEC(__ti_major__)
# define COMPILER_VERSION_MINOR DEC(__ti_minor__)
# define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__)
# define COMPILER_VERSION_INTERNAL DEC(__ti_version__)
#elif defined(__clang__)
# define COMPILER_ID "Clang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__))
# define COMPILER_ID "LCC"
# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100)
# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100)
# if defined(__LCC_MINOR__)
# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__)
# endif
# if defined(__GNUC__) && defined(__GNUC_MINOR__)
# define SIMULATE_ID "GNU"
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
# endif
#elif defined(__GNUC__) || defined(__GNUG__)
# define COMPILER_ID "GNU"
# if defined(__GNUC__)
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
# else
# define COMPILER_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(_MSC_VER)
# define COMPILER_ID "MSVC"
/* _MSC_VER = VVRR */
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
# if defined(_MSC_FULL_VER)
# if _MSC_VER >= 1400
/* _MSC_FULL_VER = VVRRPPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
# else
/* _MSC_FULL_VER = VVRRPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
# endif
# endif
# if defined(_MSC_BUILD)
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
# endif
#elif defined(_ADI_COMPILER)
# define COMPILER_ID "ADSP"
#if defined(__VERSIONNUM__)
/* __VERSIONNUM__ = 0xVVRRPPTT */
# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF)
# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF)
# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF)
# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF)
#endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# define COMPILER_ID "IAR"
# if defined(__VER__) && defined(__ICCARM__)
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__))
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# endif
#elif defined(__DCC__) && defined(_DIAB_TOOL)
# define COMPILER_ID "Diab"
# define COMPILER_VERSION_MAJOR DEC(__VERSION_MAJOR_NUMBER__)
# define COMPILER_VERSION_MINOR DEC(__VERSION_MINOR_NUMBER__)
# define COMPILER_VERSION_PATCH DEC(__VERSION_ARCH_FEATURE_NUMBER__)
# define COMPILER_VERSION_TWEAK DEC(__VERSION_BUG_FIX_NUMBER__)
/* These compilers are either not known or too old to define an
identification macro. Try to identify the platform and guess that
it is the native compiler. */
#elif defined(__hpux) || defined(__hpua)
# define COMPILER_ID "HP"
#else /* unknown compiler */
# define COMPILER_ID ""
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
#ifdef SIMULATE_ID
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
#endif
#ifdef __QNXNTO__
char const* qnxnto = "INFO" ":" "qnxnto[]";
#endif
#if defined(__CRAYXT_COMPUTE_LINUX_TARGET)
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
#endif
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
/* Identify known platforms by name. */
#if defined(__linux) || defined(__linux__) || defined(linux)
# define PLATFORM_ID "Linux"
#elif defined(__MSYS__)
# define PLATFORM_ID "MSYS"
#elif defined(__CYGWIN__)
# define PLATFORM_ID "Cygwin"
#elif defined(__MINGW32__)
# define PLATFORM_ID "MinGW"
#elif defined(__APPLE__)
# define PLATFORM_ID "Darwin"
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
# define PLATFORM_ID "Windows"
#elif defined(__FreeBSD__) || defined(__FreeBSD)
# define PLATFORM_ID "FreeBSD"
#elif defined(__NetBSD__) || defined(__NetBSD)
# define PLATFORM_ID "NetBSD"
#elif defined(__OpenBSD__) || defined(__OPENBSD)
# define PLATFORM_ID "OpenBSD"
#elif defined(__sun) || defined(sun)
# define PLATFORM_ID "SunOS"
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
# define PLATFORM_ID "AIX"
#elif defined(__hpux) || defined(__hpux__)
# define PLATFORM_ID "HP-UX"
#elif defined(__HAIKU__)
# define PLATFORM_ID "Haiku"
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
# define PLATFORM_ID "BeOS"
#elif defined(__QNX__) || defined(__QNXNTO__)
# define PLATFORM_ID "QNX"
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
# define PLATFORM_ID "Tru64"
#elif defined(__riscos) || defined(__riscos__)
# define PLATFORM_ID "RISCos"
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
# define PLATFORM_ID "SINIX"
#elif defined(__UNIX_SV__)
# define PLATFORM_ID "UNIX_SV"
#elif defined(__bsdos__)
# define PLATFORM_ID "BSDOS"
#elif defined(_MPRAS) || defined(MPRAS)
# define PLATFORM_ID "MP-RAS"
#elif defined(__osf) || defined(__osf__)
# define PLATFORM_ID "OSF1"
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
# define PLATFORM_ID "SCO_SV"
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
# define PLATFORM_ID "ULTRIX"
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
# define PLATFORM_ID "Xenix"
#elif defined(__WATCOMC__)
# if defined(__LINUX__)
# define PLATFORM_ID "Linux"
# elif defined(__DOS__)
# define PLATFORM_ID "DOS"
# elif defined(__OS2__)
# define PLATFORM_ID "OS2"
# elif defined(__WINDOWS__)
# define PLATFORM_ID "Windows3x"
# elif defined(__VXWORKS__)
# define PLATFORM_ID "VxWorks"
# else /* unknown platform */
# define PLATFORM_ID
# endif
#elif defined(__INTEGRITY)
# if defined(INT_178B)
# define PLATFORM_ID "Integrity178"
# else /* regular Integrity */
# define PLATFORM_ID "Integrity"
# endif
# elif defined(_ADI_COMPILER)
# define PLATFORM_ID "ADSP"
#else /* unknown platform */
# define PLATFORM_ID
#endif
/* For windows compilers MSVC and Intel we can determine
the architecture of the compiler being used. This is because
the compilers do not have flags that can change the architecture,
but rather depend on which compiler is being used
*/
#if defined(_WIN32) && defined(_MSC_VER)
# if defined(_M_IA64)
# define ARCHITECTURE_ID "IA64"
# elif defined(_M_ARM64EC)
# define ARCHITECTURE_ID "ARM64EC"
# elif defined(_M_X64) || defined(_M_AMD64)
# define ARCHITECTURE_ID "x64"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# elif defined(_M_ARM64)
# define ARCHITECTURE_ID "ARM64"
# elif defined(_M_ARM)
# if _M_ARM == 4
# define ARCHITECTURE_ID "ARMV4I"
# elif _M_ARM == 5
# define ARCHITECTURE_ID "ARMV5I"
# else
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
# endif
# elif defined(_M_MIPS)
# define ARCHITECTURE_ID "MIPS"
# elif defined(_M_SH)
# define ARCHITECTURE_ID "SHx"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__WATCOMC__)
# if defined(_M_I86)
# define ARCHITECTURE_ID "I86"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# if defined(__ICCARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__ICCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__ICCRH850__)
# define ARCHITECTURE_ID "RH850"
# elif defined(__ICCRL78__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__ICCRISCV__)
# define ARCHITECTURE_ID "RISCV"
# elif defined(__ICCAVR__)
# define ARCHITECTURE_ID "AVR"
# elif defined(__ICC430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__ICCV850__)
# define ARCHITECTURE_ID "V850"
# elif defined(__ICC8051__)
# define ARCHITECTURE_ID "8051"
# elif defined(__ICCSTM8__)
# define ARCHITECTURE_ID "STM8"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__ghs__)
# if defined(__PPC64__)
# define ARCHITECTURE_ID "PPC64"
# elif defined(__ppc__)
# define ARCHITECTURE_ID "PPC"
# elif defined(__ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__x86_64__)
# define ARCHITECTURE_ID "x64"
# elif defined(__i386__)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__clang__) && defined(__ti__)
# if defined(__ARM_ARCH)
# define ARCHITECTURE_ID "ARM"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__TI_COMPILER_VERSION__)
# if defined(__TI_ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__MSP430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__TMS320C28XX__)
# define ARCHITECTURE_ID "TMS320C28x"
# elif defined(__TMS320C6X__) || defined(_TMS320C6X)
# define ARCHITECTURE_ID "TMS320C6x"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
# elif defined(__ADSPSHARC__)
# define ARCHITECTURE_ID "SHARC"
# elif defined(__ADSPBLACKFIN__)
# define ARCHITECTURE_ID "Blackfin"
#elif defined(__TASKING__)
# if defined(__CTC__) || defined(__CPTC__)
# define ARCHITECTURE_ID "TriCore"
# elif defined(__CMCS__)
# define ARCHITECTURE_ID "MCS"
# elif defined(__CARM__) || defined(__CPARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__CARC__)
# define ARCHITECTURE_ID "ARC"
# elif defined(__C51__)
# define ARCHITECTURE_ID "8051"
# elif defined(__CPCP__)
# define ARCHITECTURE_ID "PCP"
# else
# define ARCHITECTURE_ID ""
# endif
#elif defined(__RENESAS__)
# if defined(__CCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__CCRL__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__CCRH__)
# define ARCHITECTURE_ID "RH850"
# else
# define ARCHITECTURE_ID ""
# endif
#else
# define ARCHITECTURE_ID
#endif
/* Convert integer to decimal digit literals. */
#define DEC(n) \
('0' + (((n) / 10000000)%10)), \
('0' + (((n) / 1000000)%10)), \
('0' + (((n) / 100000)%10)), \
('0' + (((n) / 10000)%10)), \
('0' + (((n) / 1000)%10)), \
('0' + (((n) / 100)%10)), \
('0' + (((n) / 10)%10)), \
('0' + ((n) % 10))
/* Convert integer to hex digit literals. */
#define HEX(n) \
('0' + ((n)>>28 & 0xF)), \
('0' + ((n)>>24 & 0xF)), \
('0' + ((n)>>20 & 0xF)), \
('0' + ((n)>>16 & 0xF)), \
('0' + ((n)>>12 & 0xF)), \
('0' + ((n)>>8 & 0xF)), \
('0' + ((n)>>4 & 0xF)), \
('0' + ((n) & 0xF))
/* Construct a string literal encoding the version number. */
#ifdef COMPILER_VERSION
char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]";
/* Construct a string literal encoding the version number components. */
#elif defined(COMPILER_VERSION_MAJOR)
char const info_version[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
COMPILER_VERSION_MAJOR,
# ifdef COMPILER_VERSION_MINOR
'.', COMPILER_VERSION_MINOR,
# ifdef COMPILER_VERSION_PATCH
'.', COMPILER_VERSION_PATCH,
# ifdef COMPILER_VERSION_TWEAK
'.', COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct a string literal encoding the internal version number. */
#ifdef COMPILER_VERSION_INTERNAL
char const info_version_internal[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
'i','n','t','e','r','n','a','l','[',
COMPILER_VERSION_INTERNAL,']','\0'};
#elif defined(COMPILER_VERSION_INTERNAL_STR)
char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]";
#endif
/* Construct a string literal encoding the version number components. */
#ifdef SIMULATE_VERSION_MAJOR
char const info_simulate_version[] = {
'I', 'N', 'F', 'O', ':',
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
SIMULATE_VERSION_MAJOR,
# ifdef SIMULATE_VERSION_MINOR
'.', SIMULATE_VERSION_MINOR,
# ifdef SIMULATE_VERSION_PATCH
'.', SIMULATE_VERSION_PATCH,
# ifdef SIMULATE_VERSION_TWEAK
'.', SIMULATE_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
#define CXX_STD_98 199711L
#define CXX_STD_11 201103L
#define CXX_STD_14 201402L
#define CXX_STD_17 201703L
#define CXX_STD_20 202002L
#define CXX_STD_23 202302L
#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG)
# if _MSVC_LANG > CXX_STD_17
# define CXX_STD _MSVC_LANG
# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
# define CXX_STD CXX_STD_20
# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17
# define CXX_STD CXX_STD_20
# elif _MSVC_LANG > CXX_STD_14
# define CXX_STD CXX_STD_17
# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# elif defined(__INTEL_CXX11_MODE__)
# define CXX_STD CXX_STD_11
# else
# define CXX_STD CXX_STD_98
# endif
#elif defined(_MSC_VER) && defined(_MSVC_LANG)
# if _MSVC_LANG > __cplusplus
# define CXX_STD _MSVC_LANG
# else
# define CXX_STD __cplusplus
# endif
#elif defined(__NVCOMPILER)
# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
# define CXX_STD CXX_STD_20
# else
# define CXX_STD __cplusplus
# endif
#elif defined(__INTEL_COMPILER) || defined(__PGI)
# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes)
# define CXX_STD CXX_STD_17
# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# else
# define CXX_STD __cplusplus
# endif
#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__)
# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# else
# define CXX_STD __cplusplus
# endif
#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__)
# define CXX_STD CXX_STD_11
#else
# define CXX_STD __cplusplus
#endif
const char* info_language_standard_default = "INFO" ":" "standard_default["
#if CXX_STD > CXX_STD_23
"26"
#elif CXX_STD > CXX_STD_20
"23"
#elif CXX_STD > CXX_STD_17
"20"
#elif CXX_STD > CXX_STD_14
"17"
#elif CXX_STD > CXX_STD_11
"14"
#elif CXX_STD >= CXX_STD_11
"11"
#else
"98"
#endif
"]";
const char* info_language_extensions_default = "INFO" ":" "extensions_default["
#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \
defined(__TI_COMPILER_VERSION__) || defined(__RENESAS__)) && \
!defined(__STRICT_ANSI__)
"ON"
#else
"OFF"
#endif
"]";
/*--------------------------------------------------------------------------*/
int main(int argc, char* argv[])
{
int require = 0;
require += info_compiler[argc];
require += info_platform[argc];
require += info_arch[argc];
#ifdef COMPILER_VERSION_MAJOR
require += info_version[argc];
#endif
#if defined(COMPILER_VERSION_INTERNAL) || defined(COMPILER_VERSION_INTERNAL_STR)
require += info_version_internal[argc];
#endif
#ifdef SIMULATE_ID
require += info_simulate[argc];
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#if defined(__CRAYXT_COMPUTE_LINUX_TARGET)
require += info_cray[argc];
#endif
require += info_language_standard_default[argc];
require += info_language_extensions_default[argc];
(void)argv;
return require;
}

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{CAE07175-D007-4FC3-BFE8-47B392814159}</ProjectGuid>
<RootNamespace>CompilerIdCXX</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary Condition="'$(ApplicationType)'!='Android'">MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>TurnOffAllWarnings</WarningLevel>
<DebugInformationFormat>
</DebugInformationFormat>
</ClCompile>
<Link>
<GenerateDebugInformation>false</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>for %%i in (cl.exe) do %40echo CMAKE_CXX_COMPILER=%%~$PATH:i</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="CMakeCXXCompilerId.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ProjectOutputs>
<ProjectOutput>
<FullPath>D:\29578\Documents\Study\computer\S_E\软件体系结构与设计\软件开发\热成像识别\cpp\build\CMakeFiles\4.3.2\CompilerIdCXX\CompilerIdCXX.exe</FullPath>
</ProjectOutput>
</ProjectOutputs>
<ContentFiles />
<SatelliteDlls />
<NonRecipeFileRefs />
</Project>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save