TrafficStatistics.cpp 4.75 KB
#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(VPT_ObjInfo *result, int resSize, vector<KalmanBoxTracker> &trackers, vector <VPT_TrafficResult> &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(VPT_ObjInfo *result, vector<KalmanBoxTracker> &trackers, int resSize, vector <VPT_TrafficResult> &trafficArray)
{
	/*int i = 0, j = 0;
	for (i = 0; i < mLineCounter; i++)
	{
		for (j = 0; j < resSize; j++)
		{
			if ()
		}
	}*/
}

void TrafficStatistics::LineLineMethod(VPT_ObjInfo *result, vector<KalmanBoxTracker> &trackers, int resSize, vector <VPT_TrafficResult> &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(VPT_ObjInfo *result, vector<KalmanBoxTracker> &trackers, int resSize, vector <VPT_TrafficResult> &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)<min(cc.x, dd.x))
	{
		return false;
	}
	if (max(aa.y, bb.y)<min(cc.y, dd.y))
	{
		return false;
	}
	if (max(cc.x, dd.x)<min(aa.x, bb.x))
	{
		return false;
	}
	if (max(cc.y, dd.y)<min(aa.y, bb.y))
	{
		return false;
	}
	if (mult(cc, bb, aa)*mult(bb, dd, aa)<0)
	{
		return false;
	}
	if (mult(aa, dd, cc)*mult(dd, bb, cc)<0)
	{
		return false;
	}
	return true;
}