diff --git a/doc/CMakeLists_RK3588.txt b/doc/CMakeLists_RK3588.txt new file mode 100644 index 0000000..cb888ee --- /dev/null +++ b/doc/CMakeLists_RK3588.txt @@ -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("$<$:/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) + diff --git a/doc/S3315_152通讯协议.docx b/doc/S3315_152通讯协议.docx new file mode 100644 index 0000000..8b67cfc Binary files /dev/null and b/doc/S3315_152通讯协议.docx differ diff --git a/doc/S3315算法功能说明.md b/doc/S3315算法功能说明.md new file mode 100644 index 0000000..7fe52e5 --- /dev/null +++ b/doc/S3315算法功能说明.md @@ -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; +} +``` \ No newline at end of file diff --git a/doc/S3315调试说明.docx b/doc/S3315调试说明.docx new file mode 100644 index 0000000..0c9355d Binary files /dev/null and b/doc/S3315调试说明.docx differ