#include "TrafficStatistics.h" TrafficStatistics::TrafficStatistics(StatisticsMethod method) { statisticsMethod = method; mLineCounter = 0; } TrafficStatistics::~TrafficStatistics() { } void TrafficStatistics::SetLineArray(VPT_Line *line, int linecount) { mLineCounter = linecount; for (int i = 0; i < mLineCounter; i++) { lineArray.push_back(line[i]); } } void TrafficStatistics::GetTrafficArray(CD_ObjInfo *result, int resSize, vector &trackers, vector &trafficArray) { if (trafficArray.size() != mLineCounter) { cout << "ERROR: The number of lines doesn't match the size of trafficArray! " << endl; return; } switch (statisticsMethod) { case LINE_RECT_INTERSECTION: break; case LINE_LINE_INTERSECTION: LineLineMethod(result, trackers, resSize, trafficArray); break; case LINE_AND_RECT_INTERSECTION: break; default: break; } } void TrafficStatistics::LineRectMethod(CD_ObjInfo *result, vector &trackers, int resSize, vector &trafficArray) { /*int i = 0, j = 0; for (i = 0; i < mLineCounter; i++) { for (j = 0; j < resSize; j++) { if () } }*/ } void TrafficStatistics::LineLineMethod(CD_ObjInfo *result, vector &trackers, int resSize, vector &trafficArray) { int line_i = 0, i = 0, j = 0; for (line_i = 0; line_i < mLineCounter; line_i++) { POINT line_begin(lineArray[line_i].begin_x, lineArray[line_i].begin_y); POINT line_end(lineArray[line_i].end_x, lineArray[line_i].begin_y); for (i = 0; i < resSize; i++) { for (j = 0; j < trackers.size(); j++) { if (trackers[j].istraffic == false && result[i].id == trackers[j].id) //该条轨迹在该帧有运动 { int size = trackers[j].trackLine.size(); if (size < 2 ) continue; if (line_line_intersection(line_begin, line_end, POINT(result[i].center_x, result[i].center_y), \ POINT(trackers[j].trackLine[size - 2].x, trackers[j].trackLine[size - 2].y) )== true) //若有交点 返回true { trackers[j].istraffic = true; trafficArray[line_i].traffic[result[i].index]++; } } } } } ////方法1:计算矩形框是否相交 //if (line_rect_intersection(line_begin, line_end, tracker[j].listinfo[listmax].left, tracker[j].listinfo[listmax].top, tracker[j].listinfo[listmax].right, tracker[j].listinfo[listmax].bottom)) //若有交点 //{ // tracker[j].rectIntersected = true; //} //方法3:算前后帧中心点连线和拌线的是否相交 } void TrafficStatistics::LineAndRectMethod(CD_ObjInfo *result, vector &trackers, int resSize, vector &trafficArray) { /*int i = 0, j = 0; for (i = 0; i < mLineCounter; i++) { for (j = 0; j < resSize; j++) { if () } }*/ } //---------------------------by zl ---------------------------------------------/ bool TrafficStatistics::line_rect_intersection(POINT start_p, POINT end_p, int left, int top, int right, int bottom) { int a = start_p.y - end_p.y; int b = end_p.x - start_p.x; int c = start_p.x* end_p.y - end_p.x* start_p.y; ////思路:先看线段所在直线是否与矩形相交,如果不相交则必为 “F”, ////如果相交,则看线段的两个点是否在矩形的同一边(即两点的 x(y) 坐标都比矩形的小 x(y) 坐标小,或者大), ////若在同一边则为“F”,否则就是相交的情况。 if ((a* left + b*top + c >= 0 && a* right + b* bottom + c <= 0) || (a* left + b*top + c <= 0 && a* right + b* bottom + c >= 0) || (a* left + b*bottom + c >= 0 && a* right + b* top + c <= 0) || (a* left + b*bottom + c >= 0 && a* right + b* top + c <= 0)) { if (left > right) { swap(left, right); } if (top < bottom) { swap(top, bottom); } if ((start_p.x < left && end_p.x < left) || (start_p.x > right && end_p.x < left) || (start_p.y > top && end_p.y > top) || (start_p.y < bottom && end_p.y < bottom)) ///判断线段是否在矩形一侧 { return false; } else { return true; } } else { return false; } } ///------------alg 2------------ //叉积 double mult(POINT a, POINT b, POINT c) { return (a.x - c.x)*(b.y - c.y) - (b.x - c.x)*(a.y - c.y); } //aa, bb为一条线段两端点 cc, dd为另一条线段的两端点 相交返回true, 不相交返回false bool TrafficStatistics::line_line_intersection(POINT aa, POINT bb, POINT cc, POINT dd) { if (max(aa.x, bb.x)