main
11566hyc 4 months ago
parent b9aa1377f2
commit ab4b68bcb8

@ -0,0 +1,219 @@
cmake_minimum_required(VERSION 3.10)
project(QGuideArith VERSION 1.0 LANGUAGES CXX)
# 启用 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(BUILD_ARITH_STUDIO FALSE) # 设置是否构建算法平台
set(BUILD_AI_ONNX_DETECT FALSE) # 设置是否基于ONNX构建AI识别模块
set(BUILD_AI_CUDA_DETECT FALSE) # 设置是否基于CUDA构建AI识别模块
set(BUILD_AI_TRACK FALSE) # 设置是否构建AI跟踪模块
# 指定交叉编译工具链
set(CMAKE_C_COMPILER /opt/x64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /opt/x64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
message("project root path is ${CMAKE_CURRENT_SOURCE_DIR}")
message("compiler is ${CMAKE_CXX_COMPILER}")
# 添加编译类型选项
option(USE_DEBUG "Compile in debug mode" OFF)
message("USE_DEBUG is ${USE_DEBUG}")
# 根据选项设置编译类型和编译标志
if(USE_DEBUG)
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -g -Wall")
message(STATUS "Compiling in Debug mode")
else()
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -Ofast -O3 -ffast-math -march=armv8-a -Wall")
message(STATUS "Compiling in Release mode")
endif()
# ###########################架构优化开关#####################################
MESSAGE(STATUS "********************************************")
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
add_definitions(-DNEON)
add_definitions(-DUSE_CPUBIND)
SET(CMAKE_BUILD_TYPE "Release")
MESSAGE(STATUS "build on aarch64+++++++++++++++++++++++,add_definitions -DARM64")
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "AMD64" OR "64")
message(STATUS "this is AMD64 cpu **")
endif()
MESSAGE(STATUS "********************************************")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
# 设置源码路径宏
set(SOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
# 将路径编码,便于各人模型文件的路径一致
add_definitions(-DSOURCE_PATH=\"${SOURCE_PATH}\")
# ##########################全局配置##############################
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# set(CMAKE_SKIP_BUILD_RPATH ON)
# 为win下使用vs编译器强制启用 UTF-8 编码
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")
# 强制编译器检查类型问题
# add_compile_options(-Werror)
# add_compile_options(-Wreturn-type)
#
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Werror,-Bsymbolic")
# 设置全局编译选项
# 开启单元测试:算法模块单元测试
ENABLE_TESTING()
# ########################## 第三方库 ##############################
# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/opencv_RK/opencv")
set(OpenCV_INCLUDES ${OpenCV_DIR}/include/opencv4)
set(OPENCV_LIB_DIR ${OpenCV_DIR}/lib)
FILE(GLOB OpenCV_LIBS "${OPENCV_LIB_DIR}/*")
# 设置 zlib 路径
set(ZLIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/zlib_rk3588")
FILE(GLOB ZLIBS "${ZLIB_DIR}/lib/*")
# ########################## AI ONNX支持库配置 ###########################
IF(BUILD_AI_ONNX_DETECT)
add_definitions(-DENABLE_AI_ONNX_DETECT)
SET(Arith_AIDET_DIR AIDetector/x86_onnx) # AI识别库
SET(Arith_AIDET_SRC_DIR ${Arith_AIDET_DIR}/src)
IF(WIN32)
set(LIB_Arith_AIDET_NAME libAIDetector)
ELSE(WIN32)
set(LIB_Arith_AIDET_NAME AIDetector)
ENDIF(WIN32)
add_subdirectory(${Arith_AIDET_DIR})
ENDIF()
# ########################## AI CUDA支持库配置 ##########################
IF(BUILD_AI_CUDA_DETECT)
add_definitions(-DENABLE_AI_CUDA_DETECT)
SET(Arith_AIDET_DIR AIDetector/x86_cuda) # AI识别库
SET(Arith_AIDET_SRC_DIR ${Arith_AIDET_DIR}/src)
IF(WIN32)
set(LIB_Arith_AIDET_NAME libAIDetector)
ELSE(WIN32)
set(LIB_Arith_AIDET_NAME AIDetector)
ENDIF(WIN32)
add_subdirectory(${Arith_AIDET_DIR})
ENDIF()
# ########################## AI跟踪支持库配置 ###########################
IF(BUILD_AI_TRACK)
add_definitions(-DENABLE_AI_TRACK)
SET(Arith_AITRACK_DIR AITracker/x86) # AI跟踪库
SET(Arith_AITRACK_SRC_DIR ${Arith_AITRACK_DIR}/src)
IF(WIN32)
set(LIB_Arith_AITRK_NAME libAITracker)
ELSE(WIN32)
set(LIB_Arith_AITRK_NAME AITracker)
ENDIF(WIN32)
add_subdirectory(${Arith_AITRACK_DIR})
ENDIF()
# ########################## 算法库配置 ##############################
SET(ArithDIR NeoTracker)
SET(ArithSrcDIR ${ArithDIR}/src)
SET(SVMmodelsDIR ${ArithSrcDIR}/SVM/models)
# 设置算法库目录
IF(WIN32)
set(LIB_TRACKER libGuideTracker)
ELSE(WIN32)
set(LIB_TRACKER GuideTracker)
ENDIF(WIN32)
# 添加算法子目录
add_subdirectory(${ArithDIR})
IF(BUILD_ARITH_STUDIO)
# ########################## Qt环境 ##############################
IF(WIN32)
set(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019_64")
ELSE(WIN32)
set(CMAKE_PREFIX_PATH "/home/wang/Qt/5.15.2/gcc_64")
ENDIF(WIN32)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt5 REQUIRED COMPONENTS PrintSupport)
set(TS_FILES QGuideArith_zh_CN.ts)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# 引入算法头文件
include_directories(${ArithSrcDIR})
include_directories(${ArithSrcDIR2})
include_directories(${ArithSrcDIR3})
include_directories(${ArithLogSrcDIR})
include_directories(${Arith_AIDET_SRC_DIR})
include_directories(${Arith_AITRACK_SRC_DIR})
include_directories(${Arith_EXTTLD_SRC_DIR})
# 算法平台源文件
SET(QGuideArith_DIR ${CMAKE_SOURCE_DIR}/QGuideArithStudio/src)
# 包含本地路径否则qt提升类报错
include_directories(${QGuideArith_DIR})
# 日志SPDLOG
# include_directories(${CMAKE_SOURCE_DIR}/3rdParty)
FILE(GLOB PROJECT_SOURCES ${QGuideArith_DIR}/*.cpp ${QGuideArith_DIR}/*.h
${QGuideArith_DIR}/*.ui
${QGuideArith_DIR}/*.qrc
${QGuideArith_DIR}/*.rc
${CMAKE_SOURCE_DIR}/QGuideArithStudio/src/Project/*.cpp
${TS_FILES})
# 生成可执行文件
add_executable(QGuideArith ${PROJECT_SOURCES})
# 可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/Bin)
# 关闭控制台
set_target_properties(QGuideArith PROPERTIES WIN32_EXECUTABLE TRUE)
# 链接模块
target_link_libraries(QGuideArith PRIVATE
${LIB_TRACKER} # 标准新跟踪器NeoTracker
${LIB_Arith_AIDET_NAME} # ai检测
${LIB_Arith_AITRK_NAME} # ai跟踪
${ZLIBS}
${OpenCV_LIBS} # opencv
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::PrintSupport
)
ENDIF(BUILD_ARITH_STUDIO)
#configure_file(${SVMmodelsDIR}/scaled_fly_bird_train.model ${EXECUTABLE_OUTPUT_PATH}/scaled_fly_bird_train.model COPYONLY)

Binary file not shown.

@ -0,0 +1,243 @@
# S3315算法功能说明
S3315项目为某高性能微波防空设备跟踪算法基于12-12版基线代码开发
相较基线功能,存在如下改动:
## Arith_SysStruct.h
1.默认帧频 50Hz记忆帧数150帧3s最大目标检测个数 50 + 10
新增标记
```
bEnForceGuidel; // 半自动截获强制提取目标3s
BBOOL bTracking; // 管道被跟踪标记,用于标记辅跟踪目标
SINT32 nShowPipeID; //送显批号
```
## Arith_EOController.cpp
2.g_TrackCurrentID = 2; //辅跟踪目标默认从2开始仅控制显示输出
```
//点选取消辅跟踪目标
void Arith_EOController::GLB_Cancle_Point(SINT32 nPipeNum,POINT32S ptCanclePos)
{
SINT32 nSelecID = -1;
SINT32 nNearstDis = 999999;
// 便历距离最近的跟踪器
for (int i = 0; i < nPipeNum; i++)
{
PIPE* pPipe = &g_GLB_PipeProc->getPipeArray()[i];
if (!pPipe->bTracking || pPipe->bTrackingPipe) //1号目标或非辅跟踪目标跳过
{
continue;
}
SINT32 disX = ABS(pPipe->ptCurrentPnt.x - ptCanclePos.x);
SINT32 disY = ABS(pPipe->ptCurrentPnt.y - ptCanclePos.y);
SINT32 nDis2 = disX * disX + disY * disY;
if (nDis2 < nNearstDis)
{
nNearstDis = nDis2;
nSelecID = i;
}
}
if (-1 != nSelecID)
{
PIPE* pPipe = &g_GLB_PipeProc->getPipeArray()[nSelecID];
pPipe->bTracking = FALSE;
pPipe->nDelCntThres = GLB_PIPE_DEL_MIN_STARE;
}
}
```
## Arith_Status_SEARCH.cpp
```
//强制提取
SINT32 Arith_EOController::Proc_ForceLock(GD_VIDEO_FRAME_S img, GLB_INPUT& g_Input, GLB_PARAMETERS& g_para)
{
SINT32 nTrackPipeID = -1;
SINT32 nWidth = img.u32Width;
SINT32 nHeight = img.u32Height;
//3s强制提取由外部控制
// 对空模式可以转压点强制提取
if (GLB_SCEN_SKY == g_GLB_stPara.nWorkScene)
{
TARGET_OBJECT tTargetRe = { 0 };
SPEED32F sfAglSpeed = { 0 };
TARGET_OBJECT* Temp_Target_Array = g_GLB_Detectors->GetTargetArray();
SINT32 Temp_nTargetNum = 0;
g_GLB_stPara.snLockBoxSize.w = 40;
g_GLB_stPara.snLockBoxSize.h = 40;
MINMAXRECT mmCenterRect = { g_GLB_stPara.ptLockPos.x - g_GLB_stPara.snLockBoxSize.w / 2, g_GLB_stPara.ptLockPos.y - g_GLB_stPara.snLockBoxSize.h / 2 ,
g_GLB_stPara.ptLockPos.x + g_GLB_stPara.snLockBoxSize.w / 2 ,g_GLB_stPara.ptLockPos.y + g_GLB_stPara.snLockBoxSize.h / 2 };
BBOOL bPipeReObjFound = g_GLB_Detectors->pDST_Module->DST_PipeTargetReDetect(img, nWidth, nHeight,
g_GLB_stPara.ptLockPos, sfAglSpeed,
mmCenterRect,
&tTargetRe, &nTrackPipeID,Temp_Target_Array, &Temp_nTargetNum);
// 还没有检出,执行第三次超级弱小目标检测
if (!bPipeReObjFound)
{
BBOOL bPipeSeObjFound = g_GLB_Detectors->pDST_Module->DST_PipeTargetRReDetect(img, nWidth, nHeight,
g_GLB_stPara.ptLockPos, sfAglSpeed,
mmCenterRect,
&tTargetRe, &nTrackPipeID,Temp_Target_Array, &Temp_nTargetNum);
}
nTrackPipeID = g_GLB_PipeProc->SO_ForceLock(img,
g_GLB_stPara.ptLockPos, g_GLB_stPara.snLockBoxSize, Temp_Target_Array, Temp_nTargetNum, g_Input);
}
// 对地模式转固定波门框选
if (GLB_SCEN_GROUND == g_GLB_stPara.nWorkScene)
{
nTrackPipeID = g_GLB_PipeProc->SO_RectLock(img,
g_GLB_stPara.ptLockPos, g_GLB_stPara.snLockBoxSize, g_Input);
}
return nTrackPipeID;
}
```
## NeoArithStandardDll.cpp
```
//取消跟踪接口
STD_TRACKER_API void ARIDLL_unLockCommand(ArithHandle hArithSrc)
// 当前帧平台姿态----姿态值与方位俯仰重复
Input->afPlatformRPY = { 0 };
// 输出管道稳定目标
void ARIDLL_OutputPipeTarget(Arith_EOController* pArith, ARIDLL_OUTPUT* pstOutput)
{
·······
//显式输出算法状态
//对输出目标进行排序防止ARM转发取差量时跳动
for (int i = 0; i < pstOutput->nTrackObjCnts; i++)
{
ARIDLL_OBJINFO trackObj_temp_i = pstOutput->stTrackers[i];
for (int j = i+1; j < pstOutput->nTrackObjCnts; j++)
{
//ARIDLL_OBJINFO trackObj_temp_j = pstOutput->stTrackers[j];
if (pstOutput->stTrackers[j].nOutputID < trackObj_temp_i.nOutputID)
{
pstOutput->stTrackers[i] = pstOutput->stTrackers[j];
pstOutput->stTrackers[j] = trackObj_temp_i;
}
}
}
if(2 == pstOutput->nStatus)//搜索状态
{
if (pstOutput->nAlarmObjCnts > 0)
{
pstOutput->nStatus = 11; //自动截获状态
}
if (pArith->g_GLB_stPara.bEnForceGuide)
{
pstOutput->nStatus = 12; //半自动截获状态
}
}
//if (3 == pstOutput->nStatus || 5 == pstOutput->nStatus || 9 == pstOutput->nStatus)//跟踪状态
//{
if (pstOutput->nTrackObjCnts > 0)
{
pstOutput->nStatus = 3; //单目标跟踪
}
if (pstOutput->nTrackObjCnts > 1)
{
pstOutput->nStatus = 9; //多目标跟踪
}
//}
int Index = ARIDLL_Sort_PipeByDistance(pArith, pstOutput);
if (0 < Index)
{
ARIDLL_OBJINFO TempObj = pstOutput->stAlarmObjs[0];
pstOutput->stAlarmObjs[0] = pstOutput->stAlarmObjs[Index];
pstOutput->stAlarmObjs[Index] = TempObj;
}
LOG_DEBUG_OUTPUT("stAlarmObjs[0]nX:{},nY:{}; stTrackers[0]nX:{},nY:{}", pstOutput->stAlarmObjs[0].nX, pstOutput->stAlarmObjs[0].nY, pstOutput->stTrackers[0].nX, pstOutput->stTrackers[0].nY);
}
```
```
//点选锁定及取消辅跟踪目标接口
STD_TRACKER_API ARIDLL_OBJINFO ARIDLL_LockOrUnLock(ArithHandle hArithSrc, GD_VIDEO_FRAME_S img, int nX, int nY, int Radius)
{
Arith_EOController* pArith = (Arith_EOController*)hArithSrc;
PIPE* pPipeArray = pArith->g_GLB_PipeProc->getPipeArray();
int MaxPipeNum = pArith->g_GLB_PipeProc->PIPE_GetMaxPipeNum();
// 返回目标
ARIDLL_OBJINFO obj = { 0 };
int UnLockIndex = -1;
LOG_DEBUG("LOCK_X:{},LOCK_Y:{}", nX, nY);
if (0 != nX && 0 != nY)
{
for (int i = 0; i < MaxPipeNum; ++i)
{
PIPE* pPipeTemp = &pPipeArray[i];
if (!pPipeTemp->bTracking)
{
continue;
}
if (pPipeTemp->ptCurrentPnt.x > nX + Radius || pPipeTemp->ptCurrentPnt.x < nX - Radius ||
pPipeTemp->ptCurrentPnt.y > nY + Radius || pPipeTemp->ptCurrentPnt.y < nY - Radius)
{
continue;
}
UnLockIndex = i;
}
}
if (-1 != UnLockIndex)
{
PIPE* pPipe = &pPipeArray[UnLockIndex];
obj.unTrackingStatus = TrackingStatus::NOT_TRACKING;
pPipe->bTracking = FALSE;
pPipe->nDelCntThres = GLB_PIPE_DEL_MIN_STARE;
if (pPipe != NULL)
{
// 管道中最新目标
TARGET_OBJECT* pTarget = &pPipe->objHistoryList[pPipe->ubEnd];
//obj.nInPipesID = pATarget->nInPipesID_1 - 1;
obj.bInCurrFov = pPipe->bInsideFOV;
obj.nPipeLostCnt = pPipe->unLostCnt;
obj.nTotalCnt = pPipe->unTotalCnt;
obj.fAz = pPipe->afStopAgl.fAz;
obj.fPt = pPipe->afStopAgl.fPt;
obj.fProb = pPipe->fConfidence;
obj.nFrameId = pPipe->nLostFrmID;
obj.nX = pPipe->ptCurrentPnt.x;
obj.nY = pPipe->ptCurrentPnt.y;
obj.nObjW = pTarget->snSize.w;
obj.nObjH = pTarget->snSize.h;
obj.nOutputID = pPipe->nAlarmBatchID_1;
// 若有外部引导批号,则上报该批号
if (pPipe->nGuideBatchID > 0)
{
obj.nOutputID = pPipe->nGuideBatchID;
}
}
}
else
{
//obj = ARIDLL_LockTarget(pArith, img, nX, nY, 0, 0);
ARIDLL_LockCommand(pArith, nX, nY, 0, 0);
}
return obj;
}
```
```
//排序输出距离中心最近目标索引
STD_TRACKER_API int ARIDLL_Sort_PipeByDistance(ArithHandle hArithSrc, ARIDLL_OUTPUT* pstOutput)
{
Arith_EOController* pArith = (Arith_EOController*)hArithSrc;
float centre_x = pArith->g_GLB_stInput.nImageWidth / 2.f;
float centre_y = pArith->g_GLB_stInput.nImageHeight / 2.f;
float min_distance = 99999999;
int Index = -1;
for (int i = 0; i < pstOutput->nAlarmObjCnts; ++i)
{
float distance = (pstOutput->stAlarmObjs[i].nX - centre_x) * (pstOutput->stAlarmObjs[i].nX - centre_x) +
(pstOutput->stAlarmObjs[i].nY - centre_y) * (pstOutput->stAlarmObjs[i].nY - centre_y);
if (distance < min_distance)
{
Index = i;
min_distance = distance;
}
}
return Index;
}
```

Binary file not shown.
Loading…
Cancel
Save