Commit a74689b77248633e4cd19ecc3254709c24408c4c
1 parent
e3429e30
海思
Showing
18 changed files
with
536 additions
and
1573 deletions
src/left_over/MSRegionSurveilance.cpp
@@ -7,8 +7,9 @@ | @@ -7,8 +7,9 @@ | ||
7 | IRegionSurveillance *MS_RegionSurveillance::GetMS_RS() | 7 | IRegionSurveillance *MS_RegionSurveillance::GetMS_RS() |
8 | { | 8 | { |
9 | 9 | ||
10 | - if (!MS_RS) | 10 | + //if (!MS_RS) |
11 | { | 11 | { |
12 | + RegionSurveillance * MS_RS = nullptr; | ||
12 | if (checkTime() == 1 && (MS_RS = new RegionSurveillance())) | 13 | if (checkTime() == 1 && (MS_RS = new RegionSurveillance())) |
13 | return MS_RS; | 14 | return MS_RS; |
14 | else | 15 | else |
@@ -25,7 +26,7 @@ void MS_RegionSurveillance::Destroy() | @@ -25,7 +26,7 @@ void MS_RegionSurveillance::Destroy() | ||
25 | { | 26 | { |
26 | if (MS_RS) | 27 | if (MS_RS) |
27 | { | 28 | { |
28 | - delete MS_RS; | 29 | + delete[] MS_RS; |
29 | MS_RS = NULL; | 30 | MS_RS = NULL; |
30 | } | 31 | } |
31 | } | 32 | } |
src/left_over/MSRegionSurveilance.h
@@ -17,6 +17,9 @@ | @@ -17,6 +17,9 @@ | ||
17 | #include <cmath> | 17 | #include <cmath> |
18 | #include <cstdlib> | 18 | #include <cstdlib> |
19 | #include "header.h" | 19 | #include "header.h" |
20 | +#include "ConExtraction.h" | ||
21 | +#include <list> | ||
22 | +#include <map> | ||
20 | using namespace std; | 23 | using namespace std; |
21 | 24 | ||
22 | #define MAXTRACENUM 200 //¹ì¼£×î´ó³¤¶È | 25 | #define MAXTRACENUM 200 //¹ì¼£×î´ó³¤¶È |
src/left_over/MSRegionSurveilanceBase.cpp deleted
1 | -#include "MSRegionSurveilanceBase.h" | ||
2 | - | ||
3 | -IRegionSurveillanceBase::IRegionSurveillanceBase() | ||
4 | -{ | ||
5 | - pRegion = nullptr; | ||
6 | - pAlarmInfo = nullptr; | ||
7 | -} | ||
8 | - | ||
9 | -int IRegionSurveillanceBase::rs_init(const rs_param & param) | ||
10 | -{ | ||
11 | - GlobelWidth = param.image.w_; | ||
12 | - GlobelHeight = param.image.h_; | ||
13 | - | ||
14 | - return init(param); | ||
15 | - | ||
16 | -} | ||
17 | - | ||
18 | -int IRegionSurveillanceBase::rs_init_region(int numROI, region_info* region_infos, bool iflog) | ||
19 | -{ | ||
20 | - fstream file;//用于输出日志 | ||
21 | - if (numROI > MAXROINUM) | ||
22 | - { | ||
23 | - return 0; | ||
24 | - } | ||
25 | - | ||
26 | - for (int i = 0; i < numROI; i++) | ||
27 | - { | ||
28 | - if (iflog) | ||
29 | - { | ||
30 | - file.open("log.txt", ios::app); | ||
31 | - file << i << ": "; | ||
32 | - printAlarmType(&file, region_infos[i].alarm_info); | ||
33 | - file << "P1(" << region_infos[i].p_roi[0].x_ << "," << region_infos[i].p_roi[0].y_ << "), P2(" | ||
34 | - << region_infos[i].p_roi[1].x_ << "," << region_infos[i].p_roi[1].y_ << ")"; | ||
35 | - } | ||
36 | - if (region_infos[i].alarm_info == 3) | ||
37 | - { | ||
38 | - region_infos[i].finaldir = rs_get_arrowdir(region_infos[i].p_roi[0], region_infos[i].p_roi[1], region_infos[i].dir_point);//确定方向计算,箭头端点坐标 | ||
39 | - | ||
40 | - if (iflog) | ||
41 | - file << ", DirPoint(" << region_infos[i].dir_point.x_ << "," << region_infos[i].dir_point.y_ << ")"; | ||
42 | - | ||
43 | - region_infos[i].arrow_start_point = pStart; //箭头的起始端点 箭头指向正方形 | ||
44 | - region_infos[i].arrow_end_point = pEnd; //箭头的终止端点 箭头指向正方形 | ||
45 | - } | ||
46 | - if (iflog) | ||
47 | - { | ||
48 | - file << endl; | ||
49 | - file.close(); | ||
50 | - } | ||
51 | - } | ||
52 | - | ||
53 | - m_numROI = numROI; | ||
54 | - if (pRegion == NULL) | ||
55 | - { | ||
56 | - pRegion = new bool*[MAXROINUM]; | ||
57 | - memset(pRegion, 0, sizeof(bool*) * MAXROINUM); | ||
58 | - } | ||
59 | - | ||
60 | - if (pAlarmInfo == NULL) | ||
61 | - { | ||
62 | - pAlarmInfo = new int[MAXROINUM]; | ||
63 | - memset(pAlarmInfo, 0, sizeof(int) * MAXROINUM); | ||
64 | - } | ||
65 | - | ||
66 | - for (int i = 0; i < MAXROINUM; i++) | ||
67 | - { | ||
68 | - if (pRegion[i] == NULL) | ||
69 | - { | ||
70 | - pRegion[i] = new bool[GlobelHeight * GlobelWidth]; | ||
71 | - } | ||
72 | - memset(pRegion[i], 0, sizeof(bool) * GlobelWidth * GlobelHeight); | ||
73 | - if (i <= m_numROI) | ||
74 | - { | ||
75 | - pAlarmInfo[i] = region_infos[i].alarm_info; | ||
76 | - } | ||
77 | - else | ||
78 | - { | ||
79 | - pAlarmInfo[i] = 0; | ||
80 | - } | ||
81 | - } | ||
82 | - | ||
83 | - | ||
84 | - // 对每一个待观察的ROI进行监测 | ||
85 | - for (int i = 0; i < numROI; i++) | ||
86 | - { | ||
87 | - // 对每一个感兴趣区域进行标志 感兴趣区域pRegion值为1 其余为0 | ||
88 | - vibeMask(region_infos[i].point_num, region_infos[i].p_roi, pRegion[i]); | ||
89 | - } | ||
90 | - | ||
91 | - return 1; | ||
92 | - | ||
93 | -} | ||
94 | - | ||
95 | -void IRegionSurveillanceBase::RSrelease() | ||
96 | -{ | ||
97 | - for (int i = 0; i < MAXROINUM; i++) | ||
98 | - { | ||
99 | - if (pRegion[i] != NULL) | ||
100 | - { | ||
101 | - delete[] pRegion[i]; | ||
102 | - } | ||
103 | - } | ||
104 | - | ||
105 | - if (pRegion != NULL) | ||
106 | - { | ||
107 | - delete[] pRegion; | ||
108 | - pRegion = NULL; | ||
109 | - } | ||
110 | - | ||
111 | - if (pAlarmInfo != NULL) | ||
112 | - { | ||
113 | - delete[] pAlarmInfo; | ||
114 | - pAlarmInfo = NULL; | ||
115 | - } | ||
116 | - release(); | ||
117 | - vec_traceinfo.clear(); | ||
118 | -} | ||
119 | - | ||
120 | -int IRegionSurveillanceBase::rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) | ||
121 | -{ | ||
122 | - | ||
123 | - float distance = (float)abs(p_roi0.y_ - p_roi1.y_); | ||
124 | - //获取方向 | ||
125 | - float k1, k2; //k1为原线段的斜率 | ||
126 | - | ||
127 | - if (p_roi0.y_ > p_roi1.y_) //在拌线靠近图像下方的端点处画箭头 | ||
128 | - { | ||
129 | - pStart.x_ = p_roi0.x_; | ||
130 | - pStart.y_ = p_roi0.y_; | ||
131 | - } | ||
132 | - else | ||
133 | - { | ||
134 | - pStart.x_ = p_roi1.x_; | ||
135 | - pStart.y_ = p_roi1.y_; | ||
136 | - } | ||
137 | - | ||
138 | - if (p_roi0.x_ != p_roi1.x_) //若不为一根垂直线 | ||
139 | - { | ||
140 | - k1 = (float)(p_roi0.y_ - p_roi1.y_) / (float)(p_roi0.x_ - p_roi1.x_); | ||
141 | - if (k1 != 0) //若不为一根平行线 | ||
142 | - { | ||
143 | - k2 = -1 / k1; | ||
144 | - | ||
145 | - | ||
146 | - float b = p_roi1.y_ - k1 * p_roi1.x_;//y = kx + b 坐标系一图像左上顶点为原点,向右为x正方形 向下为y正方向 | ||
147 | - if ((k1 < 0 && (float)((float)dir.y_ - k1 * (float)dir.x_ - b) < 0) || (k1 > 0 && (float)((float)dir.y_ - k1 * (float)dir.x_ - b) > 0)) | ||
148 | - { | ||
149 | - if (distance < 30) //当两点y值差异较小时,垂线比较陡 若减去20 可能导致箭头太长 | ||
150 | - { | ||
151 | - pEnd.x_ = pStart.x_ - 2; | ||
152 | - } | ||
153 | - else | ||
154 | - pEnd.x_ = pStart.x_ - 20; | ||
155 | - } | ||
156 | - else | ||
157 | - { | ||
158 | - if (distance < 30) | ||
159 | - { | ||
160 | - pEnd.x_ = pStart.x_ + 2; | ||
161 | - } | ||
162 | - else | ||
163 | - pEnd.x_ = pStart.x_ + 20; | ||
164 | - } | ||
165 | - pEnd.y_ = (int)((pEnd.x_ - pStart.x_) * k2 + pStart.y_); | ||
166 | - } | ||
167 | - else //若为水平线 | ||
168 | - { | ||
169 | - pEnd.x_ = pStart.x_; | ||
170 | - if (dir.y_ > pStart.y_) | ||
171 | - pEnd.y_ = pStart.y_ + 20; | ||
172 | - else | ||
173 | - pEnd.y_ = pStart.y_ - 20; | ||
174 | - | ||
175 | - } | ||
176 | - | ||
177 | - } | ||
178 | - else //若为垂直线 | ||
179 | - { | ||
180 | - pEnd.y_ = pStart.y_; | ||
181 | - if (dir.x_ > pStart.x_) | ||
182 | - pEnd.x_ = pStart.x_ + 20; | ||
183 | - else | ||
184 | - pEnd.x_ = pStart.x_ - 20; | ||
185 | - } | ||
186 | - //防止越界 | ||
187 | - pEnd.x_ = pEnd.x_ >= 0 ? pEnd.x_ : 0; | ||
188 | - pEnd.x_ = pEnd.x_ <= GlobelWidth ? pEnd.x_ : GlobelWidth; | ||
189 | - pEnd.y_ = pEnd.y_ >= 0 ? pEnd.y_ : 0; | ||
190 | - pEnd.y_ = pEnd.y_ <= GlobelHeight ? pEnd.y_ : GlobelHeight; | ||
191 | - | ||
192 | - if (p_roi0.x_ == p_roi1.x_) //若为垂直线 | ||
193 | - { | ||
194 | - if (pEnd.x_ > pStart.x_) | ||
195 | - return 1; | ||
196 | - else | ||
197 | - return 0; | ||
198 | - } | ||
199 | - else if (k1 <= 0) //若不为垂直线且斜率小于等于0(含水平线情况) | ||
200 | - { | ||
201 | - if ((pStart.x_ != pEnd.x_ && pEnd.x_ > pStart.x_) || (pStart.x_ == pEnd.x_ && pEnd.y_ > pStart.y_)) | ||
202 | - return 0; | ||
203 | - else | ||
204 | - return 1; | ||
205 | - } | ||
206 | - else | ||
207 | - { | ||
208 | - if ((pStart.x_ != pEnd.x_ && pEnd.x_ > pStart.x_) || (pStart.x_ == pEnd.x_ && pEnd.y_ > pStart.y_)) | ||
209 | - return 1; | ||
210 | - else | ||
211 | - return 0; | ||
212 | - } | ||
213 | -} | ||
214 | - | ||
215 | -void IRegionSurveillanceBase::vibeMask(int num, sy_point *pPointList, bool *pRegion) | ||
216 | -{ | ||
217 | - | ||
218 | - if (num == 2) | ||
219 | - { | ||
220 | - double s; | ||
221 | - int i, x, y; | ||
222 | - int xs, ys; | ||
223 | - int dx, dy; | ||
224 | - | ||
225 | - dx = pPointList[1].x_ - pPointList[0].x_; | ||
226 | - if (dx < 0) | ||
227 | - { | ||
228 | - dx = -dx; | ||
229 | - } | ||
230 | - dy = pPointList[1].y_ - pPointList[0].y_; | ||
231 | - if (dy < 0) | ||
232 | - { | ||
233 | - dy = -dy; | ||
234 | - } | ||
235 | - if (dy < dx) | ||
236 | - { | ||
237 | - //draw according to x-y | ||
238 | - s = (double)(pPointList[1].y_ - pPointList[0].y_) / (pPointList[1].x_ - pPointList[0].x_); | ||
239 | - | ||
240 | - if (pPointList[0].x_ < pPointList[1].x_) | ||
241 | - { | ||
242 | - xs = pPointList[0].x_; | ||
243 | - ys = pPointList[0].y_; | ||
244 | - } | ||
245 | - else | ||
246 | - { | ||
247 | - xs = pPointList[1].x_; | ||
248 | - ys = pPointList[1].y_; | ||
249 | - } | ||
250 | - | ||
251 | - for (i = 0; i <= dx; i++) | ||
252 | - { | ||
253 | - x = i + xs; | ||
254 | - y = (int)((double)i * s) + ys; | ||
255 | - if (x > -1 && x < GlobelWidth && y > -1 && y < GlobelHeight) | ||
256 | - { | ||
257 | - pRegion[GlobelWidth * y + x] = 1; | ||
258 | - } | ||
259 | - } | ||
260 | - } | ||
261 | - else | ||
262 | - { | ||
263 | - //draw according to y-x | ||
264 | - s = (double)(pPointList[1].x_ - pPointList[0].x_) / (pPointList[1].y_ - pPointList[0].y_); | ||
265 | - | ||
266 | - if (pPointList[0].y_ < pPointList[1].y_) | ||
267 | - { | ||
268 | - xs = pPointList[0].x_; | ||
269 | - ys = pPointList[0].y_; | ||
270 | - } | ||
271 | - else | ||
272 | - { | ||
273 | - xs = pPointList[1].x_; | ||
274 | - ys = pPointList[1].y_; | ||
275 | - } | ||
276 | - for (i = 0; i <= dy; i++) | ||
277 | - { | ||
278 | - y = i + ys; | ||
279 | - x = (int)((double)i * s) + xs; | ||
280 | - if (y > -1 && y < GlobelHeight && x > -1 && x < GlobelWidth) | ||
281 | - { | ||
282 | - pRegion[GlobelWidth * y + x] = 1; | ||
283 | - } | ||
284 | - } | ||
285 | - } | ||
286 | - } | ||
287 | - else if (num >= 3) | ||
288 | - { | ||
289 | - | ||
290 | - sy_point LineMin; | ||
291 | - sy_point LineMax; | ||
292 | - | ||
293 | - for (int k = 0; k < num; k++) | ||
294 | - { | ||
295 | - int startp = k; | ||
296 | - int endp = k + 1; | ||
297 | - | ||
298 | - if (startp == num - 1) | ||
299 | - { | ||
300 | - endp = 0; | ||
301 | - } | ||
302 | - | ||
303 | - if (abs(pPointList[startp].x_ - pPointList[endp].x_) >= abs(pPointList[startp].y_ - pPointList[endp].y_)) | ||
304 | - { | ||
305 | - if (pPointList[startp].x_ < pPointList[endp].x_) | ||
306 | - { | ||
307 | - LineMin = pPointList[startp]; | ||
308 | - LineMax = pPointList[endp]; | ||
309 | - for (int x = LineMin.x_; x <= LineMax.x_; x++) | ||
310 | - { | ||
311 | - int y = (int)(((LineMin.y_ - LineMax.y_) / (double)(LineMin.x_ - LineMax.x_)) * (double)(x - LineMin.x_) + 0.5 + (double)LineMin.y_); | ||
312 | - //pRegion[GlobelWidth * y + x] = 1; | ||
313 | - | ||
314 | - //原程序存在越界 苏晓芸修改如下 | ||
315 | - if (y > -1 && y < GlobelHeight && x > -1 && x < GlobelWidth) | ||
316 | - { | ||
317 | - pRegion[GlobelWidth * y + x] = 1; | ||
318 | - } | ||
319 | - } | ||
320 | - } | ||
321 | - else if (pPointList[startp].x_ > pPointList[endp].x_) | ||
322 | - { | ||
323 | - LineMin = pPointList[endp]; | ||
324 | - LineMax = pPointList[startp]; | ||
325 | - for (int x = LineMin.x_; x <= LineMax.x_; x++) | ||
326 | - { | ||
327 | - int y = (int)(((LineMin.y_ - LineMax.y_) / (double)(LineMin.x_ - LineMax.x_)) * (double)(x - LineMin.x_) + 0.5 + (double)LineMin.y_); | ||
328 | - //pRegion[GlobelWidth * y + x] = 1; | ||
329 | - | ||
330 | - //原程序存在越界 苏晓芸修改如下 | ||
331 | - if (y > -1 && y < GlobelHeight && x > -1 && x < GlobelWidth) | ||
332 | - { | ||
333 | - pRegion[GlobelWidth * y + x] = 1; | ||
334 | - } | ||
335 | - } | ||
336 | - } | ||
337 | - else | ||
338 | - { | ||
339 | - int YMin = (pPointList[startp].y_ < pPointList[endp].y_) ? pPointList[startp].y_ : pPointList[endp].y_; | ||
340 | - int YMax = (pPointList[startp].y_ < pPointList[endp].y_) ? pPointList[endp].y_ : pPointList[startp].y_; | ||
341 | - for (int i = YMin; i <= YMax; i++) | ||
342 | - { | ||
343 | - //pRegion[GlobelWidth * i + pPointList[startp].x_] = 1; | ||
344 | - | ||
345 | - //原程序存在越界 苏晓芸修改如下 | ||
346 | - if (i > -1 && i < GlobelHeight && pPointList[startp].x_ > -1 && pPointList[startp].x_ < GlobelWidth) | ||
347 | - { | ||
348 | - pRegion[GlobelWidth * i + pPointList[startp].x_] = 1; | ||
349 | - } | ||
350 | - } | ||
351 | - } | ||
352 | - } | ||
353 | - else | ||
354 | - { | ||
355 | - if (pPointList[startp].y_ < pPointList[endp].y_) | ||
356 | - { | ||
357 | - LineMin = pPointList[startp]; | ||
358 | - LineMax = pPointList[endp]; | ||
359 | - for (int y = LineMin.y_; y <= LineMax.y_; y++) | ||
360 | - { | ||
361 | - int x = (int)(((LineMin.x_ - LineMax.x_) / (double)(LineMin.y_ - LineMax.y_)) * (double)(y - LineMin.y_) + 0.5 + (double)LineMin.x_); | ||
362 | - //pRegion[GlobelWidth * y + x] = 1; | ||
363 | - | ||
364 | - //原程序存在越界 苏晓芸修改如下 | ||
365 | - if (y > -1 && y < GlobelHeight && x > -1 && x < GlobelWidth) | ||
366 | - { | ||
367 | - pRegion[GlobelWidth * y + x] = 1; | ||
368 | - } | ||
369 | - } | ||
370 | - } | ||
371 | - else if (pPointList[startp].y_ > pPointList[endp].y_) | ||
372 | - { | ||
373 | - LineMin = pPointList[endp]; | ||
374 | - LineMax = pPointList[startp]; | ||
375 | - for (int y = LineMin.y_; y <= LineMax.y_; y++) | ||
376 | - { | ||
377 | - int x = (int)(((LineMin.x_ - LineMax.x_) / (double)(LineMin.y_ - LineMax.y_)) * (double)(y - LineMin.y_) + 0.5 + (double)LineMin.x_); | ||
378 | - //pRegion[GlobelWidth * y + x] = 1; | ||
379 | - | ||
380 | - //原程序存在越界 苏晓芸修改如下 | ||
381 | - if (y > -1 && y < GlobelHeight && x > -1 && x < GlobelWidth) | ||
382 | - { | ||
383 | - pRegion[GlobelWidth * y + x] = 1; | ||
384 | - } | ||
385 | - } | ||
386 | - } | ||
387 | - else | ||
388 | - { | ||
389 | - int XMin = (pPointList[startp].x_ < pPointList[endp].x_) ? pPointList[startp].x_ : pPointList[endp].x_; | ||
390 | - int XMax = (pPointList[startp].x_ < pPointList[endp].x_) ? pPointList[endp].x_ : pPointList[startp].x_; | ||
391 | - for (int i = XMin; i <= XMax; i++) | ||
392 | - { | ||
393 | - //pRegion[GlobelWidth * pPointList[startp].y_ + i] = 1; | ||
394 | - | ||
395 | - //原程序存在越界 苏晓芸修改如下 | ||
396 | - if (pPointList[startp].y_ > -1 && pPointList[startp].y_ < GlobelHeight && i > -1 && i < GlobelWidth) | ||
397 | - { | ||
398 | - pRegion[GlobelWidth * pPointList[startp].y_ + i] = 1; | ||
399 | - } | ||
400 | - } | ||
401 | - } | ||
402 | - } | ||
403 | - } | ||
404 | - | ||
405 | - // 修改标记方式 将区域边缘标志置为0 | ||
406 | - for (int i = 0; i < GlobelHeight; i++) | ||
407 | - { | ||
408 | - for (int j = 0; j < GlobelWidth; j++) | ||
409 | - { | ||
410 | - if (pRegion[GlobelWidth * i + j] == 0) | ||
411 | - { | ||
412 | - pRegion[GlobelWidth * i + j] = 1; | ||
413 | - } | ||
414 | - else | ||
415 | - { | ||
416 | - pRegion[GlobelWidth * i + j] = 0; | ||
417 | - } | ||
418 | - } | ||
419 | - } | ||
420 | - | ||
421 | - sy_point StartPoint; | ||
422 | - int SumX = 0; | ||
423 | - int SumY = 0; | ||
424 | - for (int k = 0; k < num; k++) | ||
425 | - { | ||
426 | - SumX = SumX + pPointList[k].x_; | ||
427 | - SumY = SumY + pPointList[k].y_; | ||
428 | - } | ||
429 | - StartPoint.x_ = SumX / num; | ||
430 | - StartPoint.y_ = SumY / num; | ||
431 | - | ||
432 | - bool *pMaskMap = new bool[GlobelWidth * GlobelHeight]; | ||
433 | - bool *pMaskMapS = new bool[GlobelWidth * GlobelHeight]; | ||
434 | - memset(pMaskMap, 0, sizeof(bool) * GlobelWidth * GlobelHeight); | ||
435 | - memset(pMaskMapS, 0, sizeof(bool) * GlobelWidth * GlobelHeight); | ||
436 | - pMaskMap[GlobelWidth * StartPoint.y_ + StartPoint.x_] = 1; | ||
437 | - | ||
438 | - int msum = 1; | ||
439 | - while (msum != 0) | ||
440 | - { | ||
441 | - msum = 0; | ||
442 | - for (int i = 0; i < GlobelHeight; i++) | ||
443 | - { | ||
444 | - for (int j = 0; j < GlobelWidth; j++) | ||
445 | - { | ||
446 | - msum = msum + pMaskMap[GlobelWidth * i + j] - pMaskMapS[GlobelWidth * i + j]; | ||
447 | - pMaskMapS[GlobelWidth * i + j] = pMaskMap[GlobelWidth * i + j]; | ||
448 | - } | ||
449 | - } | ||
450 | - for (int i = 0; i < GlobelHeight; i++) | ||
451 | - { | ||
452 | - for (int j = 0; j < GlobelWidth; j++) | ||
453 | - { | ||
454 | - if ((i <= 0) || (i >= GlobelHeight - 1) || (j <= 0) || (j >= GlobelWidth - 1)) | ||
455 | - { | ||
456 | - continue; | ||
457 | - } | ||
458 | - | ||
459 | - if (pMaskMapS[GlobelWidth * i + j] == 1) | ||
460 | - { | ||
461 | - pMaskMap[GlobelWidth * i + j + 1] = 1; | ||
462 | - pMaskMap[GlobelWidth * i + j - 1] = 1; | ||
463 | - pMaskMap[GlobelWidth * (i + 1) + j] = 1; | ||
464 | - pMaskMap[GlobelWidth * (i - 1) + j] = 1; | ||
465 | - } | ||
466 | - } | ||
467 | - } | ||
468 | - for (int i = 0; i < GlobelHeight; i++) | ||
469 | - { | ||
470 | - for (int j = 0; j < GlobelWidth; j++) | ||
471 | - { | ||
472 | - pMaskMap[GlobelWidth * i + j] = pMaskMap[GlobelWidth * i + j] && pRegion[GlobelWidth * i + j]; | ||
473 | - } | ||
474 | - } | ||
475 | - } | ||
476 | - | ||
477 | - memcpy(pRegion, pMaskMap, sizeof(bool) * GlobelWidth * GlobelHeight); | ||
478 | - | ||
479 | - delete[] pMaskMap; | ||
480 | - delete[] pMaskMapS; | ||
481 | - } | ||
482 | -} | ||
483 | - | ||
484 | -/****************************************************************************** | ||
485 | -* Function: RSRegion | ||
486 | -* Description: 感兴趣区域设置 | ||
487 | -* Calls: vibeMask | ||
488 | -* Called By: main | ||
489 | -* Input: numROI ROI个数 | ||
490 | -pRegionInfo ROI区域 | ||
491 | -iflog true:输出日志 false:不输出日志 | ||
492 | -* Output: pRegion 10个ROI指针(bool)每个大小为(图像宽*图像高)感兴趣区域值为1 其余为0 | ||
493 | -//regionAlarm 10个ROI 报警标志(bool) | ||
494 | -pAlarmInfo 10个ROI 报警标志(int) | ||
495 | -* Return: 3 1 | ||
496 | -*******************************************************************************/ | ||
497 | -void IRegionSurveillanceBase::printAlarmType(std::fstream *file, int style) | ||
498 | -{ | ||
499 | - switch (style) | ||
500 | - { | ||
501 | - case 1: | ||
502 | - *file << "进入禁区, "; | ||
503 | - break; | ||
504 | - case 2: | ||
505 | - *file << "离开禁区, "; | ||
506 | - break; | ||
507 | - case 3: | ||
508 | - *file << "单向越界, "; | ||
509 | - break; | ||
510 | - case 4: | ||
511 | - *file << "双向越界, "; | ||
512 | - break; | ||
513 | - case 5: | ||
514 | - *file << "徘徊, "; | ||
515 | - break; | ||
516 | - case 6: | ||
517 | - *file << "丢包, "; | ||
518 | - break; | ||
519 | - default: | ||
520 | - break; | ||
521 | - } | ||
522 | -} | ||
523 | - | ||
524 | -void IRegionSurveillanceBase::AddTaskTracker(const int taskID, const double rWidth, const double rHeight) | ||
525 | -{ | ||
526 | - taskTrackers.TaskID = taskID; | ||
527 | - taskTrackers.ratioWidth = rWidth; | ||
528 | - taskTrackers.ratioHeight = rHeight; | ||
529 | -} | ||
530 | - | ||
531 | -void IRegionSurveillanceBase::AccessToRestrictedAreas(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result) //进入禁区 | ||
532 | -{ | ||
533 | - | ||
534 | - // 只要目标外接矩形有一个点进入区域则报警 | ||
535 | - for (int ii = 0; ii < m_numROI; ii++) //区域 | ||
536 | - { | ||
537 | - for (int i = 0; i < vptResult.objCount; ++i) //目标 | ||
538 | - { | ||
539 | - if (pRegion[ii][GlobelWidth * vptResult.obj[i].center_y + vptResult.obj[i].center_x] && \ | ||
540 | - pRegion[ii][GlobelWidth * vptResult.obj[i].center_y + vptResult.obj[i].center_x + 1] && \ | ||
541 | - pRegion[ii][GlobelWidth * vptResult.obj[i].center_y + vptResult.obj[i].center_x - 1] && \ | ||
542 | - pRegion[ii][GlobelWidth * (vptResult.obj[i].center_y + 1) + vptResult.obj[i].center_x] && \ | ||
543 | - pRegion[ii][GlobelWidth * (vptResult.obj[i].center_y - 1) + vptResult.obj[i].center_x]) | ||
544 | - { | ||
545 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
546 | - result->obj_infos[i].pb_alarm_type[ii] = 1; | ||
547 | - } | ||
548 | - | ||
549 | - } | ||
550 | - } | ||
551 | - return; | ||
552 | -} | ||
553 | - | ||
554 | -void IRegionSurveillanceBase::LeaveTheRestrictedAreas(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result) //离开禁区 | ||
555 | -{ | ||
556 | - for (int ii = 0; ii < m_numROI; ii++) //区域 | ||
557 | - { | ||
558 | - for (int i = 0; i < vptResult.objCount; ++i) //目标 | ||
559 | - { | ||
560 | - int tar_size = result->obj_infos[i].trace.trace_num; | ||
561 | - if (tar_size > 4) | ||
562 | - { | ||
563 | - sy_point PredictionPoint; | ||
564 | - PredictionPoint.x_ = vptResult.obj[i].center_x - result->obj_infos[i].trace.obj_trace[tar_size - 4].x_ + vptResult.obj[i].center_x; | ||
565 | - PredictionPoint.y_ = vptResult.obj[i].center_y - result->obj_infos[i].trace.obj_trace[tar_size - 4].y_ + vptResult.obj[i].center_y; | ||
566 | - if (pRegion[ii][GlobelWidth * vptResult.obj[i].bottom + vptResult.obj[i].left] || \ | ||
567 | - pRegion[ii][GlobelWidth * vptResult.obj[i].top + vptResult.obj[i].left] || \ | ||
568 | - pRegion[ii][GlobelWidth * vptResult.obj[i].top + vptResult.obj[i].right] || \ | ||
569 | - pRegion[ii][GlobelWidth * vptResult.obj[i].bottom + vptResult.obj[i].right]) | ||
570 | - { | ||
571 | - if (pRegion[ii][GlobelWidth * vptResult.obj[i].center_y + vptResult.obj[i].center_x] == false && | ||
572 | - pRegion[ii][GlobelWidth * PredictionPoint.y_ + PredictionPoint.x_] == false) | ||
573 | - { | ||
574 | - bool flag = 0; | ||
575 | - int j; | ||
576 | - | ||
577 | - j = tar_size - 1; | ||
578 | - while (j >= 0 && j >= tar_size - (vptResult.obj[i].right - vptResult.obj[i].left) / 2) | ||
579 | - { | ||
580 | - if (pRegion[ii][GlobelWidth * (int)(result->obj_infos[i].trace.obj_trace[j].y_) + (result->obj_infos[i].trace.obj_trace[j].x_)]) | ||
581 | - { | ||
582 | - flag = 1; | ||
583 | - break; | ||
584 | - } | ||
585 | - | ||
586 | - j--; | ||
587 | - } | ||
588 | - if (flag == 1) | ||
589 | - { | ||
590 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
591 | - result->obj_infos[i].pb_alarm_type[ii] = 2; | ||
592 | - return; | ||
593 | - } | ||
594 | - } | ||
595 | - | ||
596 | - | ||
597 | - } | ||
598 | - } | ||
599 | - | ||
600 | - | ||
601 | - | ||
602 | - } | ||
603 | - } | ||
604 | - return; | ||
605 | -} | ||
606 | - | ||
607 | -void IRegionSurveillanceBase::OneWayCrossBorder(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result) //单向越界 | ||
608 | -{ | ||
609 | - for (int ii = 0; ii < m_numROI; ii++) //区域 | ||
610 | - { | ||
611 | - for (int i = 0; i < vptResult.objCount; ++i) //目标 | ||
612 | - { | ||
613 | - int tar_size = result->obj_infos[i].trace.trace_num; | ||
614 | - for (int iy = vptResult.obj[i].top; iy <= vptResult.obj[i].bottom; iy++) | ||
615 | - { | ||
616 | - for (int ix = vptResult.obj[i].left; ix <= vptResult.obj[i].right; ix++) | ||
617 | - { | ||
618 | - if (pRegion[ii][GlobelWidth * iy + ix] && tar_size >= 4) | ||
619 | - { | ||
620 | - int point_x, point_y; | ||
621 | - point_x = result->obj_infos[i].trace.obj_trace[tar_size - 4].x_; | ||
622 | - point_y = result->obj_infos[i].trace.obj_trace[tar_size - 4].y_; | ||
623 | - if (ii >= 0 && ii < m_numROI && region_infos[ii].point_num >= 2) | ||
624 | - { | ||
625 | - if (abs(region_infos[ii].p_roi[0].x_ - region_infos[ii].p_roi[1].x_) >= 1) | ||
626 | - { | ||
627 | - double k, b; | ||
628 | - k = (double)(region_infos[ii].p_roi[0].y_ - region_infos[ii].p_roi[1].y_) / (region_infos[ii].p_roi[0].x_ - region_infos[ii].p_roi[1].x_); | ||
629 | - b = (double)(region_infos[ii].p_roi[0].x_ * region_infos[ii].p_roi[1].y_ - region_infos[ii].p_roi[1].x_ * region_infos[ii].p_roi[0].y_) / | ||
630 | - (region_infos[ii].p_roi[0].x_ - region_infos[ii].p_roi[1].x_); | ||
631 | - | ||
632 | - double dist_c, dist_p; | ||
633 | - | ||
634 | - dist_c = fabs(k * result->obj_infos[i].trace.obj_trace[tar_size - 1].x_ - result->obj_infos[i].trace.obj_trace[tar_size - 1].y_ + b) / sqrt(k * k + 1.0); | ||
635 | - dist_p = fabs(k * point_x - point_y + b) / sqrt(k * k + 1.0); | ||
636 | - | ||
637 | - if (abs(dist_c - dist_p) < 10) | ||
638 | - { | ||
639 | - int pre_index = tar_size - 5; | ||
640 | - while (pre_index >= 0) | ||
641 | - { | ||
642 | - point_x = result->obj_infos[i].trace.obj_trace[pre_index].x_; | ||
643 | - point_y = result->obj_infos[i].trace.obj_trace[pre_index].y_; | ||
644 | - dist_p = fabs(k * point_x - point_y + b) / sqrt(k * k + 1.0); | ||
645 | - pre_index = pre_index - 1; | ||
646 | - if (abs(dist_c - dist_p) >= 10) | ||
647 | - { | ||
648 | - break; | ||
649 | - } | ||
650 | - } | ||
651 | - } | ||
652 | - | ||
653 | - | ||
654 | - if (abs(dist_c - dist_p) < 10) | ||
655 | - { | ||
656 | - result->obj_infos[i].pb_alarm_state[ii] = false; | ||
657 | - result->obj_infos[i].pb_alarm_type[ii] = 0; | ||
658 | - return; | ||
659 | - } | ||
660 | - | ||
661 | - bool flag_c, flag_p; | ||
662 | - if (k * result->obj_infos[i].trace.obj_trace[tar_size - 1].x_ + b >= result->obj_infos[i].trace.obj_trace[tar_size - 1].y_) | ||
663 | - { | ||
664 | - flag_c = 1; | ||
665 | - } | ||
666 | - else | ||
667 | - { | ||
668 | - flag_c = 0; | ||
669 | - } | ||
670 | - | ||
671 | - if (k *point_x + b >= point_y) | ||
672 | - { | ||
673 | - flag_p = 1; | ||
674 | - } | ||
675 | - else | ||
676 | - { | ||
677 | - flag_p = 0; | ||
678 | - } | ||
679 | - | ||
680 | - | ||
681 | - //if (region_infos[ii].dir == 1) | ||
682 | - if (region_infos[ii].finaldir == 1) //by zl 20150914 | ||
683 | - { | ||
684 | - if (flag_c * flag_p == 1) | ||
685 | - { | ||
686 | - if (dist_c <= dist_p) | ||
687 | - { | ||
688 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
689 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
690 | - return; | ||
691 | - } | ||
692 | - } | ||
693 | - else if (flag_c == 0 && flag_p == 1) | ||
694 | - { | ||
695 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
696 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
697 | - return; | ||
698 | - } | ||
699 | - else if (flag_c == 0 && flag_p == 0) | ||
700 | - { | ||
701 | - if (dist_p <= dist_c) | ||
702 | - { | ||
703 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
704 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
705 | - return; | ||
706 | - } | ||
707 | - } | ||
708 | - | ||
709 | - } | ||
710 | - else | ||
711 | - { | ||
712 | - if (flag_c == 0 && flag_p == 0) | ||
713 | - { | ||
714 | - if (dist_c <= dist_p) | ||
715 | - { | ||
716 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
717 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
718 | - return; | ||
719 | - } | ||
720 | - } | ||
721 | - else if (flag_c == 1 && flag_p == 0) | ||
722 | - { | ||
723 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
724 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
725 | - return; | ||
726 | - } | ||
727 | - else if (flag_c == 1 && flag_p == 1) | ||
728 | - { | ||
729 | - if (dist_p <= dist_c) | ||
730 | - { | ||
731 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
732 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
733 | - return; | ||
734 | - } | ||
735 | - } | ||
736 | - } | ||
737 | - } | ||
738 | - else | ||
739 | - { | ||
740 | - double k, b; | ||
741 | - k = 0; | ||
742 | - b = (double)(region_infos[ii].p_roi[0].x_); | ||
743 | - | ||
744 | - double dist_c, dist_p; | ||
745 | - | ||
746 | - dist_c = fabs(result->obj_infos[i].trace.obj_trace[tar_size - 1].x_ - b); | ||
747 | - dist_p = fabs(point_x - b); | ||
748 | - | ||
749 | - if (abs(dist_c - dist_p) < 10) | ||
750 | - { | ||
751 | - int pre_index = tar_size - 5; | ||
752 | - while (pre_index >= 0) | ||
753 | - { | ||
754 | - point_x = result->obj_infos[i].trace.obj_trace[pre_index].x_; | ||
755 | - dist_p = fabs(point_x - b); | ||
756 | - pre_index = pre_index - 1; | ||
757 | - if (abs(dist_c - dist_p) >= 10) | ||
758 | - { | ||
759 | - break; | ||
760 | - } | ||
761 | - } | ||
762 | - } | ||
763 | - | ||
764 | - bool flag_c, flag_p; | ||
765 | - if (result->obj_infos[i].trace.obj_trace[tar_size - 1].x_ >= b) | ||
766 | - { | ||
767 | - flag_c = 1; | ||
768 | - } | ||
769 | - else | ||
770 | - { | ||
771 | - flag_c = 0; | ||
772 | - } | ||
773 | - | ||
774 | - if (point_x >= b) | ||
775 | - { | ||
776 | - flag_p = 1; | ||
777 | - } | ||
778 | - else | ||
779 | - { | ||
780 | - flag_p = 0; | ||
781 | - } | ||
782 | - | ||
783 | - if (abs(dist_c - dist_p) < 10) | ||
784 | - { | ||
785 | - result->obj_infos[i].pb_alarm_state[ii] = false; | ||
786 | - result->obj_infos[i].pb_alarm_type[ii] = 0; | ||
787 | - return; | ||
788 | - } | ||
789 | - //if (region_infos[ii].dir == 1) | ||
790 | - if (region_infos[ii].finaldir == 1) //by zl 20150914 | ||
791 | - { | ||
792 | - if (flag_c * flag_p == 1) | ||
793 | - { | ||
794 | - if (dist_c <= dist_p) | ||
795 | - { | ||
796 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
797 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
798 | - return; | ||
799 | - } | ||
800 | - } | ||
801 | - else if (flag_c == 0 && flag_p == 1) | ||
802 | - { | ||
803 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
804 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
805 | - return; | ||
806 | - } | ||
807 | - else if (flag_c == 0 && flag_p == 0) | ||
808 | - { | ||
809 | - if (dist_p <= dist_c) | ||
810 | - { | ||
811 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
812 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
813 | - return; | ||
814 | - } | ||
815 | - } | ||
816 | - | ||
817 | - } | ||
818 | - else | ||
819 | - { | ||
820 | - if (flag_c == 0 && flag_p == 0) | ||
821 | - { | ||
822 | - if (dist_c <= dist_p) | ||
823 | - { | ||
824 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
825 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
826 | - return; | ||
827 | - } | ||
828 | - } | ||
829 | - else if (flag_c == 1 && flag_p == 0) | ||
830 | - { | ||
831 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
832 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
833 | - return; | ||
834 | - } | ||
835 | - else if (flag_c == 1 && flag_p == 1) | ||
836 | - { | ||
837 | - if (dist_p <= dist_c) | ||
838 | - { | ||
839 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
840 | - result->obj_infos[i].pb_alarm_type[ii] = 3; | ||
841 | - return; | ||
842 | - } | ||
843 | - } | ||
844 | - } | ||
845 | - | ||
846 | - | ||
847 | - } | ||
848 | - } | ||
849 | - } | ||
850 | - } | ||
851 | - } | ||
852 | - } | ||
853 | - } | ||
854 | - return; | ||
855 | -} | ||
856 | - | ||
857 | -void IRegionSurveillanceBase::TwoWayCrossBorder(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result) //双向越界 | ||
858 | -{ | ||
859 | - // 只要目标外接矩形有一个点进入区域则报警 | ||
860 | - for (int ii = 0; ii < m_numROI; ii++) //区域 | ||
861 | - { | ||
862 | - for (int i = 0; i < vptResult.objCount; ++i) //目标 | ||
863 | - { | ||
864 | - for (int iy = vptResult.obj[i].top; iy <= vptResult.obj[i].bottom; iy++) | ||
865 | - { | ||
866 | - for (int ix = vptResult.obj[i].left; ix <= vptResult.obj[i].right; ix++) | ||
867 | - { | ||
868 | - if (pRegion[ii][GlobelWidth * iy + ix]) | ||
869 | - { | ||
870 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
871 | - result->obj_infos[i].pb_alarm_type[ii] = 4; | ||
872 | - } | ||
873 | - } | ||
874 | - } | ||
875 | - } | ||
876 | - } | ||
877 | - return; | ||
878 | -} | ||
879 | - | ||
880 | -void IRegionSurveillanceBase::WanderMonitoring(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result) //徘徊 | ||
881 | -{ | ||
882 | - for (int ii = 0; ii < m_numROI; ii++) //区域 | ||
883 | - { | ||
884 | - for (int i = 0; i < vptResult.objCount; ++i) //目标 | ||
885 | - { | ||
886 | - bool flag = 0; | ||
887 | - if ((pRegion[ii][GlobelWidth * vptResult.obj[i].bottom + vptResult.obj[i].left] || \ | ||
888 | - pRegion[ii][GlobelWidth * vptResult.obj[i].top + vptResult.obj[i].left] || \ | ||
889 | - pRegion[ii][GlobelWidth * vptResult.obj[i].top + vptResult.obj[i].right] || \ | ||
890 | - pRegion[ii][GlobelWidth * vptResult.obj[i].bottom + vptResult.obj[i].right]) && (pRegion[ii][GlobelWidth * vptResult.obj[i].center_y + vptResult.obj[i].center_x])) | ||
891 | - { | ||
892 | - if (mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr == 0) | ||
893 | - { | ||
894 | - mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr = 1; | ||
895 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame = 0; | ||
896 | - } | ||
897 | - else | ||
898 | - { | ||
899 | - if (mp_stayinfo[ii][vptResult.obj[i].id].lastFrame <= 5) | ||
900 | - { | ||
901 | - mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr++; | ||
902 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame = 0; | ||
903 | - } | ||
904 | - else | ||
905 | - { | ||
906 | - mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr = 0; | ||
907 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame = 0; | ||
908 | - | ||
909 | - } | ||
910 | - } | ||
911 | - if (mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr >= region_infos[ii].frame_num) | ||
912 | - { | ||
913 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
914 | - result->obj_infos[i].pb_alarm_type[ii] = 5; | ||
915 | - flag = 1; | ||
916 | - } | ||
917 | - | ||
918 | - } | ||
919 | - if (flag == 0) | ||
920 | - { | ||
921 | - result->obj_infos[i].pb_alarm_state[ii] = false; | ||
922 | - result->obj_infos[i].pb_alarm_type[ii] = 0; | ||
923 | - | ||
924 | - } | ||
925 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame++; | ||
926 | - } | ||
927 | - } | ||
928 | - return; | ||
929 | -} | ||
930 | - | ||
931 | -void IRegionSurveillanceBase::StayMonitoring(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result) //丢包 | ||
932 | -{ | ||
933 | - for (int ii = 0; ii < m_numROI; ii++) //区域 | ||
934 | - { | ||
935 | - for (int i = 0; i < vptResult.objCount; ++i) //目标 | ||
936 | - { | ||
937 | - int tar_size = result->obj_infos[i].trace.trace_num; | ||
938 | - int cur_dis; | ||
939 | - bool flag = 0; | ||
940 | - if (pRegion[ii][GlobelWidth * vptResult.obj[i].bottom + vptResult.obj[i].left] || \ | ||
941 | - pRegion[ii][GlobelWidth * vptResult.obj[i].top + vptResult.obj[i].left] || \ | ||
942 | - pRegion[ii][GlobelWidth * vptResult.obj[i].top + vptResult.obj[i].right] || \ | ||
943 | - pRegion[ii][GlobelWidth * vptResult.obj[i].bottom + vptResult.obj[i].right]) | ||
944 | - { | ||
945 | - if (pRegion[ii][GlobelWidth * vptResult.obj[i].center_y + vptResult.obj[i].center_x]) | ||
946 | - { | ||
947 | - if (mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr == 0) | ||
948 | - { | ||
949 | - mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr = 1; | ||
950 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame = 0; | ||
951 | - } | ||
952 | - else | ||
953 | - { | ||
954 | - if (tar_size >= 2) | ||
955 | - { | ||
956 | - cur_dis = (result->obj_infos[i].trace.obj_trace[tar_size - 1].x_ - result->obj_infos[i].trace.obj_trace[tar_size - 2].x_)*(result->obj_infos[i].trace.obj_trace[tar_size - 1].x_ - result->obj_infos[i].trace.obj_trace[tar_size - 2].x_) + | ||
957 | - (result->obj_infos[i].trace.obj_trace[tar_size - 1].y_ - result->obj_infos[i].trace.obj_trace[tar_size - 2].y_)*(result->obj_infos[i].trace.obj_trace[tar_size - 1].y_ - result->obj_infos[i].trace.obj_trace[tar_size - 2].y_); | ||
958 | - } | ||
959 | - else | ||
960 | - { | ||
961 | - cur_dis = 0; | ||
962 | - } | ||
963 | - if (mp_stayinfo[ii][vptResult.obj[i].id].lastFrame <= 5 && cur_dis <= tar_size * tar_size) | ||
964 | - { | ||
965 | - mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr++; | ||
966 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame = 0; | ||
967 | - } | ||
968 | - else | ||
969 | - { | ||
970 | - mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr = 0; | ||
971 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame = 0; | ||
972 | - } | ||
973 | - } | ||
974 | - if (mp_stayinfo[ii][vptResult.obj[i].id].nFrameCurr >= region_infos[ii].frame_num) | ||
975 | - { | ||
976 | - result->obj_infos[i].pb_alarm_state[ii] = true; | ||
977 | - result->obj_infos[i].pb_alarm_type[ii] = 6; | ||
978 | - } | ||
979 | - } | ||
980 | - } | ||
981 | - if (flag == 0) | ||
982 | - { | ||
983 | - result->obj_infos[i].pb_alarm_state[ii] = false; | ||
984 | - result->obj_infos[i].pb_alarm_type[ii] = 0; | ||
985 | - } | ||
986 | - mp_stayinfo[ii][vptResult.obj[i].id].lastFrame++; | ||
987 | - } | ||
988 | - } | ||
989 | - return; | ||
990 | -} | ||
991 | - | ||
992 | -int IRegionSurveillanceBase::rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result) | ||
993 | -{ | ||
994 | - | ||
995 | - VPT_Result vptResult; | ||
996 | - | ||
997 | - detect(img_data, vptResult); | ||
998 | - for (int i = 0; i < vptResult.objCount; i++) //更新轨迹 | ||
999 | - { | ||
1000 | - bool matching = false; | ||
1001 | - for (auto &item : vec_traceinfo) | ||
1002 | - { | ||
1003 | - if (item.id == vptResult.obj[i].id) | ||
1004 | - { | ||
1005 | - if (item.num < MAXTRACENUM) | ||
1006 | - { | ||
1007 | - ++item.num; | ||
1008 | - sy_point point; | ||
1009 | - point.x_ = vptResult.obj[i].center_x; | ||
1010 | - point.y_ = vptResult.obj[i].center_y; | ||
1011 | - item.trace_obj.push_back(point); | ||
1012 | - } | ||
1013 | - else | ||
1014 | - { | ||
1015 | - sy_point point; | ||
1016 | - point.x_ = vptResult.obj[i].center_x; | ||
1017 | - point.y_ = vptResult.obj[i].center_y; | ||
1018 | - item.trace_obj.push_back(point); | ||
1019 | - item.trace_obj.pop_front(); | ||
1020 | - } | ||
1021 | - matching = true; | ||
1022 | - } | ||
1023 | - } | ||
1024 | - if (matching == false) | ||
1025 | - { | ||
1026 | - TraceInfo traceinf; | ||
1027 | - traceinf.id = vptResult.obj[i].id; | ||
1028 | - traceinf.num = 1; | ||
1029 | - sy_point point; | ||
1030 | - point.x_ = vptResult.obj[i].center_x; | ||
1031 | - point.y_ = vptResult.obj[i].center_y; | ||
1032 | - traceinf.trace_obj.push_back(point); | ||
1033 | - vec_traceinfo.push_back(traceinf); | ||
1034 | - } | ||
1035 | - } | ||
1036 | - | ||
1037 | - | ||
1038 | - result->obj_count = vptResult.objCount; | ||
1039 | - for (int i = 0; i < result->obj_count; i++) | ||
1040 | - { | ||
1041 | - memset(result->obj_infos[i].pb_alarm_state, 0, MAXROINUM * sizeof(bool)); | ||
1042 | - memset(result->obj_infos[i].pb_alarm_type, 0, MAXROINUM * sizeof(int)); | ||
1043 | - result->obj_infos[i].tar_box.left_ = vptResult.obj[i].left; | ||
1044 | - result->obj_infos[i].tar_box.top_ = vptResult.obj[i].top; | ||
1045 | - result->obj_infos[i].tar_box.width_ = vptResult.obj[i].right - vptResult.obj[i].left; | ||
1046 | - result->obj_infos[i].tar_box.height_ = vptResult.obj[i].bottom - vptResult.obj[i].top; | ||
1047 | - | ||
1048 | - result->obj_infos[i].curPos.x_ = vptResult.obj[i].center_x; | ||
1049 | - result->obj_infos[i].curPos.y_ = vptResult.obj[i].center_y; | ||
1050 | - result->obj_infos[i].unique_id = vptResult.obj[i].id; | ||
1051 | - for (auto &item : vec_traceinfo) | ||
1052 | - { | ||
1053 | - if (item.id == vptResult.obj[i].id) | ||
1054 | - { | ||
1055 | - result->obj_infos[i].trace.trace_num = item.num; | ||
1056 | - for (int j = 0; j < item.num; ++j) | ||
1057 | - { | ||
1058 | - result->obj_infos[i].trace.obj_trace[j] = item.trace_obj[j]; | ||
1059 | - } | ||
1060 | - } | ||
1061 | - } | ||
1062 | - | ||
1063 | - } | ||
1064 | - | ||
1065 | - for (int i = 0; i < m_numROI; i++) | ||
1066 | - { | ||
1067 | - // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包 | ||
1068 | - switch (pAlarmInfo[i]) | ||
1069 | - { | ||
1070 | - case 1: | ||
1071 | - AccessToRestrictedAreas(vptResult, region_infos, result); //进入禁区 | ||
1072 | - break; | ||
1073 | - case 2: | ||
1074 | - LeaveTheRestrictedAreas(vptResult, region_infos, result); //离开禁区 | ||
1075 | - break; | ||
1076 | - case 3: | ||
1077 | - OneWayCrossBorder(vptResult, region_infos, result); //单向越界 | ||
1078 | - break; | ||
1079 | - case 4: | ||
1080 | - TwoWayCrossBorder(vptResult, region_infos, result); //双向越界 | ||
1081 | - break; | ||
1082 | - case 5: | ||
1083 | - WanderMonitoring(vptResult, region_infos, result); //徘徊 | ||
1084 | - break; | ||
1085 | - case 6: | ||
1086 | - StayMonitoring(vptResult, region_infos, result); //丢包 | ||
1087 | - break; | ||
1088 | - default: | ||
1089 | - break; | ||
1090 | - } | ||
1091 | - | ||
1092 | - } | ||
1093 | - return 0; | ||
1094 | -} | ||
1095 | \ No newline at end of file | 0 | \ No newline at end of file |
src/left_over/MSRegionSurveilanceBase.h deleted
1 | -#pragma once | ||
2 | -#include "header.h" | ||
3 | - | ||
4 | -#include "RegionSurveillanceProcess.h" | ||
5 | -#include <fstream> | ||
6 | -#include "Sort.h" | ||
7 | -#include <map> | ||
8 | -#define MAX_OBJ_COUNT 100 | ||
9 | -struct TaskTracker | ||
10 | -{ | ||
11 | - int TaskID; | ||
12 | - double ratioWidth; | ||
13 | - double ratioHeight; | ||
14 | - Sort tracker; | ||
15 | -}; | ||
16 | - | ||
17 | -typedef struct VPT_Result | ||
18 | -{ | ||
19 | - int objCount; | ||
20 | - VPT_ObjInfo obj[MAX_OBJ_COUNT]; | ||
21 | -}VPT_Result; | ||
22 | - | ||
23 | -class IRegionSurveillanceBase : public RegionSurveillanceProcess { | ||
24 | -public: | ||
25 | - IRegionSurveillanceBase(); | ||
26 | - | ||
27 | - // 模型初始化 | ||
28 | - virtual int rs_init(const rs_param & param) override; | ||
29 | - // ROI区域初始化 | ||
30 | - virtual int rs_init_region(int numROI, region_info* region_infos, bool iflog) override; | ||
31 | - //// 每一帧图像检测 | ||
32 | - int rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result)override; | ||
33 | - ////计算方向和箭头绘制的两个端点 | ||
34 | - virtual int rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) override; | ||
35 | -protected: | ||
36 | - void vibeMask(int num, sy_point *pPointList, bool *pRegion); | ||
37 | - void printAlarmType(std::fstream *file, int style); | ||
38 | - void AddTaskTracker(const int taskID, const double rWidth, const double rHeight); | ||
39 | -/***************************************处理函数**********************************************************/ | ||
40 | - void AccessToRestrictedAreas(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result); //进入禁区 | ||
41 | - void LeaveTheRestrictedAreas(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result); //离开禁区 | ||
42 | - void OneWayCrossBorder(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result); //单向越界 | ||
43 | - void TwoWayCrossBorder(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result); //双向越界 | ||
44 | - void WanderMonitoring(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result); //徘徊 | ||
45 | - void StayMonitoring(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result); //丢包 | ||
46 | -/**********************************************************************************************************/ | ||
47 | - virtual int init(const rs_param & param) = 0; //回调子类初始化模块 | ||
48 | - virtual int detect(const sy_img &img_data, VPT_Result & vptResult) = 0; //回调子类获取人车物检测,头肩检测信息 //回调子类人车物检测或头肩检测 | ||
49 | - virtual void release() = 0; //回调子类用于释放 | ||
50 | -private: | ||
51 | - | ||
52 | - void RSrelease(); | ||
53 | -protected: | ||
54 | - struct TraceInfo | ||
55 | - { | ||
56 | - unsigned int id; //目标唯一id | ||
57 | - unsigned int num; //目标轨迹长度 | ||
58 | - std::deque<sy_point> trace_obj; //目标轨迹点集合 | ||
59 | - }; | ||
60 | - std::vector<TraceInfo> vec_traceinfo; | ||
61 | - struct StayInfo | ||
62 | - { | ||
63 | - long nFrameCurr; // 记录当前逗留帧数 | ||
64 | - int lastFrame; // 上次监测到逗留距离当前的帧数 | ||
65 | - }; | ||
66 | - std::map<unsigned int, std::map<unsigned int, StayInfo>> mp_stayinfo; //区域索引, 目标唯一id, 目标逗留帧数 | ||
67 | - int GlobelWidth = 0; | ||
68 | - int GlobelHeight = 0; | ||
69 | - TaskTracker taskTrackers; | ||
70 | - sy_point pStart, pEnd; //by zl 用于存储可通行方向箭头的两个端点 | ||
71 | - int m_numROI = 0; | ||
72 | - bool** pRegion; | ||
73 | - int* pAlarmInfo; | ||
74 | -private: | ||
75 | - | ||
76 | - | ||
77 | -}; |
src/left_over/MSRegionSurveilanceCpu.cpp
1 | #include "MSRegionSurveilanceCpu.h" | 1 | #include "MSRegionSurveilanceCpu.h" |
2 | #include "head.h" | 2 | #include "head.h" |
3 | +#include <opencv2/opencv.hpp> | ||
4 | +#include <opencv2/opencv.hpp> | ||
5 | +#include <opencv2/core/core.hpp> | ||
6 | +#include <opencv2/highgui/highgui_c.h> | ||
7 | + | ||
8 | +bool Screenshot(IplImage* src, IplImage* dst, sy_rect t) | ||
9 | +{ | ||
10 | + | ||
11 | + CvRect rect; | ||
12 | + rect.x = t.left_; | ||
13 | + rect.y = t.top_; | ||
14 | + rect.width = t.width_; | ||
15 | + rect.height = t.height_; | ||
16 | + cvSetImageROI(src, rect); | ||
17 | + cvCopy(src, dst, 0); | ||
18 | + cvResetImageROI(src); | ||
19 | + //cvNamedWindow("Image", 1);//创建窗口 | ||
20 | + //cvShowImage("Image", dst);//显示图像 | ||
21 | + //cvWaitKey(0); //等待按键 | ||
22 | + return 0; | ||
23 | +} | ||
3 | int IRegionSurveillanceCpu::rs_init(const rs_params ¶m) | 24 | int IRegionSurveillanceCpu::rs_init(const rs_params ¶m) |
4 | { | 25 | { |
5 | - return IReginCpu->RSinit(param.image.w_, param.image.h_, param.image.w_, | ||
6 | - (unsigned char*)(param.image.data_), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.min_area, param.max_area); | 26 | + int r = 0; |
27 | + IplImage * gray = cvCreateImage(cvSize(param.image.w_, param.image.h_), 8, 1); | ||
28 | + cvSetData(gray, param.image.data_, param.image.w_); | ||
29 | + for (int i = 0; i < rect_num; ++i) | ||
30 | + { | ||
31 | + IplImage * img = cvCreateImage(cvSize(rect[i].width_, rect[i].height_), 8, 1); | ||
32 | + Screenshot(gray, img, rect[i]); | ||
33 | + //cv::Mat roi_img = cv::src_img(Range(0, 100), Range(50, 200)); | ||
34 | + r = IReginCpu[i]->RSinit(img->width, img->height, img->width, | ||
35 | + (unsigned char*)(img->imageData), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.min_area, param.max_area); | ||
36 | + cvReleaseImage(&img); | ||
37 | + } | ||
38 | + //cvReleaseImage(&gray); | ||
39 | + return r; | ||
7 | } | 40 | } |
8 | int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/) | 41 | int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/) |
9 | { | 42 | { |
@@ -24,7 +57,12 @@ int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_info | @@ -24,7 +57,12 @@ int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_info | ||
24 | //reginifos.ArrowStartPoint.y = region_infos->arrow_start_point.y_; | 57 | //reginifos.ArrowStartPoint.y = region_infos->arrow_start_point.y_; |
25 | //reginifos.ArrowEndPoint.x = region_infos->arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 | 58 | //reginifos.ArrowEndPoint.x = region_infos->arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 |
26 | //reginifos.ArrowEndPoint.y = region_infos->arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 | 59 | //reginifos.ArrowEndPoint.y = region_infos->arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 |
27 | - return IReginCpu->RSRegion(num_roi, region_infos->alarm_info/*, iflog*/); | 60 | + int r = 0; |
61 | + for (int i = 0; i < rect_num; ++i) | ||
62 | + { | ||
63 | + r = IReginCpu[i]->RSRegion(num_roi, region_infos->alarm_info/*, iflog*/); | ||
64 | + } | ||
65 | + return r; | ||
28 | } | 66 | } |
29 | int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result) | 67 | int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result) |
30 | { | 68 | { |
@@ -45,75 +83,93 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio | @@ -45,75 +83,93 @@ int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* regio | ||
45 | //reginifos.ArrowStartPoint.y = region_infos->arrow_start_point.y_; | 83 | //reginifos.ArrowStartPoint.y = region_infos->arrow_start_point.y_; |
46 | //reginifos.ArrowEndPoint.x = region_infos->arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 | 84 | //reginifos.ArrowEndPoint.x = region_infos->arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 |
47 | //reginifos.ArrowEndPoint.y = region_infos->arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 | 85 | //reginifos.ArrowEndPoint.y = region_infos->arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 |
48 | - IReginCpu->RSDetect((unsigned char*)(img_data.data_), ®inifos); | ||
49 | - auto ObjCount = IReginCpu->getObjectNum(); | ||
50 | - result->obj_count = ObjCount; | ||
51 | - auto * ObjInfo = new MS_ObjectInfo[ObjCount]; | ||
52 | - IReginCpu->getObjectInfo(ObjCount, ObjInfo); | ||
53 | - for (int i = 0; i < ObjCount; ++i) | ||
54 | - { | ||
55 | - result->obj_infos[i].curPos.x_ = ObjInfo[i].curPos.x; // 当前坐标 | ||
56 | - result->obj_infos[i].curPos.y_ = ObjInfo[i].curPos.y; // 当前坐标 | ||
57 | 86 | ||
58 | - result->obj_infos[i].trace.trace_num = ObjInfo[i].trace.nTraceNum; // 轨迹及报警状态 | ||
59 | - for (int j = 0; j < MAXTRACENUM; ++j) | ||
60 | - { | ||
61 | - result->obj_infos[i].trace.obj_trace[j].x_ = ObjInfo[i].trace.pObjTrace[j].x; | ||
62 | - result->obj_infos[i].trace.obj_trace[j].y_ = ObjInfo[i].trace.pObjTrace[j].y; | ||
63 | - } | ||
64 | 87 | ||
65 | - result->obj_infos[i].unique_id = ObjInfo[i].UniqueID; // 当前目标的特点ID | ||
66 | - result->obj_infos[i].tar_box.left_ = ObjInfo[i].TarBox.left; // 目标外接矩形 | ||
67 | - result->obj_infos[i].tar_box.top_ = ObjInfo[i].TarBox.top; | ||
68 | - result->obj_infos[i].tar_box.height_ = ObjInfo[i].TarBox.Height(); | ||
69 | - result->obj_infos[i].tar_box.width_ = ObjInfo[i].TarBox.Width(); | ||
70 | - for (int j = 0; j < MAXROINUM; ++j) | ||
71 | - { | ||
72 | - result->obj_infos[i].pb_alarm_state[j] = ObjInfo[i].pbAlarmState[j]; | ||
73 | - result->obj_infos[i].pb_alarm_type[j] = ObjInfo[i].pbAlarmType[j]; | ||
74 | - } | ||
75 | - } | ||
76 | - delete ObjInfo; | ||
77 | - auto delCount = IReginCpu->getDeleteNum(); | ||
78 | - result->del_count = delCount; | ||
79 | - auto * DelInfo = new MS_ObjectInfo[delCount]; | ||
80 | - IReginCpu->getDeleteInfo(delCount, DelInfo); | ||
81 | - for (int i = 0; i < delCount; ++i) | 88 | + int totalObjCount = 0; |
89 | + int totalDelCount = 0; | ||
90 | + IplImage * gray = cvCreateImage(cvSize(img_data.w_, img_data.h_), 8, 1); | ||
91 | + cvSetData(gray, img_data.data_, img_data.w_); | ||
92 | + for (int k = 0; k < rect_num; ++k) | ||
93 | + //int k = 0; | ||
82 | { | 94 | { |
83 | - result->del_infos[i].curPos.x_ = DelInfo[i].curPos.x; // 当前坐标 | ||
84 | - result->del_infos[i].curPos.y_ = DelInfo[i].curPos.y; // 当前坐标 | 95 | + IplImage * img = cvCreateImage(cvSize(rect[k].width_, rect[k].height_), 8, 1); |
96 | + Screenshot(gray, img, rect[k]); | ||
97 | + //cv::Mat roi_img = cv::src_img(Range(0, 100), Range(50, 200)); | ||
98 | + IReginCpu[k]->RSDetect((unsigned char*)(img->imageData), ®inifos); | ||
99 | + auto ObjCount = IReginCpu[k]->getObjectNum(); | ||
85 | 100 | ||
86 | - result->del_infos[i].trace.trace_num = DelInfo[i].trace.nTraceNum; // 轨迹及报警状态 | ||
87 | - for (int j = 0; j < MAXTRACENUM; ++j) | 101 | + auto * ObjInfo = new MS_ObjectInfo[ObjCount]; |
102 | + IReginCpu[k]->getObjectInfo(ObjCount, ObjInfo); | ||
103 | + for (int i = 0; i < ObjCount; ++i) | ||
88 | { | 104 | { |
89 | - result->del_infos[i].trace.obj_trace[j].x_ = DelInfo[i].trace.pObjTrace[j].x; | ||
90 | - result->del_infos[i].trace.obj_trace[j].y_ = DelInfo[i].trace.pObjTrace[j].y; | 105 | + result->obj_infos[totalObjCount].curPos.x_ = ObjInfo[i].curPos.x+rect[k].left_; // 当前坐标 |
106 | + result->obj_infos[totalObjCount].curPos.y_ = ObjInfo[i].curPos.y+rect[k].top_; // 当前坐标 | ||
107 | + | ||
108 | + result->obj_infos[totalObjCount].trace.trace_num = ObjInfo[i].trace.nTraceNum; // 轨迹及报警状态 | ||
109 | + for (int j = 0; j < MAXTRACENUM; ++j) | ||
110 | + { | ||
111 | + result->obj_infos[totalObjCount].trace.obj_trace[j].x_ = ObjInfo[i].trace.pObjTrace[j].x+rect[k].left_; | ||
112 | + result->obj_infos[totalObjCount].trace.obj_trace[j].y_ = ObjInfo[i].trace.pObjTrace[j].y+rect[k].top_; | ||
113 | + } | ||
114 | + | ||
115 | + result->obj_infos[totalObjCount].unique_id = ObjInfo[i].UniqueID; // 当前目标的特点ID | ||
116 | + result->obj_infos[totalObjCount].tar_box.left_ = ObjInfo[i].TarBox.left+rect[k].left_; // 目标外接矩形 | ||
117 | + result->obj_infos[totalObjCount].tar_box.top_ = ObjInfo[i].TarBox.top+rect[k].top_; | ||
118 | + result->obj_infos[totalObjCount].tar_box.height_ = ObjInfo[i].TarBox.Height(); | ||
119 | + result->obj_infos[totalObjCount].tar_box.width_ = ObjInfo[i].TarBox.Width(); | ||
120 | + for (int j = 0; j < MAXROINUM; ++j) | ||
121 | + { | ||
122 | + result->obj_infos[totalObjCount].pb_alarm_state[j] = ObjInfo[i].pbAlarmState[j]; | ||
123 | + result->obj_infos[totalObjCount].pb_alarm_type[j] = ObjInfo[i].pbAlarmType[j]; | ||
124 | + } | ||
125 | + ++totalObjCount; | ||
91 | } | 126 | } |
127 | + | ||
128 | + delete ObjInfo; | ||
129 | + auto delCount = IReginCpu[k]->getDeleteNum(); | ||
92 | 130 | ||
93 | - result->del_infos[i].unique_id = DelInfo[i].UniqueID; // 当前目标的特点ID | ||
94 | - result->del_infos[i].tar_box.left_ = DelInfo[i].TarBox.left; // 目标外接矩形 | ||
95 | - result->del_infos[i].tar_box.top_ = DelInfo[i].TarBox.top; | ||
96 | - result->del_infos[i].tar_box.height_ = DelInfo[i].TarBox.Height(); | ||
97 | - result->del_infos[i].tar_box.width_ = DelInfo[i].TarBox.Width(); | ||
98 | - for (int j = 0; j < MAXROINUM; ++j) | 131 | + auto * DelInfo = new MS_ObjectInfo[delCount]; |
132 | + IReginCpu[k]->getDeleteInfo(delCount, DelInfo); | ||
133 | + for (int i = 0; i < delCount; ++i) | ||
99 | { | 134 | { |
100 | - result->del_infos[i].pb_alarm_state[j] = DelInfo[i].pbAlarmState[j]; | ||
101 | - result->del_infos[i].pb_alarm_type[j] = DelInfo[i].pbAlarmType[j]; | 135 | + result->del_infos[totalDelCount].curPos.x_ = DelInfo[i].curPos.x + rect[k].left_; // 当前坐标 |
136 | + result->del_infos[totalDelCount].curPos.y_ = DelInfo[i].curPos.y + rect[k].top_; // 当前坐标 | ||
137 | + | ||
138 | + result->del_infos[totalDelCount].trace.trace_num = DelInfo[i].trace.nTraceNum; // 轨迹及报警状态 | ||
139 | + for (int j = 0; j < MAXTRACENUM; ++j) | ||
140 | + { | ||
141 | + result->del_infos[totalDelCount].trace.obj_trace[j].x_ = DelInfo[i].trace.pObjTrace[j].x + rect[k].left_; | ||
142 | + result->del_infos[totalDelCount].trace.obj_trace[j].y_ = DelInfo[i].trace.pObjTrace[j].y + rect[k].top_; | ||
143 | + } | ||
144 | + | ||
145 | + result->del_infos[totalDelCount].unique_id = DelInfo[i].UniqueID; // 当前目标的特点ID | ||
146 | + result->del_infos[totalDelCount].tar_box.left_ = DelInfo[i].TarBox.left + rect[k].left_; // 目标外接矩形 | ||
147 | + result->del_infos[totalDelCount].tar_box.top_ = DelInfo[i].TarBox.top + rect[k].top_; | ||
148 | + result->del_infos[totalDelCount].tar_box.height_ = DelInfo[i].TarBox.Height(); | ||
149 | + result->del_infos[totalDelCount].tar_box.width_ = DelInfo[i].TarBox.Width(); | ||
150 | + for (int j = 0; j < MAXROINUM; ++j) | ||
151 | + { | ||
152 | + result->del_infos[totalDelCount].pb_alarm_state[j] = DelInfo[i].pbAlarmState[j]; | ||
153 | + result->del_infos[totalDelCount].pb_alarm_type[j] = DelInfo[i].pbAlarmType[j]; | ||
154 | + } | ||
155 | + ++totalDelCount; | ||
102 | } | 156 | } |
157 | + delete DelInfo; | ||
103 | } | 158 | } |
104 | - delete DelInfo; | 159 | + result->obj_count = totalObjCount; |
160 | + result->del_count = totalDelCount; | ||
105 | return 1; | 161 | return 1; |
106 | } | 162 | } |
107 | -int IRegionSurveillanceCpu::rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) | ||
108 | -{ | ||
109 | - CMPoint pROI0; | ||
110 | - pROI0.x = p_roi0.x_; | ||
111 | - pROI0.y = p_roi0.y_; | ||
112 | - CMPoint pROI1; | ||
113 | - pROI1.x = p_roi1.x_; | ||
114 | - pROI1.y = p_roi1.y_; | ||
115 | - CMPoint pdir; | ||
116 | - pdir.x = dir.x_; | ||
117 | - pdir.y = dir.y_; | ||
118 | - return IReginCpu->get_ArrowDir(pROI0, pROI1, pdir); | ||
119 | -} | ||
120 | \ No newline at end of file | 163 | \ No newline at end of file |
164 | +//int IRegionSurveillanceCpu::rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) | ||
165 | +//{ | ||
166 | +// CMPoint pROI0; | ||
167 | +// pROI0.x = p_roi0.x_; | ||
168 | +// pROI0.y = p_roi0.y_; | ||
169 | +// CMPoint pROI1; | ||
170 | +// pROI1.x = p_roi1.x_; | ||
171 | +// pROI1.y = p_roi1.y_; | ||
172 | +// CMPoint pdir; | ||
173 | +// pdir.x = dir.x_; | ||
174 | +// pdir.y = dir.y_; | ||
175 | +// return IReginCpu->get_ArrowDir(pROI0, pROI1, pdir); | ||
176 | +//} | ||
121 | \ No newline at end of file | 177 | \ No newline at end of file |
src/left_over/MSRegionSurveilanceCpu.h
@@ -7,18 +7,26 @@ class IRegionSurveillanceCpu: public RegionSurveillanceProcess { | @@ -7,18 +7,26 @@ class IRegionSurveillanceCpu: public RegionSurveillanceProcess { | ||
7 | public: | 7 | public: |
8 | IRegionSurveillanceCpu() | 8 | IRegionSurveillanceCpu() |
9 | { | 9 | { |
10 | - IReginCpu = MS1.GetMS_RS(); | 10 | + for(int i = 0; i < MAXVERTEXNUM; ++i ) |
11 | + IReginCpu[i] = MS1.GetMS_RS(); | ||
11 | }; | 12 | }; |
12 | ~IRegionSurveillanceCpu() | 13 | ~IRegionSurveillanceCpu() |
13 | { | 14 | { |
14 | - IReginCpu->RSrelease(); | ||
15 | - MS1.Destroy(); | 15 | + for (int i = 0; i < MAXVERTEXNUM; ++i) |
16 | + { | ||
17 | + IReginCpu[i]->RSrelease(); | ||
18 | + delete IReginCpu[i]; | ||
19 | + } | ||
20 | + | ||
21 | + //MS1.Destroy(); | ||
16 | }; | 22 | }; |
17 | int rs_init(const rs_params ¶m); | 23 | int rs_init(const rs_params ¶m); |
18 | int rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/); | 24 | int rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/); |
19 | int rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result); | 25 | int rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result); |
20 | - int rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir); | 26 | + //int rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir); |
21 | private: | 27 | private: |
22 | MS_RegionSurveillance MS1; | 28 | MS_RegionSurveillance MS1; |
23 | - IRegionSurveillance * IReginCpu; | 29 | + IRegionSurveillance * IReginCpu[MAXVERTEXNUM]; |
30 | + | ||
31 | + | ||
24 | }; | 32 | }; |
25 | \ No newline at end of file | 33 | \ No newline at end of file |
src/left_over/MSRegionSurveilanceHst.cpp deleted
1 | -#include "MSRegionSurveilanceHst.h" | ||
2 | -#include "head_shoulder_det.h" | ||
3 | -#include "sy_errorinfo.h" | ||
4 | -#include <cuda.h> | ||
5 | -#include <cuda_runtime.h> | ||
6 | - | ||
7 | - | ||
8 | -int IRegionSurveillanceHst::init(const rs_param & param) | ||
9 | -{ | ||
10 | - hs_det_param hsparam; | ||
11 | - hsparam.gpuid = 0; | ||
12 | - hsparam.mode = DEVICE_GPU; | ||
13 | - hsparam.thresld = 0.5; | ||
14 | - hsparam.engine = ENGINE_MCAFFE2; | ||
15 | - hsparam.max_batch = 10; | ||
16 | - hsparam.trt_serialize_file = "HSD"; | ||
17 | - if (hs_det_init(&hst_handle, &hsparam)) | ||
18 | - { | ||
19 | - printf("hs_det_init failed!\n"); | ||
20 | - return VPT_DET_INIT_ERROR; | ||
21 | - } | ||
22 | - printf("finish init hst\n"); | ||
23 | - AddTaskTracker(0, 1, 1); | ||
24 | - return 0; | ||
25 | -} | ||
26 | - | ||
27 | -int IRegionSurveillanceHst::detect(const sy_img &img_data, VPT_Result & vptResult) | ||
28 | -{ | ||
29 | - vector<int> deleteObjectID; | ||
30 | - hs_det_result * hsresult = new hs_det_result{}; | ||
31 | - hsresult->objcount = 0; | ||
32 | - sy_img batch_img_gpu; | ||
33 | - unsigned char * data = NULL; | ||
34 | - cudaMalloc(&data, img_data.w_ *img_data.h_*img_data.c_ * sizeof(unsigned char)); | ||
35 | - cudaMemcpy(data, img_data.data_, img_data.w_ *img_data.h_ * img_data.c_ * sizeof(unsigned char), cudaMemcpyHostToDevice); | ||
36 | - batch_img_gpu.set_data(img_data.w_, img_data.h_, img_data.c_, data); | ||
37 | - auto ret = hs_det_process_batch(hst_handle, &batch_img_gpu, 1, hsresult); | ||
38 | - cudaFree(data); | ||
39 | - std::vector<std::vector<float>> detectResult; | ||
40 | - for (int c = 0; c < hsresult->objcount&& c < MAX_OBJ_COUNT; c++) | ||
41 | - { | ||
42 | - vector <float> obj; | ||
43 | - | ||
44 | - obj.push_back(hsresult->objinfo[c].left); | ||
45 | - obj.push_back(hsresult->objinfo[c].top); | ||
46 | - obj.push_back(hsresult->objinfo[c].right); | ||
47 | - obj.push_back(hsresult->objinfo[c].bottom); | ||
48 | - obj.push_back(hsresult->objinfo[c].confidence); | ||
49 | - obj.push_back(0); | ||
50 | - detectResult.push_back(obj); | ||
51 | - } | ||
52 | - | ||
53 | - int objCount = taskTrackers.tracker.update(/*tools->param.w*/img_data.w_* taskTrackers.ratioWidth, /*tools->param.h*/img_data.h_* taskTrackers.ratioHeight, true, detectResult, vptResult.obj, deleteObjectID); | ||
54 | - vptResult.objCount = objCount; | ||
55 | - delete hsresult; | ||
56 | - return ret; | ||
57 | -} | ||
58 | - | ||
59 | -void IRegionSurveillanceHst::release() | ||
60 | -{ | ||
61 | - //1.VPT RELEASE | ||
62 | - if (hst_handle) | ||
63 | - { | ||
64 | - hs_det_release(&hst_handle); | ||
65 | - hst_handle = NULL; | ||
66 | - } | ||
67 | -} | ||
68 | \ No newline at end of file | 0 | \ No newline at end of file |
src/left_over/MSRegionSurveilanceHst.h deleted
1 | -#pragma once | ||
2 | -#include "MSRegionSurveilanceBase.h" | ||
3 | - | ||
4 | - | ||
5 | -class IRegionSurveillanceHst : public IRegionSurveillanceBase { | ||
6 | -public: | ||
7 | - | ||
8 | - | ||
9 | -private: | ||
10 | - | ||
11 | - virtual int init(const rs_param & param) override; | ||
12 | - virtual int detect(const sy_img &img_data, VPT_Result & vptResult) override; | ||
13 | - virtual void release() override; | ||
14 | - | ||
15 | -private: | ||
16 | - void * hst_handle; | ||
17 | - | ||
18 | - | ||
19 | -}; |
src/left_over/MSRegionSurveilanceVpt.cpp deleted
1 | -#include "MSRegionSurveilanceVpt.h" | ||
2 | -#include "vpt.h" | ||
3 | -#include "sy_errorinfo.h" | ||
4 | -#include <cuda.h> | ||
5 | -#include <cuda_runtime.h> | ||
6 | - | ||
7 | - | ||
8 | - | ||
9 | - | ||
10 | - | ||
11 | - | ||
12 | - | ||
13 | - | ||
14 | -int IRegionSurveillanceVpt::init(const rs_param & param) | ||
15 | -{ | ||
16 | - vpt_param vptparam; | ||
17 | - vptparam.mode = DEVICE_GPU; | ||
18 | - vptparam.gpuid = 0; | ||
19 | - vptparam.threshold = 0.6; | ||
20 | - vptparam.engine = ENGINE_TENSORRT; | ||
21 | - vptparam.preprocess_param = | ||
22 | - "CopyData_CPU2GPU_U8;" | ||
23 | - "TypeConvert_U8_F32;" | ||
24 | - "ResizePad_F32_F32,test_size,720,test_max_size,1280,fpn_coarsest_stride,32," | ||
25 | - "submean_b,103.94,submean_g,116.78,submean_r,123.68," | ||
26 | - "variance_rev_b,0.017,variance_rev_g,0.017,variance_rev_r,0.017;" | ||
27 | - "NHWC2NCHW_F32" | ||
28 | - ; | ||
29 | - vptparam.serialize_file = "FPN_VPT"; | ||
30 | - vptparam.max_batch = 20; | ||
31 | - if (vpt_init(&vpt_handle, vptparam) != 0) | ||
32 | - { | ||
33 | - printf("vpt_init failed!\n"); | ||
34 | - return VPT_DET_INIT_ERROR; | ||
35 | - } | ||
36 | - printf("finish init vpt\n"); | ||
37 | - AddTaskTracker(0, 1, 1); | ||
38 | - return 0; | ||
39 | -} | ||
40 | - | ||
41 | - | ||
42 | - | ||
43 | - | ||
44 | - | ||
45 | - | ||
46 | -int IRegionSurveillanceVpt::detect(const sy_img &img_data, VPT_Result & vptResult) | ||
47 | -{ | ||
48 | - vector<int> deleteObjectID; | ||
49 | - vpt_result * vptresult = new vpt_result{}; | ||
50 | - vptresult->obj_count_ = 0; | ||
51 | - vptresult->obj_results_ = new vpt_obj_result[MAX_DET_COUNT]; | ||
52 | - sy_img batch_img_gpu; | ||
53 | - unsigned char * data = NULL; | ||
54 | - cudaMalloc(&data, img_data.w_ *img_data.h_*img_data.c_ * sizeof(unsigned char)); | ||
55 | - cudaMemcpy(data, img_data.data_, img_data.w_ *img_data.h_ * img_data.c_ * sizeof(unsigned char), cudaMemcpyHostToDevice); | ||
56 | - batch_img_gpu.set_data(img_data.w_, img_data.h_, img_data.c_, data); | ||
57 | - auto ret = vpt_batch(vpt_handle, &batch_img_gpu, 1, &vptresult); | ||
58 | - cudaFree(data); | ||
59 | - std::vector<std::vector<float>> detectResult; | ||
60 | - for (int c = 0; c < vptresult->obj_count_&& c < MAX_OBJ_COUNT; c++) | ||
61 | - { | ||
62 | - vector <float> obj; | ||
63 | - | ||
64 | - obj.push_back(vptresult->obj_results_[c].obj_rect.left_); | ||
65 | - obj.push_back(vptresult->obj_results_[c].obj_rect.top_); | ||
66 | - obj.push_back(vptresult->obj_results_[c].obj_rect.left_ + vptresult->obj_results_[c].obj_rect.width_); | ||
67 | - obj.push_back(vptresult->obj_results_[c].obj_rect.top_ + vptresult->obj_results_[c].obj_rect.height_); | ||
68 | - obj.push_back(vptresult->obj_results_[c].obj_score); | ||
69 | - obj.push_back(vptresult->obj_results_[c].obj_index); | ||
70 | - detectResult.push_back(obj); | ||
71 | - } | ||
72 | - | ||
73 | - int objCount = taskTrackers.tracker.update(/*tools->param.w*/img_data.w_* taskTrackers.ratioWidth, /*tools->param.h*/img_data.h_* taskTrackers.ratioHeight, true, detectResult, vptResult.obj, deleteObjectID); | ||
74 | - vptResult.objCount = objCount; | ||
75 | - delete[] vptresult->obj_results_; | ||
76 | - delete vptresult; | ||
77 | - return ret; | ||
78 | -} | ||
79 | - | ||
80 | - | ||
81 | - | ||
82 | - | ||
83 | -void IRegionSurveillanceVpt::release() | ||
84 | -{ | ||
85 | - | ||
86 | - //1.VPT RELEASE | ||
87 | - if (vpt_handle) | ||
88 | - { | ||
89 | - vpt_release(&vpt_handle); | ||
90 | - vpt_handle = NULL; | ||
91 | - } | ||
92 | - | ||
93 | -} | ||
94 | \ No newline at end of file | 0 | \ No newline at end of file |
src/left_over/MSRegionSurveilanceVpt.h deleted
1 | -#pragma once | ||
2 | -#include "MSRegionSurveilanceBase.h" | ||
3 | - | ||
4 | - | ||
5 | -class IRegionSurveillanceVpt : public IRegionSurveillanceBase { | ||
6 | -public: | ||
7 | - | ||
8 | - | ||
9 | -private: | ||
10 | - virtual int detect(const sy_img &img_data, VPT_Result & vptResult) override; | ||
11 | - virtual int init(const rs_param & param) override; | ||
12 | - virtual void release() override; | ||
13 | - | ||
14 | -private: | ||
15 | - void * vpt_handle; | ||
16 | - | ||
17 | - | ||
18 | -}; |
src/left_over/RegionSurveillanceProcess.h
@@ -35,17 +35,19 @@ public: | @@ -35,17 +35,19 @@ public: | ||
35 | virtual int rs_init(const rs_params ¶m) = 0; | 35 | virtual int rs_init(const rs_params ¶m) = 0; |
36 | virtual int rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/) = 0; | 36 | virtual int rs_init_region(int num_roi, region_info* region_infos/*, bool iflog*/) = 0; |
37 | virtual int rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result) = 0; | 37 | virtual int rs_detect(const sy_img &img_data, region_info* region_infos, rs_result *result) = 0; |
38 | - virtual int rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) = 0; | 38 | + //virtual int rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) = 0; |
39 | void* handle; | 39 | void* handle; |
40 | int licence_status = -1; | 40 | int licence_status = -1; |
41 | int thrd_status = -1; | 41 | int thrd_status = -1; |
42 | - int long_side; | ||
43 | - int short_side; | 42 | + double scale; |
43 | + //int long_side; | ||
44 | + //int short_side; | ||
44 | std::atomic<bool> thrd_run; | 45 | std::atomic<bool> thrd_run; |
45 | boost::thread thrd; | 46 | boost::thread thrd; |
46 | long frame_num = 0; | 47 | long frame_num = 0; |
47 | bool init_flag = false; | 48 | bool init_flag = false; |
48 | - double scale; | 49 | + sy_rect rect[MAXVERTEXNUM]; //有效区域 |
50 | + unsigned char rect_num; //有效区域数量 | ||
49 | private: | 51 | private: |
50 | //int mode; //运行模式0 cpu | 52 | //int mode; //运行模式0 cpu |
51 | //MS_RegionSurveillance MS1; | 53 | //MS_RegionSurveillance MS1; |
src/left_over/helper.cpp
@@ -63,8 +63,8 @@ void RegionSurveillance::RandNeighborInit(int32_t width, int32_t height) | @@ -63,8 +63,8 @@ void RegionSurveillance::RandNeighborInit(int32_t width, int32_t height) | ||
63 | { | 63 | { |
64 | g_YTable[i + 1] = i; | 64 | g_YTable[i + 1] = i; |
65 | } | 65 | } |
66 | - g_XTable[0] = 0; //1 | ||
67 | - g_XTable[height + 1] = height - 1; | 66 | + g_YTable[0] = 0; //1 |
67 | + g_YTable[height + 1] = height - 1; | ||
68 | } | 68 | } |
69 | } | 69 | } |
70 | 70 | ||
@@ -72,13 +72,13 @@ void RegionSurveillance::GetRandNeighborXY(int32_t x, int32_t y, int32_t *_x, in | @@ -72,13 +72,13 @@ void RegionSurveillance::GetRandNeighborXY(int32_t x, int32_t y, int32_t *_x, in | ||
72 | { | 72 | { |
73 | uint32_t r = GetRand() & 0x07; | 73 | uint32_t r = GetRand() & 0x07; |
74 | *_x = g_XTable[x + g_XNeighborTable[r]]; | 74 | *_x = g_XTable[x + g_XNeighborTable[r]]; |
75 | - *_y = g_XTable[y + g_YNeighborTable[r]]; | 75 | + *_y = g_YTable[y + g_YNeighborTable[r]]; |
76 | } | 76 | } |
77 | 77 | ||
78 | void RegionSurveillance::GetNeighborXY(int32_t x, int32_t y, int32_t *_x, int32_t *_y, int32_t flag) | 78 | void RegionSurveillance::GetNeighborXY(int32_t x, int32_t y, int32_t *_x, int32_t *_y, int32_t flag) |
79 | { | 79 | { |
80 | *_x = g_XTable[x + g_XNeighborTable[flag]]; | 80 | *_x = g_XTable[x + g_XNeighborTable[flag]]; |
81 | - *_y = g_XTable[y + g_YNeighborTable[flag]]; | 81 | + *_y = g_YTable[y + g_YNeighborTable[flag]]; |
82 | } | 82 | } |
83 | 83 | ||
84 | void RegionSurveillance::FreeRandNeighbor() | 84 | void RegionSurveillance::FreeRandNeighbor() |
src/left_over/left_over_det.h
@@ -24,8 +24,8 @@ | @@ -24,8 +24,8 @@ | ||
24 | #define m_BOUNDING_BOX_RATEMIN 0.001 | 24 | #define m_BOUNDING_BOX_RATEMIN 0.001 |
25 | #define m_BOUNDING_BOX_RATEMAX 100 | 25 | #define m_BOUNDING_BOX_RATEMAX 100 |
26 | #define MAXROINUM 10 // 最大ROI数 | 26 | #define MAXROINUM 10 // 最大ROI数 |
27 | -//#define MACDETECTOBJNUM 100 | ||
28 | -#define MACDETECTOBJNUM 3 | 27 | +#define MACDETECTOBJNUM 10 |
28 | + | ||
29 | #ifdef __cplusplus | 29 | #ifdef __cplusplus |
30 | extern "C" | 30 | extern "C" |
31 | { | 31 | { |
@@ -33,14 +33,25 @@ extern "C" | @@ -33,14 +33,25 @@ extern "C" | ||
33 | 33 | ||
34 | #ifndef __RS_PARAM__ | 34 | #ifndef __RS_PARAM__ |
35 | #define __RS_PARAM__ | 35 | #define __RS_PARAM__ |
36 | - | ||
37 | - | 36 | +#ifndef __SY_RECT__ |
37 | +#define __SY_RECT__ | ||
38 | + typedef struct sy_rect | ||
39 | + { | ||
40 | + int left_; | ||
41 | + int top_; | ||
42 | + int width_; | ||
43 | + int height_; | ||
44 | + sy_rect(int m_left, int m_top, int m_width, int m_height) :left_(m_left), top_(m_top), width_(m_width), height_(m_height) {}; | ||
45 | + sy_rect() {}; | ||
46 | + } sy_rect; | ||
47 | +#endif | ||
48 | +#define MAXVERTEXNUM 10 | ||
38 | typedef struct rs_param | 49 | typedef struct rs_param |
39 | { | 50 | { |
40 | long frame_num; // 逗留时间 单位帧数 | 51 | long frame_num; // 逗留时间 单位帧数 |
41 | - int long_side; | ||
42 | - int short_side; | ||
43 | - | 52 | + double scale; //缩小比例 |
53 | + sy_rect rect[MAXVERTEXNUM]; //有效区域 | ||
54 | + unsigned char rect_num; //有效区域数量 | ||
44 | }rs_param; | 55 | }rs_param; |
45 | #endif | 56 | #endif |
46 | 57 |
src/left_over/ms_region_surveilance.cpp
@@ -2,9 +2,10 @@ | @@ -2,9 +2,10 @@ | ||
2 | #include "RegionSurveillanceProcess.h" | 2 | #include "RegionSurveillanceProcess.h" |
3 | #include "MSRegionSurveilanceCpu.h" | 3 | #include "MSRegionSurveilanceCpu.h" |
4 | #include <thread> | 4 | #include <thread> |
5 | +#include <ctime> | ||
5 | #include <chrono> | 6 | #include <chrono> |
6 | #include "head.h" | 7 | #include "head.h" |
7 | -#include "authority.h" | 8 | +//#include "authority.h" |
8 | #include "sy_errorinfo.h" | 9 | #include "sy_errorinfo.h" |
9 | #include <opencv2/opencv.hpp> | 10 | #include <opencv2/opencv.hpp> |
10 | #ifdef _MSC_VER | 11 | #ifdef _MSC_VER |
@@ -16,100 +17,172 @@ | @@ -16,100 +17,172 @@ | ||
16 | 17 | ||
17 | 18 | ||
18 | 19 | ||
19 | -void check_thread(RegionSurveillanceProcess* handle) | 20 | +//void check_thread(RegionSurveillanceProcess* handle) |
21 | +//{ | ||
22 | +// int res = -1; | ||
23 | +//#ifdef __linux__ | ||
24 | +// char* wtime = new char[15]; | ||
25 | +// memset(wtime, 0, 15); | ||
26 | +//#endif | ||
27 | +// while (1) | ||
28 | +// { | ||
29 | +// //printf("xxx check status on process...\n"); | ||
30 | +//#ifdef _WIN32 | ||
31 | +// res = sy_licence(productSN); | ||
32 | +//#elif __linux__ | ||
33 | +// res = sy_licence(productSN, &wtime); | ||
34 | +// //printf("--------------wtime in thread: %s, status: %d\n", wtime, licence_status); | ||
35 | +//#endif | ||
36 | +// if (res < 0) | ||
37 | +// { | ||
38 | +// handle->licence_status = handle->licence_status - 1; | ||
39 | +// } | ||
40 | +// else | ||
41 | +// { | ||
42 | +// if (handle->licence_status < 0) | ||
43 | +// { | ||
44 | +// handle->licence_status = 0; | ||
45 | +// } | ||
46 | +// } | ||
47 | +// boost::this_thread::sleep(boost::posix_time::seconds(300)); //5min | ||
48 | +// } | ||
49 | +//#ifdef __linux__ | ||
50 | +// if (wtime) | ||
51 | +// { | ||
52 | +// delete[] wtime; | ||
53 | +// wtime = NULL; | ||
54 | +// } | ||
55 | +//#endif | ||
56 | +//} | ||
57 | +#define RESIZE_SCALE 0.5 | ||
58 | +inline std::chrono::system_clock::time_point makeTimePoint(int year, int mon, int day) | ||
20 | { | 59 | { |
21 | - int res = -1; | ||
22 | -#ifdef __linux__ | ||
23 | - char* wtime = new char[15]; | ||
24 | - memset(wtime, 0, 15); | ||
25 | -#endif | ||
26 | - while (1) | 60 | + std::tm t; |
61 | + t.tm_year = year - 1900; | ||
62 | + t.tm_mon = mon - 1; | ||
63 | + t.tm_mday = day; | ||
64 | + t.tm_hour = 0; | ||
65 | + t.tm_min = 0; | ||
66 | + t.tm_sec = 0; | ||
67 | + t.tm_isdst = -1; | ||
68 | + std::time_t tt = std::mktime(&t); | ||
69 | + if (tt == -1) | ||
27 | { | 70 | { |
28 | - //printf("xxx check status on process...\n"); | ||
29 | -#ifdef _WIN32 | ||
30 | - res = sy_licence(productSN); | ||
31 | -#elif __linux__ | ||
32 | - res = sy_licence(productSN, &wtime); | ||
33 | - //printf("--------------wtime in thread: %s, status: %d\n", wtime, licence_status); | ||
34 | -#endif | ||
35 | - if (res < 0) | ||
36 | - { | ||
37 | - handle->licence_status = handle->licence_status - 1; | ||
38 | - } | ||
39 | - else | ||
40 | - { | ||
41 | - if (handle->licence_status < 0) | ||
42 | - { | ||
43 | - handle->licence_status = 0; | ||
44 | - } | ||
45 | - } | ||
46 | - boost::this_thread::sleep(boost::posix_time::seconds(300)); //5min | 71 | + exit(-1); |
72 | + } | ||
73 | + return std::chrono::system_clock::from_time_t(tt); | ||
74 | +} | ||
75 | + | ||
76 | +inline bool timecheck() | ||
77 | +{ | ||
78 | + std::chrono::system_clock::time_point limitTime = makeTimePoint(2020, 12, 31); | ||
79 | + std::chrono::system_clock::time_point nowTime = std::chrono::system_clock::now(); | ||
80 | + if (nowTime > limitTime) | ||
81 | + { | ||
82 | + return false; | ||
47 | } | 83 | } |
48 | -#ifdef __linux__ | ||
49 | - if (wtime) | 84 | + else |
50 | { | 85 | { |
51 | - delete[] wtime; | ||
52 | - wtime = NULL; | 86 | + return true; |
53 | } | 87 | } |
54 | -#endif | ||
55 | } | 88 | } |
56 | - | ||
57 | - | ||
58 | int rs_init(void **handle, rs_param param) | 89 | int rs_init(void **handle, rs_param param) |
59 | { | 90 | { |
60 | int ret = SUCCESS; | 91 | int ret = SUCCESS; |
61 | -#ifdef AUTHORIZATION | ||
62 | -#ifdef _WIN32 | ||
63 | - if (SUCCESS == (ret = sy_licence(productSN))) | ||
64 | -#elif __linux__ | ||
65 | - char* wtime = new char[15]; | ||
66 | - memset(wtime, 0, 15); | ||
67 | - if (SUCCESS == (ret = sy_licence(productSN, &wtime))) | ||
68 | -#endif | ||
69 | -#else | ||
70 | - ret = sy_time_check(2022, 1); | ||
71 | - if (ret == SUCCESS) | ||
72 | -#endif | 92 | + |
93 | + if (timecheck()) | ||
73 | { | 94 | { |
74 | 95 | ||
75 | RegionSurveillanceProcess* regin = nullptr; | 96 | RegionSurveillanceProcess* regin = nullptr; |
76 | //if (param.mode == 0) | 97 | //if (param.mode == 0) |
77 | - regin = new IRegionSurveillanceCpu; | ||
78 | - regin->frame_num = param.frame_num; | 98 | + regin = new IRegionSurveillanceCpu; |
99 | + regin->frame_num = param.frame_num; | ||
79 | if (!regin) | 100 | if (!regin) |
80 | { | 101 | { |
81 | printf("model initial failed \n"); | 102 | printf("model initial failed \n"); |
82 | return -1; | 103 | return -1; |
83 | } | 104 | } |
84 | - | ||
85 | 105 | ||
86 | - regin->long_side = param.long_side; | ||
87 | - regin->short_side = param.short_side; | 106 | + |
107 | + /* regin->long_side = param.long_side; | ||
108 | + regin->short_side = param.short_side;*/ | ||
88 | regin->licence_status = 0; | 109 | regin->licence_status = 0; |
89 | -#ifdef AUTHORIZATION | ||
90 | - regin->thrd_run = true; | ||
91 | - regin->thrd = boost::thread(check_thread, regin); | ||
92 | -#endif | 110 | + |
93 | regin->thrd_status = 0; | 111 | regin->thrd_status = 0; |
94 | - *handle = regin; | ||
95 | -#ifdef AUTHORIZATION | ||
96 | -#ifdef __linux__ | ||
97 | - if (wtime) | 112 | + regin->scale = param.scale; |
113 | + regin->rect_num = param.rect_num; //有效区域数量 | ||
114 | + for (int i = 0; i < regin->rect_num; ++i) | ||
98 | { | 115 | { |
99 | - delete[] wtime; | ||
100 | - wtime = NULL; | 116 | + regin->rect[i].left_ = param.rect[i].left_ / param.scale; |
117 | + regin->rect[i].top_ = param.rect[i].top_ / param.scale; | ||
118 | + regin->rect[i].width_ = param.rect[i].width_ / param.scale; | ||
119 | + regin->rect[i].height_ = param.rect[i].height_ / param.scale; | ||
101 | } | 120 | } |
102 | -#endif | ||
103 | -#endif | 121 | + *handle = regin; |
104 | return ret; | 122 | return ret; |
105 | } | 123 | } |
106 | else | 124 | else |
107 | { | 125 | { |
108 | return AUTHOR_ERROR; | 126 | return AUTHOR_ERROR; |
109 | } | 127 | } |
110 | - | 128 | + |
111 | } | 129 | } |
112 | 130 | ||
131 | +//int rs_init(void **handle, rs_param param) | ||
132 | +//{ | ||
133 | +// int ret = SUCCESS; | ||
134 | +//#ifdef AUTHORIZATION | ||
135 | +//#ifdef _WIN32 | ||
136 | +// if (SUCCESS == (ret = sy_licence(productSN))) | ||
137 | +//#elif __linux__ | ||
138 | +// char* wtime = new char[15]; | ||
139 | +// memset(wtime, 0, 15); | ||
140 | +// if (SUCCESS == (ret = sy_licence(productSN, &wtime))) | ||
141 | +//#endif | ||
142 | +//#else | ||
143 | +// ret = sy_time_check(2021, 1); | ||
144 | +// if (ret == SUCCESS) | ||
145 | +//#endif | ||
146 | +// { | ||
147 | +// | ||
148 | +// RegionSurveillanceProcess* regin = nullptr; | ||
149 | +// //if (param.mode == 0) | ||
150 | +// regin = new IRegionSurveillanceCpu; | ||
151 | +// regin->frame_num = param.frame_num; | ||
152 | +// if (!regin) | ||
153 | +// { | ||
154 | +// printf("model initial failed \n"); | ||
155 | +// return -1; | ||
156 | +// } | ||
157 | +// | ||
158 | +// | ||
159 | +// regin->long_side = param.long_side; | ||
160 | +// regin->short_side = param.short_side; | ||
161 | +// regin->licence_status = 0; | ||
162 | +//#ifdef AUTHORIZATION | ||
163 | +// regin->thrd_run = true; | ||
164 | +// regin->thrd = boost::thread(check_thread, regin); | ||
165 | +//#endif | ||
166 | +// regin->thrd_status = 0; | ||
167 | +// *handle = regin; | ||
168 | +//#ifdef AUTHORIZATION | ||
169 | +//#ifdef __linux__ | ||
170 | +// if (wtime) | ||
171 | +// { | ||
172 | +// delete[] wtime; | ||
173 | +// wtime = NULL; | ||
174 | +// } | ||
175 | +//#endif | ||
176 | +//#endif | ||
177 | +// return ret; | ||
178 | +// } | ||
179 | +// else | ||
180 | +// { | ||
181 | +// return AUTHOR_ERROR; | ||
182 | +// } | ||
183 | +// | ||
184 | +//} | ||
185 | + | ||
113 | int rs_process(void *handle, sy_img img_data, rs_result *result) | 186 | int rs_process(void *handle, sy_img img_data, rs_result *result) |
114 | { | 187 | { |
115 | RegionSurveillanceProcess* regin = (RegionSurveillanceProcess*)handle; | 188 | RegionSurveillanceProcess* regin = (RegionSurveillanceProcess*)handle; |
@@ -135,12 +208,12 @@ int rs_process(void *handle, sy_img img_data, rs_result *result) | @@ -135,12 +208,12 @@ int rs_process(void *handle, sy_img img_data, rs_result *result) | ||
135 | //pRegionInfo.p_roi[3].y_ = img_data.h_; | 208 | //pRegionInfo.p_roi[3].y_ = img_data.h_; |
136 | cv::Mat srcImage(img_data.h_, img_data.w_, CV_8UC3, img_data.data_); | 209 | cv::Mat srcImage(img_data.h_, img_data.w_, CV_8UC3, img_data.data_); |
137 | IplImage img = IplImage(srcImage); | 210 | IplImage img = IplImage(srcImage); |
138 | - int long_side = (img.width > img.height ? img.width : img.height); | ||
139 | - int short_side = (img.width <= img.height ? img.width : img.height); | ||
140 | - double scale_l = (double)long_side / (double)regin->long_side; | ||
141 | - double scale_s = (double)short_side / (double)regin->short_side; | ||
142 | - regin->scale = (scale_l > scale_s ? scale_l : scale_s); | ||
143 | - regin->scale = 1.00; | 211 | + //int long_side = (img.width > img.height ? img.width : img.height); |
212 | + //int short_side = (img.width <= img.height ? img.width : img.height); | ||
213 | + //double scale_l = (double)long_side / (double)regin->long_side; | ||
214 | + //double scale_s = (double)short_side / (double)regin->short_side; | ||
215 | + //regin->scale = (scale_l > scale_s ? scale_l : scale_s); | ||
216 | + //regin->scale = param.scale; | ||
144 | int width = img.width / regin->scale; | 217 | int width = img.width / regin->scale; |
145 | int height = img.height / regin->scale; | 218 | int height = img.height / regin->scale; |
146 | IplImage * srcscale = cvCreateImage(cvSize(width, height), 8, 3); //用于缩放 当前先不缩放 | 219 | IplImage * srcscale = cvCreateImage(cvSize(width, height), 8, 3); //用于缩放 当前先不缩放 |
src/left_over/svibe.cpp
@@ -849,92 +849,253 @@ void RegionSurveillance::VibeModelErosion(unsigned char* inputdata, int width, i | @@ -849,92 +849,253 @@ void RegionSurveillance::VibeModelErosion(unsigned char* inputdata, int width, i | ||
849 | } | 849 | } |
850 | } | 850 | } |
851 | } | 851 | } |
852 | +typedef union uEndianTest { | ||
853 | + struct { | ||
854 | + bool flittle_endian; | ||
855 | + bool fill[3]; | ||
856 | + }; | ||
857 | + long value; | ||
858 | +} EndianTest; | ||
859 | +static const EndianTest __Endian_Test__ = { (long)1 }; | ||
860 | +const bool platform_little_endian = __Endian_Test__.flittle_endian; | ||
861 | + | ||
862 | + | ||
863 | +typedef struct _int_128 | ||
864 | +{ | ||
865 | + int64_t _n1; | ||
866 | + int64_t _n2; | ||
852 | 867 | ||
868 | +}_int_128; | ||
853 | 869 | ||
854 | -void RegionSurveillance::VibeModelDilation2(unsigned char* inputdata,unsigned char *output, int width,int height) | 870 | +const _int_128 & int_128_max(const _int_128 & n1, const _int_128 & n2) |
871 | +{ | ||
872 | + if (platform_little_endian) //小端 | ||
873 | + { | ||
874 | + if (n1._n2 > n2._n2) | ||
875 | + { | ||
876 | + return n1; | ||
877 | + } | ||
878 | + else if (n1._n2 < n2._n2) | ||
879 | + { | ||
880 | + return n2; | ||
881 | + } | ||
882 | + else | ||
883 | + { | ||
884 | + if (n1._n1 > n2._n1) | ||
885 | + { | ||
886 | + return n1; | ||
887 | + } | ||
888 | + else if (n1._n1 < n2._n1) | ||
889 | + { | ||
890 | + return n2; | ||
891 | + } | ||
892 | + else | ||
893 | + { | ||
894 | + return n1; | ||
895 | + } | ||
896 | + } | ||
897 | + } | ||
898 | + else | ||
899 | + { | ||
900 | + if (n1._n1 > n2._n1) //大端 | ||
901 | + { | ||
902 | + return n1; | ||
903 | + } | ||
904 | + else if (n1._n1 < n2._n1) | ||
905 | + { | ||
906 | + return n2; | ||
907 | + } | ||
908 | + else | ||
909 | + { | ||
910 | + if (n1._n2 > n2._n2) | ||
911 | + { | ||
912 | + return n1; | ||
913 | + } | ||
914 | + else if (n1._n2 < n2._n2) | ||
915 | + { | ||
916 | + return n2; | ||
917 | + } | ||
918 | + else | ||
919 | + { | ||
920 | + return n1; | ||
921 | + } | ||
922 | + } | ||
923 | + } | ||
924 | +} | ||
925 | + | ||
926 | +void int_128_store(_int_128 * n1, _int_128 & n2) | ||
927 | +{ | ||
928 | + n1->_n1 = n2._n1; | ||
929 | + n1->_n2 = n2._n2; | ||
930 | +} | ||
931 | +void RegionSurveillance::VibeModelDilation2(unsigned char* inputdata, unsigned char *output, int width, int height) | ||
855 | { | 932 | { |
856 | memset(output, 0, sizeof(output[0])*width*height); | 933 | memset(output, 0, sizeof(output[0])*width*height); |
857 | - if (width<32 || height<32 || inputdata==NULL || output==NULL) | 934 | + if (width<32 || height<32 || inputdata == NULL || output == NULL) |
858 | return; | 935 | return; |
859 | unsigned char *src = inputdata; | 936 | unsigned char *src = inputdata; |
860 | unsigned char *dst = output; | 937 | unsigned char *dst = output; |
861 | 938 | ||
862 | //memcpy(output, inputdata, width*height); | 939 | //memcpy(output, inputdata, width*height); |
863 | - for (int i=0; i<height; i++) { | ||
864 | - output[i*width+0] = 0; | ||
865 | - output[i*width+width-1] = 0; | 940 | + for (int i = 0; i<height; i++) { |
941 | + output[i*width + 0] = 0; | ||
942 | + output[i*width + width - 1] = 0; | ||
866 | } | 943 | } |
867 | - for (int j=0; j<width; j++) { | 944 | + for (int j = 0; j<width; j++) { |
868 | output[j] = 0; | 945 | output[j] = 0; |
869 | - output[(height-1)*width+j]=0; | 946 | + output[(height - 1)*width + j] = 0; |
870 | } | 947 | } |
871 | - for (int i=1; i<height-1; i++) | 948 | + for (int i = 1; i<height - 1; i++) |
872 | { | 949 | { |
873 | src = inputdata + i*width; | 950 | src = inputdata + i*width; |
874 | dst = output + i*width; | 951 | dst = output + i*width; |
875 | for (int j = 1; j < width - 16; j += 16) | 952 | for (int j = 1; j < width - 16; j += 16) |
876 | { | 953 | { |
877 | - // 2 unaligned loads. | ||
878 | - __m128i m = _mm_loadu_si128((const __m128i*)(src + j )); | ||
879 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - 1 - width))); | ||
880 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1))); | ||
881 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - width))); | ||
882 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1 - width))); | 954 | + // 2 unaligned loads. |
955 | + _int_128 m = *((const _int_128*)(src + j)); | ||
956 | + m = int_128_max(m, *((const _int_128*)(src + j - 1 - width))); | ||
957 | + m = int_128_max(m, *((const _int_128*)(src + j + 1))); | ||
958 | + m = int_128_max(m, *((const _int_128*)(src + j - width))); | ||
959 | + m = int_128_max(m, *((const _int_128*)(src + j + 1 - width))); | ||
883 | 960 | ||
884 | // 3 aligned loads: more efficient. | 961 | // 3 aligned loads: more efficient. |
885 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1))); | 962 | + m = int_128_max(m, *((const _int_128*)(src + j - 1))); |
886 | 963 | ||
887 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + width))); | ||
888 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1 + width))); | ||
889 | - m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j +1 + width))); | 964 | + m = int_128_max(m, *((const _int_128*)(src + j + width))); |
965 | + m = int_128_max(m, *((const _int_128*)(src + j - 1 + width))); | ||
966 | + m = int_128_max(m, *((const _int_128*)(src + j + 1 + width))); | ||
890 | // Store the result in the destination image. | 967 | // Store the result in the destination image. |
891 | - _mm_storeu_si128((__m128i*)(dst + j), m); | 968 | + int_128_store((_int_128*)(dst + j), m); |
892 | } | 969 | } |
893 | } | 970 | } |
894 | 971 | ||
895 | } | 972 | } |
896 | -void RegionSurveillance::VibeModelErosion2(unsigned char* inputdata,unsigned char *output, int width,int height) | 973 | +void RegionSurveillance::VibeModelErosion2(unsigned char* inputdata, unsigned char *output, int width, int height) |
897 | { | 974 | { |
898 | memset(output, 0, sizeof(output[0])*width*height); | 975 | memset(output, 0, sizeof(output[0])*width*height); |
899 | - if (width<32 || height<32 || inputdata==NULL || output==NULL) | 976 | + if (width<32 || height<32 || inputdata == NULL || output == NULL) |
900 | return; | 977 | return; |
901 | unsigned char *src = inputdata; | 978 | unsigned char *src = inputdata; |
902 | unsigned char *dst = output; | 979 | unsigned char *dst = output; |
903 | 980 | ||
904 | //memcpy(output, inputdata, width*height); | 981 | //memcpy(output, inputdata, width*height); |
905 | - for (int i=0; i<height; i++) { | ||
906 | - output[i*width+0] = 0; | ||
907 | - output[i*width+width-1] = 0; | 982 | + for (int i = 0; i<height; i++) { |
983 | + output[i*width + 0] = 0; | ||
984 | + output[i*width + width - 1] = 0; | ||
908 | } | 985 | } |
909 | - for (int j=0; j<width; j++) { | 986 | + for (int j = 0; j<width; j++) { |
910 | output[j] = 0; | 987 | output[j] = 0; |
911 | - output[(height-1)*width+j]=0; | 988 | + output[(height - 1)*width + j] = 0; |
912 | } | 989 | } |
913 | - for (int i=1; i<height-1; i++) | 990 | + for (int i = 1; i<height; i++) |
914 | { | 991 | { |
915 | src = inputdata + i*width; | 992 | src = inputdata + i*width; |
916 | dst = output + i*width; | 993 | dst = output + i*width; |
917 | for (int j = 1; j < width - 16; j += 16) | 994 | for (int j = 1; j < width - 16; j += 16) |
918 | { | 995 | { |
919 | // 2 unaligned loads. | 996 | // 2 unaligned loads. |
920 | - __m128i m = _mm_loadu_si128((const __m128i*)(src + j )); | ||
921 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - 1 - width))); | ||
922 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1))); | ||
923 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - width))); | ||
924 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1 - width))); | 997 | + _int_128 m = *((const _int_128*)(src + j)); |
998 | + m = int_128_max(m, *((const _int_128*)(src + j - 1 - width))); | ||
999 | + m = int_128_max(m, *((const _int_128*)(src + j + 1))); | ||
1000 | + m = int_128_max(m, *((const _int_128*)(src + j - width))); | ||
1001 | + m = int_128_max(m, *((const _int_128*)(src + j + 1 - width))); | ||
925 | 1002 | ||
926 | // 3 aligned loads: more efficient. | 1003 | // 3 aligned loads: more efficient. |
927 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1))); | 1004 | + m = int_128_max(m, *((const _int_128*)(src + j - 1))); |
928 | 1005 | ||
929 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + width))); | ||
930 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1 + width))); | ||
931 | - m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j +1 + width))); | 1006 | + m = int_128_max(m, *((const _int_128*)(src + j + width))); |
1007 | + m = int_128_max(m, *((const _int_128*)(src + j - 1 + width))); | ||
1008 | + m = int_128_max(m, *((const _int_128*)(src + j + 1 + width))); | ||
932 | // Store the result in the destination image. | 1009 | // Store the result in the destination image. |
933 | - _mm_storeu_si128((__m128i*)(dst + j), m); | 1010 | + int_128_store((_int_128*)(dst + j), m); |
934 | } | 1011 | } |
935 | } | 1012 | } |
936 | 1013 | ||
937 | } | 1014 | } |
1015 | +//void RegionSurveillance::VibeModelDilation2(unsigned char* inputdata,unsigned char *output, int width,int height) | ||
1016 | +//{ | ||
1017 | +// memset(output, 0, sizeof(output[0])*width*height); | ||
1018 | +// if (width<32 || height<32 || inputdata==NULL || output==NULL) | ||
1019 | +// return; | ||
1020 | +// unsigned char *src = inputdata; | ||
1021 | +// unsigned char *dst = output; | ||
1022 | +// | ||
1023 | +// //memcpy(output, inputdata, width*height); | ||
1024 | +// for (int i=0; i<height; i++) { | ||
1025 | +// output[i*width+0] = 0; | ||
1026 | +// output[i*width+width-1] = 0; | ||
1027 | +// } | ||
1028 | +// for (int j=0; j<width; j++) { | ||
1029 | +// output[j] = 0; | ||
1030 | +// output[(height-1)*width+j]=0; | ||
1031 | +// } | ||
1032 | +// for (int i=1; i<height-1; i++) | ||
1033 | +// { | ||
1034 | +// src = inputdata + i*width; | ||
1035 | +// dst = output + i*width; | ||
1036 | +// for (int j = 1; j < width - 16; j += 16) | ||
1037 | +// { | ||
1038 | +// // 2 unaligned loads. | ||
1039 | +// __m128i m = _mm_loadu_si128((const __m128i*)(src + j )); | ||
1040 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - 1 - width))); | ||
1041 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1))); | ||
1042 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - width))); | ||
1043 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1 - width))); | ||
1044 | +// | ||
1045 | +// // 3 aligned loads: more efficient. | ||
1046 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1))); | ||
1047 | +// | ||
1048 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + width))); | ||
1049 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1 + width))); | ||
1050 | +// m = _mm_max_epu8(m, _mm_loadu_si128((const __m128i*)(src + j +1 + width))); | ||
1051 | +// // Store the result in the destination image. | ||
1052 | +// _mm_storeu_si128((__m128i*)(dst + j), m); | ||
1053 | +// } | ||
1054 | +// } | ||
1055 | +// | ||
1056 | +//} | ||
1057 | +//void RegionSurveillance::VibeModelErosion2(unsigned char* inputdata,unsigned char *output, int width,int height) | ||
1058 | +//{ | ||
1059 | +// memset(output, 0, sizeof(output[0])*width*height); | ||
1060 | +// if (width<32 || height<32 || inputdata==NULL || output==NULL) | ||
1061 | +// return; | ||
1062 | +// unsigned char *src = inputdata; | ||
1063 | +// unsigned char *dst = output; | ||
1064 | +// | ||
1065 | +// //memcpy(output, inputdata, width*height); | ||
1066 | +// for (int i=0; i<height; i++) { | ||
1067 | +// output[i*width+0] = 0; | ||
1068 | +// output[i*width+width-1] = 0; | ||
1069 | +// } | ||
1070 | +// for (int j=0; j<width; j++) { | ||
1071 | +// output[j] = 0; | ||
1072 | +// output[(height-1)*width+j]=0; | ||
1073 | +// } | ||
1074 | +// for (int i=1; i<height-1; i++) | ||
1075 | +// { | ||
1076 | +// src = inputdata + i*width; | ||
1077 | +// dst = output + i*width; | ||
1078 | +// for (int j = 1; j < width - 16; j += 16) | ||
1079 | +// { | ||
1080 | +// // 2 unaligned loads. | ||
1081 | +// __m128i m = _mm_loadu_si128((const __m128i*)(src + j )); | ||
1082 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - 1 - width))); | ||
1083 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1))); | ||
1084 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j - width))); | ||
1085 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + 1 - width))); | ||
1086 | +// | ||
1087 | +// // 3 aligned loads: more efficient. | ||
1088 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1))); | ||
1089 | +// | ||
1090 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j + width))); | ||
1091 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j -1 + width))); | ||
1092 | +// m = _mm_min_epu8(m, _mm_loadu_si128((const __m128i*)(src + j +1 + width))); | ||
1093 | +// // Store the result in the destination image. | ||
1094 | +// _mm_storeu_si128((__m128i*)(dst + j), m); | ||
1095 | +// } | ||
1096 | +// } | ||
1097 | +// | ||
1098 | +//} | ||
938 | 1099 | ||
939 | 1100 | ||
940 | //按照中心点的位置进行排序 by zl | 1101 | //按照中心点的位置进行排序 by zl |
@@ -944,7 +1105,7 @@ void RegionSurveillance::SortForeground(vector<CForeground> &ForegroundArray) | @@ -944,7 +1105,7 @@ void RegionSurveillance::SortForeground(vector<CForeground> &ForegroundArray) | ||
944 | } | 1105 | } |
945 | 1106 | ||
946 | 1107 | ||
947 | - | 1108 | +int RegionSurveillance::dwGlobalID; |
948 | /****************************************************************************** | 1109 | /****************************************************************************** |
949 | * Function: VibeModelGetTrace | 1110 | * Function: VibeModelGetTrace |
950 | * Description: | 1111 | * Description: |
src/left_over/svibe.h
@@ -184,7 +184,7 @@ private: | @@ -184,7 +184,7 @@ private: | ||
184 | void FreeRandNeighbor(); | 184 | void FreeRandNeighbor(); |
185 | 185 | ||
186 | public: | 186 | public: |
187 | - int dwGlobalID; // object ID for Global use | 187 | + static int dwGlobalID; // object ID for Global use |
188 | 188 | ||
189 | //by zl 20160307 | 189 | //by zl 20160307 |
190 | private: | 190 | private: |
src/test/demo.cpp
@@ -78,23 +78,39 @@ void imag_ana_3channels() | @@ -78,23 +78,39 @@ void imag_ana_3channels() | ||
78 | 78 | ||
79 | void *tools = nullptr; | 79 | void *tools = nullptr; |
80 | rs_param param; | 80 | rs_param param; |
81 | - param.frame_num = 30; | ||
82 | - param.long_side = 1920; | ||
83 | - param.short_side = 1080; | 81 | + param.frame_num = 100; |
82 | + //param.long_side = 1920; | ||
83 | + //param.short_side = 1080; | ||
84 | + param.scale = 2; | ||
85 | + param.rect_num = 2; | ||
86 | + | ||
87 | + { | ||
88 | + param.rect[0].left_ = 30; | ||
89 | + param.rect[0].top_ = 0; | ||
90 | + param.rect[0].width_ = 320; | ||
91 | + param.rect[0].height_ = 480; | ||
92 | + | ||
93 | + param.rect[1].left_ = 320; | ||
94 | + param.rect[1].top_ = 0; | ||
95 | + param.rect[1].width_ = 319; | ||
96 | + param.rect[1].height_ = 479; | ||
97 | + } | ||
84 | if (rs_init(&tools, param) != 0) | 98 | if (rs_init(&tools, param) != 0) |
85 | cout << "hp_init ailed!" << endl; | 99 | cout << "hp_init ailed!" << endl; |
86 | 100 | ||
87 | char imgpath[260]; | 101 | char imgpath[260]; |
102 | + //CvCapture* video1 = cvCaptureFromFile("D:\\weixin\\ATM遗留物\\20200928\\192.0.0.209_8000_1_4_-1\\20200928_20200928103418_20200928104058_103413.mp4"); | ||
103 | + //CvCapture* video1 = cvCaptureFromFile("E:\\vpt_pic\\MSRegion.git\\win\\MSRegionDemo\\test1.mp4"); | ||
88 | CvCapture* video1 = cvCaptureFromFile("D:\\ruijinVideo\\192.168.1.10_01_2020072911472348.mp4"); | 104 | CvCapture* video1 = cvCaptureFromFile("D:\\ruijinVideo\\192.168.1.10_01_2020072911472348.mp4"); |
89 | // 用opencv函数读取视频的一帧 | 105 | // 用opencv函数读取视频的一帧 |
90 | IplImage * src = cvQueryFrame(video1); | 106 | IplImage * src = cvQueryFrame(video1); |
91 | 107 | ||
92 | - int long_side = (src->width > src->height ? src->width : src->height); | ||
93 | - int short_side = (src->width <= src->height ? src->width : src->height); | ||
94 | - double scale_l = (double)long_side / (double)param.long_side; | ||
95 | - double scale_s = (double)short_side / (double)param.short_side; | ||
96 | - double scale = (scale_l > scale_s ? scale_l : scale_s); | ||
97 | - scale = 1.0; | 108 | + //int long_side = (src->width > src->height ? src->width : src->height); |
109 | + //int short_side = (src->width <= src->height ? src->width : src->height); | ||
110 | + //double scale_l = (double)long_side / (double)param.long_side; | ||
111 | + //double scale_s = (double)short_side / (double)param.short_side; | ||
112 | + //double scale = (scale_l > scale_s ? scale_l : scale_s); | ||
113 | + double scale = 1.0; | ||
98 | int width = src->width / scale; | 114 | int width = src->width / scale; |
99 | int height = src->height / scale; | 115 | int height = src->height / scale; |
100 | //width = 1912; | 116 | //width = 1912; |
@@ -142,7 +158,7 @@ void imag_ana_3channels() | @@ -142,7 +158,7 @@ void imag_ana_3channels() | ||
142 | //ExternalRectangle((unsigned char*)(srcscale1->imageData), srcscale1->width, srcscale1->height, result.obj_infos, result.obj_count, srcscale1->widthStep, 1); | 158 | //ExternalRectangle((unsigned char*)(srcscale1->imageData), srcscale1->width, srcscale1->height, result.obj_infos, result.obj_count, srcscale1->widthStep, 1); |
143 | 159 | ||
144 | /*****************************************************/ | 160 | /*****************************************************/ |
145 | - ExternalRectangle((unsigned char*)(srcscale->imageData), srcscale->width, srcscale->height, result.obj_infos, result.obj_count, srcscale->widthStep, 1); | 161 | + ExternalRectangle((unsigned char*)(srcscale->imageData), srcscale->width, srcscale->height, result.obj_infos, result.obj_count, srcscale->widthStep,1); |
146 | CvFont font; | 162 | CvFont font; |
147 | cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 2, 8); | 163 | cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 2, 8); |
148 | //cvPutText(srcscale, "1Hello World !", cvPoint(80, 40), &font, cvScalar(255, 0, 0, 1)); | 164 | //cvPutText(srcscale, "1Hello World !", cvPoint(80, 40), &font, cvScalar(255, 0, 0, 1)); |
src/test/regionassist.h
@@ -16,5 +16,5 @@ void Trajectory(unsigned char* pRGBIn, ms_object_info *ObjInfo, int ObjCount, in | @@ -16,5 +16,5 @@ void Trajectory(unsigned char* pRGBIn, ms_object_info *ObjInfo, int ObjCount, in | ||
16 | 16 | ||
17 | //判断单向检测方向和绘制箭头 | 17 | //判断单向检测方向和绘制箭头 |
18 | void DrawArrow(IplImage * src, cv::Point pStart, cv::Point pEnd, int len, int alpha); | 18 | void DrawArrow(IplImage * src, cv::Point pStart, cv::Point pEnd, int len, int alpha); |
19 | -int get_ArrowDir(IplImage *frame, CMPoint pROI0, CMPoint pROI1, CMPoint dir, cv::Point &pt1, cv::Point &pt2); | 19 | +//int get_ArrowDir(IplImage *frame, CMPoint pROI0, CMPoint pROI1, CMPoint dir, cv::Point &pt1, cv::Point &pt2); |
20 | #endif | 20 | #endif |
21 | \ No newline at end of file | 21 | \ No newline at end of file |