From 06edc90d7b98b223350269eeed06b92aef26c9ea Mon Sep 17 00:00:00 2001 From: xkzou Date: Thu, 19 Nov 2020 18:31:46 +0800 Subject: [PATCH] 每个区域目标最大数 --- src/left_over/MSRegionSurveilance.h | 2 +- src/left_over/MSRegionSurveilanceCpu.cpp | 10 +++++----- src/left_over/RegionSurveillanceProcess.h | 5 +++-- src/left_over/left_over_det.h | 6 +++--- src/left_over/ms_region_surveilance.cpp | 4 ++-- src/left_over/svibe.cpp | 12 ++++++------ src/left_over/svibe.h | 3 ++- src/test/demo.cpp | 13 +++++++++---- 8 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/left_over/MSRegionSurveilance.h b/src/left_over/MSRegionSurveilance.h index b255be9..4406837 100644 --- a/src/left_over/MSRegionSurveilance.h +++ b/src/left_over/MSRegionSurveilance.h @@ -195,7 +195,7 @@ public: // ģͳʼ - virtual int RSinit(int nWidth, int nHeight, int widthstep, unsigned char* frameImgData, int nChannel, int nChannel_deal, bool nfiltFlag, int minArea = 0, int maxArea = 1000000) = 0; + virtual int RSinit(int nWidth, int nHeight, int widthstep, unsigned char* frameImgData, int nChannel, int nChannel_deal, bool nfiltFlag, int maxObjNum, int minArea = 0, int maxArea = 1000000) = 0; // ROIʼ virtual int RSRegion(int numROI, int alarm_info/*, bool iflog*/) = 0; diff --git a/src/left_over/MSRegionSurveilanceCpu.cpp b/src/left_over/MSRegionSurveilanceCpu.cpp index a327f0e..d6ec434 100644 --- a/src/left_over/MSRegionSurveilanceCpu.cpp +++ b/src/left_over/MSRegionSurveilanceCpu.cpp @@ -32,7 +32,7 @@ int IRegionSurveillanceCpu::rs_init(const rs_params ¶m) Screenshot(gray, img, rect[i]); //cv::Mat roi_img = cv::src_img(Range(0, 100), Range(50, 200)); r = IReginCpu[i]->RSinit(img->width, img->height, img->width, - (unsigned char*)(img->imageData), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.min_area, param.max_area); + (unsigned char*)(img->imageData), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.max_obj_num, param.min_area, param.max_area); cvReleaseImage(&img); } cvReleaseImage(&gray); @@ -80,7 +80,7 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio result->obj_infos[totalObjCount].curPos.y_ = ObjInfo[i].curPos.y+rect[k].top_; // ǰ result->obj_infos[totalObjCount].trace.trace_num = ObjInfo[i].trace.nTraceNum; // 켣״̬ - printf("nTraceNum = %d\n", ObjInfo[i].trace.nTraceNum); + //printf("nTraceNum = %d\n", ObjInfo[i].trace.nTraceNum); for (int j = 0; j < MAXTRACENUM; ++j) { result->obj_infos[totalObjCount].trace.obj_trace[j].x_ = ObjInfo[i].trace.pObjTrace[j].x+rect[k].left_; @@ -98,7 +98,7 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio result->obj_infos[totalObjCount].pb_alarm_type[j] = ObjInfo[i].pbAlarmType[j]; } ++totalObjCount; - if (totalObjCount >= MACDETECTOBJNUM) + if (totalObjCount >= macDetectObjNum * rect_num) { toObjCountBreak = true; break; @@ -117,7 +117,7 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio result->del_infos[totalDelCount].curPos.y_ = DelInfo[i].curPos.y + rect[k].top_; // ǰ result->del_infos[totalDelCount].trace.trace_num = DelInfo[i].trace.nTraceNum; // 켣״̬ - printf("del_infos nTraceNum = %d\n", DelInfo[i].trace.nTraceNum); + //printf("del_infos nTraceNum = %d\n", DelInfo[i].trace.nTraceNum); for (int j = 0; j < MAXTRACENUM; ++j) { result->del_infos[totalDelCount].trace.obj_trace[j].x_ = DelInfo[i].trace.pObjTrace[j].x + rect[k].left_; @@ -135,7 +135,7 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio result->del_infos[totalDelCount].pb_alarm_type[j] = DelInfo[i].pbAlarmType[j]; } ++totalDelCount; - if (totalDelCount >= MACDETECTOBJNUM) + if (totalDelCount >= macDetectObjNum * rect_num) { toDelCountBreak = true; break; diff --git a/src/left_over/RegionSurveillanceProcess.h b/src/left_over/RegionSurveillanceProcess.h index a7ea1b0..bdb6aa5 100644 --- a/src/left_over/RegionSurveillanceProcess.h +++ b/src/left_over/RegionSurveillanceProcess.h @@ -15,8 +15,8 @@ typedef struct rs_params bool filt_flag; int min_area; int max_area; - - rs_params() :mode(DEVICE_GPU), gpuid(0), min_area(0), max_area(1000000) {}; + int max_obj_num; + rs_params() :mode(DEVICE_GPU), gpuid(0), min_area(0), max_area(1000000), max_obj_num(0){}; }rs_params; class RegionSurveillanceProcess @@ -54,6 +54,7 @@ public: double scale; //int long_side; //int short_side; + int macDetectObjNum; rs_auth_type type; std::atomic thrd_run; int licence_status = -1; diff --git a/src/left_over/left_over_det.h b/src/left_over/left_over_det.h index 6ae51b1..1f52fcd 100644 --- a/src/left_over/left_over_det.h +++ b/src/left_over/left_over_det.h @@ -24,7 +24,6 @@ #define m_BOUNDING_BOX_RATEMIN 0.001 #define m_BOUNDING_BOX_RATEMAX 100 #define MAXROINUM 10 // ROI -#define MACDETECTOBJNUM 10 #ifdef __cplusplus extern "C" @@ -89,6 +88,7 @@ typedef enum rs_auth_type { typedef struct rs_param { long frame_num; //ʱ λ֡ + long max_obj_num; //ÿĿ double scale; //С sy_rect rect[MAXVERTEXNUM]; //Ч unsigned char rect_num; //Ч @@ -125,9 +125,9 @@ typedef struct ms_trace { typedef struct rs_result { int obj_count; - ms_object_info obj_infos[MACDETECTOBJNUM]; + ms_object_info * obj_infos; //ÿĿ * Ч int del_count; - ms_object_info del_infos[MACDETECTOBJNUM]; + ms_object_info * del_infos; //ÿĿ * Ч }rs_result; #endif /************************************************************************* diff --git a/src/left_over/ms_region_surveilance.cpp b/src/left_over/ms_region_surveilance.cpp index 3c58592..d73f5f3 100644 --- a/src/left_over/ms_region_surveilance.cpp +++ b/src/left_over/ms_region_surveilance.cpp @@ -152,7 +152,7 @@ int rs_init(void **handle, rs_param param) if (auth_type) { regin->frame_num = param.frame_num; - + regin->macDetectObjNum = param.max_obj_num; regin->scale = param.scale; regin->rect_num = param.rect_num; //Ч @@ -304,7 +304,7 @@ int rs_process(void *handle, sy_img img_data, rs_result *result) rs_params param; param.mode = 0; //ģʽ(DEVICE_GPU / DEVICE_CPU) param.gpuid = 0; //ָԿid - //㷨 糤̱ߵ + param.max_obj_num = regin->macDetectObjNum; //㷨 糤̱ߵ param.image = image; param.channel_deal = 1; diff --git a/src/left_over/svibe.cpp b/src/left_over/svibe.cpp index df728f4..a202f79 100644 --- a/src/left_over/svibe.cpp +++ b/src/left_over/svibe.cpp @@ -127,9 +127,9 @@ int RegionSurveillance::get_ArrowDir(CMPoint pROI0, CMPoint pROI1, CMPoint dir) *******************************************************************************/ int RegionSurveillance::RSinit(int nWidth, int nHeight, int widthstep, unsigned char* frameImgData, - int nChannel, int nChannel_deal, bool nfiltFlag, int minArea, int maxArea) + int nChannel, int nChannel_deal, bool nfiltFlag, int maxObjNum, int minArea, int maxArea) { - + macDetectObjNum = maxObjNum; if(nWidth < 600 || nHeight < 300) //ߴС ޸vibe VBPARAM = new VIBEPARAM(35, 18); else @@ -987,7 +987,7 @@ void RegionSurveillance::VibeModelErosion2(unsigned char* inputdata, unsigned ch output[j] = 0; output[(height - 1)*width + j] = 0; } - for (int i = 1; i MACDETECTOBJNUM ? MACDETECTOBJNUM : dwForegroundCount; - if (ForegroundArray.size() > MACDETECTOBJNUM) + dwForegroundCount = dwForegroundCount > macDetectObjNum ? macDetectObjNum : dwForegroundCount; + if (ForegroundArray.size() > macDetectObjNum) { size_t n = ForegroundArray.size(); - for (int i = 0; i < n - MACDETECTOBJNUM; ++i) + for (int i = 0; i < n - macDetectObjNum; ++i) { ForegroundArray.pop_back(); } diff --git a/src/left_over/svibe.h b/src/left_over/svibe.h index acbd2a0..66a6f74 100644 --- a/src/left_over/svibe.h +++ b/src/left_over/svibe.h @@ -75,7 +75,7 @@ public: void VibeModelUpdateC3(VibeModel_t *model, uint8_t *image, uint8_t *output); int RSinit(int nWidth, int nHeight, int widthstep, unsigned char* frameImgData, - int nChannel, int nChannel_deal, bool nfiltFlag, int minArea, int maxArea); //1 + int nChannel, int nChannel_deal, bool nfiltFlag, int maxObjNum, int minArea, int maxArea); //1 int VPTinit(int mode, int gpuid, float threshold); int RSRegion(int numROI, int alarm_info/*, bool iflog*/); //void vibeMask(int num, CMPoint *pPointList, bool *pRegion); @@ -134,6 +134,7 @@ private: int GlobelHeight; int GlobelWidthstep; std::list indexInWander; + int macDetectObjNum; //std::set indexInWander; CMPoint pStart, pEnd; //by zl ڴ洢ͨзͷ˵ diff --git a/src/test/demo.cpp b/src/test/demo.cpp index 1978918..c4a7ae9 100644 --- a/src/test/demo.cpp +++ b/src/test/demo.cpp @@ -59,12 +59,13 @@ void algorthim_thread1() { void imag_ana_3channels() { //AlarmInfo 1 2뿪 3Խ 4˫Խ 5ǻ 6 - + void *tools = nullptr; rs_param param; param.frame_num = 10; - param.scale = 1; - param.rect_num = 2; + param.scale = 2; + param.rect_num = 1; + param.max_obj_num = 2; { param.rect[1].left_ = 30; @@ -92,7 +93,7 @@ void imag_ana_3channels() char imgpath[260]; - CvCapture* video1 = cvCaptureFromFile("./test.mp4"); + CvCapture* video1 = cvCaptureFromFile("./convert.mp4"); // opencvȡƵһ֡ //IplImage * src = cvQueryFrame(video1); IplImage *src = cvQueryFrame(video1); @@ -114,6 +115,8 @@ void imag_ana_3channels() syimg.set_data(srcscale->width, srcscale->height, srcscale->nChannels, (unsigned char *)srcscale->imageData); rs_result result{}; + result.del_infos = new ms_object_info[param.max_obj_num * param.rect_num]{}; + result.obj_infos = new ms_object_info[param.max_obj_num * param.rect_num]{}; rs_process(tools, syimg, &result); if (result.del_count != 0) { @@ -176,6 +179,8 @@ void imag_ana_3channels() } + delete[] result.del_infos; + delete[] result.obj_infos; //cvWriteFrame(writer, srcscale); // ͼʾ -- libgit2 0.21.4