8805b950
Liu Meng
物品遗留效果优化
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
#include "MSRegionSurveilanceCpu.h"
int IRegionSurveillanceCpu::rs_init(const rs_param ¶m)
{
return IReginCpu->RSinit(param.image.w_, param.image.h_, param.image.w_,
(unsigned char*)(param.image.data_), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.min_area, param.max_area);
}
int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_infos, bool iflog)
{
//仅能初始化一个有效区域??? ------ update by mliu 20201129
//RegionInfo reginifos;
//reginifos.AlarmInfo = region_infos->alarm_stay; // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包
//reginifos.nPointNum = region_infos->point_num;
//for (int i = 0; i < MAXVERTEXNUM; ++i)
//{
// reginifos.pROI[i].x = region_infos->p_roi[i].x_;
// reginifos.pROI[i].y = region_infos->p_roi[i].y_;
//}
//CMPoint pROI[MAXVERTEXNUM];
//reginifos.nFrameNum = region_infos->frame_num;
//reginifos.dirPoint.x = region_infos->dir_point.x_;
//reginifos.dirPoint.y = region_infos->dir_point.y_;
//reginifos.finaldir = region_infos->finaldir;
//reginifos.ArrowStartPoint.x = region_infos->arrow_start_point.x_;
//reginifos.ArrowStartPoint.y = region_infos->arrow_start_point.y_;
//reginifos.ArrowEndPoint.x = region_infos->arrow_end_point.x_; //箭头的终止端点 箭头指向正方形
//reginifos.ArrowEndPoint.y = region_infos->arrow_end_point.y_; //箭头的终止端点 箭头指向正方形
//return IReginCpu->RSRegion(num_roi, ®inifos, iflog);
RegionInfo *reginifos = new RegionInfo[num_roi];
for (int i = 0; i < num_roi; i++)
{
reginifos[i].AlarmInfo = region_infos[i].alarm_stay; // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包
reginifos[i].nPointNum = region_infos[i].point_num;
for (int ii = 0; ii < MAXVERTEXNUM; ++ii)
{
reginifos[i].pROI[ii].x = region_infos[i].p_roi[ii].x_;
reginifos[i].pROI[ii].y = region_infos[i].p_roi[ii].y_;
}
reginifos[i].nFrameNum = region_infos[i].frame_num;
reginifos[i].dirPoint.x = region_infos[i].dir_point.x_;
reginifos[i].dirPoint.y = region_infos[i].dir_point.y_;
reginifos[i].finaldir = region_infos[i].finaldir;
reginifos[i].ArrowStartPoint.x = region_infos[i].arrow_start_point.x_;
reginifos[i].ArrowStartPoint.y = region_infos[i].arrow_start_point.y_;
reginifos[i].ArrowEndPoint.x = region_infos[i].arrow_end_point.x_; //箭头的终止端点 箭头指向正方形
reginifos[i].ArrowEndPoint.y = region_infos[i].arrow_end_point.y_; //箭头的终止端点 箭头指向正方形
}
return IReginCpu->RSRegion(num_roi, reginifos, iflog);
}
int IRegionSurveillanceCpu::rs_init_backgroud(const sy_img &img_data)
{
IReginCpu->RSinit_backgroud(img_data.w_, img_data.h_, img_data.c_, img_data.data_);
return 0;
}
int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* region_infos, int region_count, rs_result *result)
{
RegionInfo *reginifos = new RegionInfo[region_count];
for (int ii = 0; ii < region_count; ii++)
{
reginifos[ii].AlarmInfo = region_infos[ii].alarm_stay; // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包
reginifos[ii].nPointNum = region_infos[ii].point_num;
for (int i = 0; i < MAXVERTEXNUM; ++i)
{
reginifos[ii].pROI[i].x = region_infos[ii].p_roi[i].x_;
reginifos[ii].pROI[i].y = region_infos[ii].p_roi[i].y_;
}
CMPoint pROI[MAXVERTEXNUM];
reginifos[ii].nFrameNum = region_infos[ii].frame_num;
reginifos[ii].dirPoint.x = region_infos[ii].dir_point.x_;
reginifos[ii].dirPoint.y = region_infos[ii].dir_point.y_;
reginifos[ii].finaldir = region_infos[ii].finaldir;
reginifos[ii].ArrowStartPoint.x = region_infos[ii].arrow_start_point.x_;
reginifos[ii].ArrowStartPoint.y = region_infos[ii].arrow_start_point.y_;
reginifos[ii].ArrowEndPoint.x = region_infos[ii].arrow_end_point.x_; //箭头的终止端点 箭头指向正方形
reginifos[ii].ArrowEndPoint.y = region_infos[ii].arrow_end_point.y_; //箭头的终止端点 箭头指向正方形
}
IReginCpu->RSDetect((unsigned char*)(img_data.data_), reginifos);
auto ObjCount = IReginCpu->getObjectNum();
result->obj_count = ObjCount > MACDETECTOBJNUM ? MACDETECTOBJNUM : ObjCount;
auto * ObjInfo = new MS_ObjectInfo[ObjCount];
IReginCpu->getObjectInfo(ObjCount, ObjInfo);
for (int i = 0; i < ObjCount && i <MACDETECTOBJNUM; ++i)
{
result->obj_infos[i].curPos.x_ = ObjInfo[i].curPos.x; // 当前坐标
result->obj_infos[i].curPos.y_ = ObjInfo[i].curPos.y; // 当前坐标
result->obj_infos[i].trace.trace_num = ObjInfo[i].trace.nTraceNum; // 轨迹及报警状态
for (int j = 0; j < MAXTRACENUM; ++j)
{
result->obj_infos[i].trace.obj_trace[j].x_ = ObjInfo[i].trace.pObjTrace[j].x;
result->obj_infos[i].trace.obj_trace[j].y_ = ObjInfo[i].trace.pObjTrace[j].y;
}
result->obj_infos[i].unique_id = ObjInfo[i].UniqueID; // 当前目标的特点ID
result->obj_infos[i].tar_box.left_ = ObjInfo[i].TarBox.left; // 目标外接矩形
result->obj_infos[i].tar_box.top_ = ObjInfo[i].TarBox.top;
result->obj_infos[i].tar_box.height_ = ObjInfo[i].TarBox.Height();
result->obj_infos[i].tar_box.width_ = ObjInfo[i].TarBox.Width();
for (int j = 0; j < MAXROINUM; ++j)
{
result->obj_infos[i].pb_alarm_state[j] = ObjInfo[i].pbAlarmState[j];
for (int k = 0; k < ALARMTYPENUM; ++k)
{
result->obj_infos[i].pb_alarm_type[j][k] = ObjInfo[i].pbAlarmType[j][k];
}
}
}
if (reginifos)
{
delete[] reginifos;
reginifos = NULL;
}
return 0;
}
int IRegionSurveillanceCpu::rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir)
{
CMPoint pROI0;
pROI0.x = p_roi0.x_;
pROI0.y = p_roi0.y_;
CMPoint pROI1;
pROI1.x = p_roi1.x_;
pROI1.y = p_roi1.y_;
CMPoint pdir;
pdir.x = dir.x_;
pdir.y = dir.y_;
return IReginCpu->get_ArrowDir(pROI0, pROI1, pdir);
}
|