diff --git a/src/left_over/MSRegionSurveilanceCpu.cpp b/src/left_over/MSRegionSurveilanceCpu.cpp index f589bde..7358b5e 100644 --- a/src/left_over/MSRegionSurveilanceCpu.cpp +++ b/src/left_over/MSRegionSurveilanceCpu.cpp @@ -25,7 +25,8 @@ int IRegionSurveillanceCpu::rs_init(const rs_params ¶m) { int r = 0; IplImage * gray = cvCreateImage(cvSize(param.image.w_, param.image.h_), 8, 1); - cvSetData(gray, param.image.data_, param.image.w_); + memcpy(gray->imageData, param.image.data_, param.image.w_ * param.image.h_* param.image.c_); + //cvSetData(gray, param.image.data_, param.image.w_); for (int i = 0; i < rect_num; ++i) { IplImage * img = cvCreateImage(cvSize(rect[i].width_, rect[i].height_), 8, 1); @@ -35,7 +36,7 @@ int IRegionSurveillanceCpu::rs_init(const rs_params ¶m) (unsigned char*)(img->imageData), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.min_area, param.max_area); cvReleaseImage(&img); } - //cvReleaseImage(&gray); + cvReleaseImage(&gray); return r; } int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/) @@ -87,8 +88,11 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio int totalObjCount = 0; int totalDelCount = 0; + bool toObjCountBreak = false; + bool toDelCountBreak = false; IplImage * gray = cvCreateImage(cvSize(img_data.w_, img_data.h_), 8, 1); - cvSetData(gray, img_data.data_, img_data.w_); + memcpy(gray->imageData, img_data.data_, img_data.w_*img_data.h_ * img_data.c_); + //cvSetData(gray, img_data.data_, img_data.w_); for (int k = 0; k < rect_num; ++k) //int k = 0; { @@ -100,12 +104,13 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio auto * ObjInfo = new MS_ObjectInfo[ObjCount]; IReginCpu[k]->getObjectInfo(ObjCount, ObjInfo); - for (int i = 0; i < ObjCount; ++i) + for (int i = 0; i < ObjCount && !toObjCountBreak; ++i) { result->obj_infos[totalObjCount].curPos.x_ = ObjInfo[i].curPos.x+rect[k].left_; // 当前坐标 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); 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_; @@ -123,19 +128,26 @@ 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) + { + toObjCountBreak = true; + break; + } } - + cvReleaseImage(&img); delete ObjInfo; + auto delCount = IReginCpu[k]->getDeleteNum(); - auto * DelInfo = new MS_ObjectInfo[delCount]; + auto * DelInfo = new MS_ObjectInfo[delCount]{}; IReginCpu[k]->getDeleteInfo(delCount, DelInfo); - for (int i = 0; i < delCount; ++i) + for (int i = 0; i < delCount && !toDelCountBreak; ++i) { result->del_infos[totalDelCount].curPos.x_ = DelInfo[i].curPos.x + rect[k].left_; // 当前坐标 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); 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_; @@ -153,11 +165,17 @@ 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) + { + toDelCountBreak = true; + break; + } } delete DelInfo; } result->obj_count = totalObjCount; result->del_count = totalDelCount; + cvReleaseImage(&gray); return 1; } //int IRegionSurveillanceCpu::rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) diff --git a/src/left_over/RegionSurveillanceProcess.h b/src/left_over/RegionSurveillanceProcess.h index 715ff88..ddac83c 100644 --- a/src/left_over/RegionSurveillanceProcess.h +++ b/src/left_over/RegionSurveillanceProcess.h @@ -1,7 +1,7 @@ #pragma once //#include "MSRegionSurveilance.h" #include "left_over_det.h" -#include +//#include #include "head.h" #include //#include "MSRegionSurveilanceVpt.h" @@ -43,7 +43,7 @@ public: //int long_side; //int short_side; std::atomic thrd_run; - boost::thread thrd; + //boost::thread thrd; long frame_num = 0; bool init_flag = false; sy_rect rect[MAXVERTEXNUM]; //有效区域 diff --git a/src/left_over/ms_region_surveilance.cpp b/src/left_over/ms_region_surveilance.cpp index 4eb903e..3cde4b6 100644 --- a/src/left_over/ms_region_surveilance.cpp +++ b/src/left_over/ms_region_surveilance.cpp @@ -242,9 +242,12 @@ int rs_process(void *handle, sy_img img_data, rs_result *result) IplImage * gray = cvCreateImage(cvSize(srcscale->width, srcscale->height), 8, 1); cvCvtColor(srcscale, gray, CV_RGB2GRAY); + sy_img image; + unsigned char * data = (unsigned char *)malloc(gray->width*gray->height*gray->nChannels); + memcpy(data, gray->imageData, gray->width*gray->height*gray->nChannels); //image.set_data(srcImage.cols, srcImage.rows, srcImage.channels(), (unsigned char *)srcImage.data); - image.set_data(gray->width, gray->height, gray->nChannels, (unsigned char *)gray->imageData); + image.set_data(gray->width, gray->height, gray->nChannels, (unsigned char *)data); if (regin->init_flag == false) { rs_params param; @@ -258,11 +261,14 @@ int rs_process(void *handle, sy_img img_data, rs_result *result) param.min_area = 100; param.max_area = 1000000; regin->rs_init(param); + regin->init_flag = true; int ret = regin->rs_init_region(1, &pRegionInfo/*, false*/); - } + } + int ret = regin->rs_detect(image, &pRegionInfo, result); + for (int i = 0; i < result->obj_count; ++i) { result->obj_infos[i].curPos.x_ *= regin->scale; @@ -296,8 +302,10 @@ int rs_process(void *handle, sy_img img_data, rs_result *result) result->del_infos[i].tar_box.left_ *= regin->scale; result->del_infos[i].tar_box.top_ *= regin->scale; } + free(data); cvReleaseImage(&gray); cvReleaseImage(&srcscale); + //cvReleaseImage(&gray); //cvReleaseImage(&srcscale2); return ret; }