// 暴力锁定解锁鲁棒性测试 #include "NeoArithStandardDll.h" #include "utils.h" #include #include #include #include #include #include "opencv2/opencv.hpp" #include "TestAPI_Profile.h" #include using std::cout; using std::endl; int TestAPI_SOT_LockUnlock_Stress() { // 产生一个仿真数据 int nWidth = 1920; int nHeight = 1080; const int Test_Len = 100000; // 初始化随机数生成器 std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> offsetDist(-2000, 2000); // 在目标周围±5像素范围内随机 SimTargetImage factory(nWidth, nHeight); factory.setCheckerboardBackGround(120, 0, 80); // 创建算法句柄 ArithHandle pTracker = STD_CreatEOArithHandle(); // 初始化为凝视-对空模式 ARIDLL_EOArithInitWithMode(pTracker, nWidth, nHeight, GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_NV12, GLB_SYS_MODE::GLB_SYS_STARE, GLB_SCEN_MODE::GLB_SCEN_GROUND); ARIDLL_INPUTPARA stInputPara = { 0 }; stInputPara.unFrmId++; stInputPara.unFreq = 50; stInputPara.stCameraInfo.fPixelSize = 15; stInputPara.stCameraInfo.nFocus = 300; stInputPara.stCameraInfo.unVideoType = GLB_VIDEO_IR_MW; ARIDLL_OUTPUT stOutput = { 0 }; // 生成随机锁定解锁序列 std::vector lockUnlockSequence = generateRandomLockUnlockSequence(Test_Len); int nTrackSuc = 0; int nLock = 0, nUnlock = 0, nLost = 0; bool locked = false; for (int i = 0; i < Test_Len; i++) { stInputPara.unFrmId++; factory.update(); cv::Mat src = factory.getImageNV12(); GD_VIDEO_FRAME_S img = { 0 }; img.enPixelFormat = GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_NV12; img.u32Width = nWidth; img.u32Height = nHeight; img.u32Stride[0] = img.u32Width; img.u64VirAddr[0] = (UBYTE8*)src.data; int targetNum = 0; cv::TickMeter tm1; tm1.start(); { //targetNum = ARIDLL_SearchFrameTargets(pTracker, img); } tm1.stop(); printf("det time:%.2f", tm1.getTimeMilli()); // 根据序列执行锁定/解锁操作 switch (lockUnlockSequence[i]) { case 1: // 锁定 { // 在目标周围随机选择锁定位置 int offsetX = offsetDist(gen); int offsetY = offsetDist(gen); //ARIDLL_LockCommand_DefaultSize(pTracker, (int)nWidth / 2 + offsetX, (int)nHeight / 2 + offsetY, 30, 30); //ARIDLL_LockTarget_DefaultSize(pTracker, img,(int)nWidth / 2 + offsetX, (int)nHeight / 2 + offsetY, 30, 30); locked = true; nLock++; } break; case 2: // 解锁 ARIDLL_unLockCommand(pTracker); locked = false; nUnlock++; break; default: // 普通帧 break; } cv::TickMeter tm2; tm2.start(); ARIDLL_RunController(pTracker, img, stInputPara, &stOutput); tm2.stop(); printf(" trk time:%.2f\n", tm2.getTimeMilli()); #ifdef SHOW cv::Mat rgb = factory.getImageRGB(); showArithInfo(rgb, &stOutput); imshow("res", rgb); cv::waitKey(1); #endif printf("nStatus:%d,Proc:%d", stOutput.nStatus,stInputPara.unFrmId); } // 输出测试统计结果 return 0; }