交通异常判断

本文档展示了C++实现的XML读写方法,以及针对车辆交通行为异常检测的算法。作者遇到编译器与库冲突问题,因此自定义了XML读写函数。算法涉及到车辆在禁停区的停留、车道线压线、掉头、倒车逆行和违章停车等交通异常的判断,并通过读取XML文件获取车道线和车辆轨迹信息。程序通过计算车辆瞬时速度和与车道线的相对位置来确定交通违规情况。
摘要由CSDN通过智能技术生成

绪论

就是第一次项目结束的感想和代码。我负责的是对xml的读写已经数据的处理,由于C++xml读写的宝在我们编译器的环境发生了冲突,我自己写了一种xml读写的方式,判断的整体逻辑还是比较简单的,就是比较繁琐,还有调参的问题。


代码

#include<cstdlib> 
#include<iostream>
#include<vector>
#include<fstream>
#include<cassert>
#include<string>
#include<algorithm> 
using namespace std;
struct Car{
	int index;//车的编号 
	int n;//表示车出现的总帧数 
	int frame[1300];//从小到大的实际帧数
	int Lx[1300],Ly[1300],Rx[1300],Ry[1300];//每帧的四个坐标 
};
vector<Car>cars;//车的数组
int num=0;//车的数量
//禁停区四边形以最上面接近于平行的线段为K[0],B[0],逆时针的顺序分别标记为0,1,2,3 
//             0
//                      
//		1				3
//
//				2 
//相对应的四边形标点的顺序应为
//      0          		1
//
//
//
//
//		2				3 
//K,B为禁停区范围的四条直线 
double K[4],B[4];
//车道线的结构体 
struct Line{
	int index;//车道线编号 
	double k,b;  
};
vector<Line>lines,lines_1,lines_2;//车道线数组,方向线数组,停车线数组 
int num_1=0;//车道线数量
int num_2=0;//方向线数量 
int num_3=0;//停车线数量 
//读取字符串中连续的数字 
int get_id(string s){
	int id=0;
	for (int i=0;i<s.size();i++){
		if (s[i]<='9'&&s[i]>='0') id=id*10+(int)s[i]-48;
	} return id;
}
//读取标签内的数字 
int get_id_2(string s){
	int id=0; int flag; 
	for (int i=0;i<s.size();i++){
		//开始计数 
		if  (s[i]=='>') flag=1;
		if  (s[i]=='<') flag=0;
		if (s[i]<='9'&&s[i]>='0'&&flag==1) id=id*10+(int)s[i]-48;
	} return id;
}
//读取有index的数据 
int get_id_3(string s){
	int id=0,flag=0; 
	for (int i=0;i<s.size();i++){
		//开始计数 
		if (s[i]<='9'&&s[i]>='0'){
			flag++; 
			if (flag>1) id=id*10+(int)s[i]-48;
		}
	} return id;
}
//读取2个小数
void get_id_4(string s,double &x,double &y){
	int flag=0;//flag为等号个数 
	int flag1=0,flag2=0,x2=0,y2=0;
	int t1=0,t2=0;
	//flag1表示x是否检查到小数点,flag2表示y是否检查到小数点 
	//t1,t2判断是否为负数 
	double x1=0.1,y1=0.1; 
	for (int i=0;i<s.size();i++){
		if (s[i+1]=='=') flag++;
		if (flag==1){
			//读取到数字 
			if (s[i]<='9'&&s[i]>='0'){	
				if (s[i-1]=='-') t1=1;
				//整数部分
				if (flag1==0) x=x*10+(int)s[i]-48;
				//精度部分,将精度部分降低到六个百分位 
				else if (x2<6){
					x+=((int)s[i]-48)*x1;
					x1*=0.1;
					x2++; 
				}
			} 
			if (s[i]=='.') flag1=1;//进入小数阶段 
			//是否进入下一个小数的计算
		}
		else if(flag==2){
			//读取到数字 
			if (s[i]<='9'&&s[i]>='0'){
				if (s[i-1]=='-') t2=1; 
				//整数部分 
				if (flag2==0) y=y*10+(int)s[i]-48;
				//精度部分,将精度部分降低到六个百分位 
				else if (y2<6){
					y+=((int)s[i]-48)*y1;
					y1*=0.1;
					y2++; 
				}
			} 
			if (s[i]=='.') flag2=1;//进入小数阶段
		}
	}
	if (t1==1) x=-1.0*x;
	if (t2==1) y=-1.0*y;
} 
//读取3个小数 
void get_id_5(string s,double &x,double &y,double &z){
	int flag=0;//flag为等号个数 
	int flag1=0,flag2=0,flag3=0,x2=0,y2=0,z2=0;
	int t1=0,t2=0,t3=0;
	//flag1表示x是否检查到小数点,flag2表示y是否检查到小数点,flag3表示z是否检查到小数点 
	//t1,t2,t3判断是否为负数 
	double x1=0.1,y1=0.1,z1=0.1; 
	for (int i=0;i<s.size();i++){
		if (s[i+1]=='=') flag++;
		if (flag==1){
			//读取到数字 
			if (s[i]<='9'&&s[i]>='0'){	
				if (s[i-1]=='-') t1=1;
				//整数部分
				if (flag1==0) x=x*10+(int)s[i]-48;
				//精度部分,将精度部分降低到六个百分位 
				else if (x2<6){
					x+=((int)s[i]-48)*x1;
					x1*=0.1;
					x2++; 
				}
			} 
			if (s[i]=='.') flag1=1;//进入小数阶段 
		}
		else if(flag==2){
			//读取到数字 
			if (s[i]<='9'&&s[i]>='0'){
				if (s[i-1]=='-') t2=1; 
				//整数部分 
				if (flag2==0) y=y*10+(int)s[i]-48;
				//精度部分,将精度部分降低到六个百分位 
				else if (y2<6){
					y+=((int)s[i]-48)*y1;
					y1*=0.1;
					y2++; 
				}
			} 
			if (s[i]=='.') flag2=1;//进入小数阶段
		}
		else{
			//读取到数字 
			if (s[i]<='9'&&s[i]>='0'){
				if (s[i-1]=='-') t3=1; 
				//整数部分 
				if (flag3==0) z=z*10+(int)s[i]-48;
				//精度部分,将精度部分降低到六个百分位 
				else if (z2<6){
					z+=((int)s[i]-48)*z1;
					z1*=0.1;
					z2++; 
				}
			} 
			if (s[i]=='.') flag3=1;//进入小数阶段
		}
	}
	if (t1==1) x=-1.0*x;
	if (t2==1) y=-1.0*y;
	if (t3==1) z=-1.0*z;
}
//读car的xml 
void readTxt_car(string file){
	
    ifstream infile; 
    infile.open(file.data());   //将文件流对象与文件连接起来 
    assert(infile.is_open());   //若失败,则输出错误消息,并终止程序运行 
    string s;
    while(getline(infile,s)){
    	//车的编号出现,加入属于车的数组 
    	if (s.find("<Car index")!=string::npos){
    		num++; Car x; x.index=get_id(s);//编号赋值
			x.n=0;//初始帧数为0 
			//读车的所有帧数 
			while(getline(infile,s)&&s.find("</Car>")==string::npos){
				//具体帧数存入frame数组 
				if (s.find("Frame value")!=string::npos) {
					x.frame[x.n]=get_id(s); 
					//读每一帧的信息 
					getline(infile,s); x.Lx[x.n]=get_id_2(s);
					getline(infile,s); x.Ly[x.n]=get_id_2(s);
					getline(infile,s); x.Rx[x.n]=get_id_2(s);
					getline(infile,s); x.Ry[x.n]=get_id_2(s);
					x.n++;	
				}
			}
			cars.push_back(x);
		}
    }
    infile.close();             //关闭文件输入流 
}
//测试car_xml 
void text_1(){
	for (int i=0;i<cars.size();i++){
		cout<<"编号为"<<cars[i].index<<"的车跟踪的总帧数为:"<<cars[i].n<<endl;
		cout<<"--------------------------------------------------------------------------------\n"; 
		//输出帧数信息 
		for (int j=0;j<cars[i].n;j++){
			cout<<"第"<<j+1<<"帧对应实际的第"<<cars[i].frame[j]<<"帧"<<endl;
			cout<<cars[i].Lx[j]<<" "<<cars[i].Ly[j]<<" "<<cars[i].Rx[j]<<" "<<cars[i].Ry[j]<<endl; 
		}
		cout<<"--------------------------------------------------------------------------------\n";
	}
}
//读line的xml 
void readTxt_line(string file){
    ifstream infile; 
    infile.open(file.data());   //将文件流对象与文件连接起来 
    assert(infile.is_open());   //若失败,则输出错误消息,并终止程序运行 
    string s;
    while(getline(infile,s)){
    	//车道线 
    	if (s.find("<Shape class=\"1")!=string::npos){
    		Line x; x.index=get_id_3(s);
    		getline(infile,s); getline(infile,s); getline(infile,s);
    		double x1=0,y1=0,z1=0; get_id_5(s,x1,y1,z1);
			x.k=-1.0*x1/y1; x.b=-1.0*z1/y1;
			lines.push_back(x); num_1++;
		}
		//四边形 
		if (s.find("<Shape class=\"2")!=string::npos){
			//获取四个点 
    		double d[4][2]={0};
			getline(infile,s); get_id_4(s,d[0][0],d[0][1]); //cout<<d[0][0]<<" "<<d[0][1]<<endl;
			getline(infile,s); get_id_4(s,d[1][0],d[1][1]); //cout<<d[1][0]<<" "<<d[1][1]<<endl;
			getline(infile,s); get_id_4(s,d[2][0],d[2][1]); //cout<<d[2][0]<<" "<<d[2][1]<<endl;
			getline(infile,s); get_id_4(s,d[3][0],d[3][1]); //cout<<d[3][0]<<" "<<d[3][1]<<endl;
			//计算四条直线
			//两点(x1,y1),(x2,y2)转化成直线的表达式
			//k=(y2-y1)/(x2-x1),b=(y1*x2-x1*y2)/(x2-x1);
			//禁停区四边形以最上面接近于平行的线段为K[0],B[0],逆时针的顺序分别标记为0,1,2,3 
			//             0
			//                      
			//		1				3
			//
			//				2 
			//相对应的四边形标点的顺序应为
			//      0          		1
			//
			//
			//
			//
			//		3				2 
			//计算直线 
			K[0]=(d[1][1]-d[0][1])/(d[1][0]-d[0][0]); 
			B[0]=(d[0][1]*d[1][0]-d[0][0]*d[1][1])/(d[1][0]-d[0][0]);
			K[1]=(d[3][1]-d[0][1])/(d[3][0]-d[0][0]); 
			B[1]=(d[0][1]*d[3][0]-d[0][0]*d[3][1])/(d[3][0]-d[0][0]);
			K[2]=(d[2][1]-d[3][1])/(d[2][0]-d[3][0]); 
			B[2]=(d[3][1]*d[2][0]-d[3][0]*d[2][1])/(d[2][0]-d[3][0]);
			K[3]=(d[1][1]-d[2][1])/(d[1][0]-d[2][0]); 
			B[3]=(d[2][1]*d[1][0]-d[2][0]*d[1][1])/(d[1][0]-d[2][0]); 
		}
		//方向线
		if (s.find("<Shape class=\"3")!=string::npos){
    		Line x; x.index=get_id_3(s); 
    		double d[4][2]={0};
			getline(infile,s); get_id_4(s,d[0][0],d[0][1]); 
			getline(infile,s); get_id_4(s,d[1][0],d[1][1]); 
			x.k=(d[1][1]-d[0][1])/(d[1][0]-d[0][0]); 
			x.b=(d[0][1]*d[1][0]-d[0][0]*d[1][1])/(d[1][0]-d[0][0]);
			lines_1.push_back(x); num_2++;
		}
		//停车线 
		if (s.find("<Shape class=\"4")!=string::npos){
    		Line x; x.index=get_id_3(s);
    		getline(infile,s); getline(infile,s); getline(infile,s);
    		double x1=0,y1=0,z1=0; get_id_5(s,x1,y1,z1);
			x.k=-1.0*x1/y1; x.b=-1.0*z1/y1;
			lines_2.push_back(x); num_3++;
		} 
    }
    infile.close();             //关闭文件输入流 
}
//判断 
void solve(){
	ofstream outfile("out.txt",ios::trunc);
	//for (int i=0;i<4;i++) cout<<K[i]<<" "<<B[i]<<endl;
	for (int i=0;i<cars.size();i++){
		//记录发生错误的帧数
		//p1:违规压线
		//p2:违规掉头
		//p3:倒车逆行
		//p4:禁区违章停车 
		//p5:违章越线停车 
		vector<int>p1,p2,p3; 
		p1.clear(); p2.clear(); p3.clear();
		//p1_,p2_,p3_存放连续帧的第一帧 
		vector<int>p1_,p2_,p3_;
		p1_.clear(); p2_.clear(); p3_.clear();
		int p4=0,p5=0;
		//两个速度小于阈值的第一帧
		int p4_id=0,p5_id=0; 
		int count=0,count1=0,count2[6]={0},count3[6]={0};
		//n为视频的总帧数,count为禁停区内的帧数,count1表示禁停区内速度小于阈值的帧数 
		//count2为每条停车线为ju小于等于0的帧数,count3为每条停车线ju小于等于0时速度小于阈值的帧数
		//count2和count3需要给每条停车线分配一个 
		//计算每一帧的瞬时速度,放到v数组里面去
		double v[1300],Gx[1300],Gy[1300];//每一帧矩形质心坐标
		double ju1[6][1300],ju2[6][1300];//ju1是每一条车道线每一帧的ju值,ju2是每一条停车线每一帧的ju值 
		for(int j=0;j<cars[i].n;j++){
			//计算质心坐标 
			Gx[j]=(cars[i].Lx[j]+cars[i].Rx[j])/2.0;
			Gy[j]=(cars[i].Ly[j]+cars[i].Ry[j])/2.0; 
			//计算每一条车道线每一帧的ju值,j为帧数,i为第i辆车 
			//l表示第l条某类的线 
			for (int l=0;l<num_1;l++){
				double s1,s2;
				s1=lines[l].k*cars[i].Lx[j]+lines[l].b-cars[i].Ly[j];
				s2=lines[l].k*cars[i].Rx[j]+lines[l].b-cars[i].Ry[j]; 
				ju1[l][j]=s1*s2;
			}
			//计算每一条停车线每一帧的ju值
			for (int l=0;l<num_3;l++){
				double s1,s2;
				s1=lines_2[l].k*cars[i].Lx[j]+lines_2[l].b-cars[i].Ly[j];
				s2=lines_2[l].k*cars[i].Rx[j]+lines_2[l].b-cars[i].Ry[j]; 
				ju2[l][j]=s1*s2;
			} 
			if (j==0) continue;
			double v1;
			v1=(Gx[j-1]-Gx[j])*(Gx[j-1]-Gx[j])+(Gy[j-1]-Gy[j])*(Gy[j-1]-Gy[j]);//计算瞬时速度的平方 	
			//cout<<v1<<endl;
			v[j]=v1;
		}
		bool is_in;//是否在禁停区内 
		for (int j=1;j<cars[i].n;j++){
			is_in=(K[0]*Gx[j]+B[0]<Gy[j])&&(K[1]*Gx[j]+B[1]<Gy[j])&&(K[2]*Gx[j]+B[2]>Gy[j])&&(K[3]*Gx[j]+B[3]>Gy[j]);
			//cout<<(K[0]*Gx[j]+B[0]>Gy[j])<<" "<<(K[1]*Gx[j]+B[1]>Gy[j])<<" "<<(K[2]*Gx[j]+B[2]<Gy[j])<<" "<<(K[3]*Gx[j]+B[3]<Gy[j])<<endl;
			//在禁停区内 
			if (is_in>0){count++;
				double v_=0.9;//阈值的平方 
				if (v[j]<v_) {count1++; 
					if (p4_id==0) p4_id=j;//保存第一帧 
				}
			}
			else{
				//给每条车道线判断一次 
				for (int l=0;l<num_1;l++){
					if (ju1[l][j]<=0){// count2[l]++; 
						if ((Gy[1]-Gy[0])*(Gy[cars[i].n-1]-Gy[cars[i].n-2])>0) p1.push_back(j+1);//违规压线
						else p2.push_back(j+1);//违规掉头					
						//if (flag){
						/* 
						else{
							double v_=0.01;//ju判定下的阈值的平方
							if (v[i]<v_) count3++; 
						}
						*/
					} 
					else{
						//Gy[i]-Gy[i-1]表示v的方向,D表示车道方向
						//两者相乘为负表示同向 
						//根据质心位于方向线的哪侧赋予不同的D值(+1/-1)
						//if k*Gx+b-Gy>0 
						//D=-1
						//if k*Gx+b-Gy<=0 
						//D=1
						int D;

						//判断方向线方向 
						if (lines_1[0].b>0){
							if (lines_1[0].k*Gx[j]+lines_1[0].b-Gy[j]>0) D=-1; 
							else D=1;
						}
						else{
							if (lines_1[0].k*Gx[j]+lines_1[0].b-Gy[j]>0) D=1; 
							else D=-1;
						}
						//连续判断是否倒车逆行
						/*
						int is_reverse=1;
						int begin,end;
						begin=(1<j-2)?(j-2):1; end=(j+2>cars[i].n-1)?(cars[i].n-1):(j+2);
						for (int s=begin;s<=end;s++)
							if ((Gy[s]-Gy[s-1])*D<=D_) is_reverse*=0; 
						if (is_reverse==1) p3.push_back(j+1);//倒车或者逆行 
						//else cout<<"123:"<<0<<endl;//0表示正常
						*/
						//下一帧和后面的第10帧 
						//D_用于过滤掉抖动的情况的阈值 
						double D_=10.1;
						if (j+20<cars[i].n){
							//cout<<cars[i].n<<"  "<<D<<"  "<<(Gy[j+20]-Gy[j])<<endl;
							if ((Gy[j+20]-Gy[j])*D>=D_)
							{							
							p3.push_back(j);

							}
						} 
					}
				}
				//给每条停车线判断一次
				for (int l=0;l<num_3;l++){
					if (ju2[l][j]<=0){ 
						count2[l]++;
						double v_=10;//ju判定下的阈值的平方
						if (v[j]<v_) {
							//cout<<v[j]<<endl;
							count3[l]++;
							if (p5_id==0) p5_id=j;//保存第一帧 
						}
					}
					else{
						//Gy[i]-Gy[i-1]表示v的方向,D表示车道方向
						//两者相乘为负表示同向 
						//根据质心位于方向线的哪侧赋予不同的D值(+1/-1)
						//if k*Gx+b-Gy>0 
						//D=-1
						//if k*Gx+b-Gy<=0 
						//D=1
						int D;
						//D_用于过滤掉抖动的情况的阈值 
						double D_=4;
						//判断方向线方向 
						if (lines_1[0].b>0){
							if (lines_1[0].k*Gx[j]+lines_1[0].b-Gy[j]>0) D=-1; 
							else D=1;
						}
						else{
							if (lines_1[0].k*Gx[j]+lines_1[0].b-Gy[j]>0) D=1; 
							else D=-1;
						} 
						//连续判断是否倒车逆行
						/*
						int is_reverse=1;
						int begin,end;
						begin=(1<j-2)?(j-2):1; end=(j+2>cars[i].n-1)?(cars[i].n-1):(j+2);
						for (int s=begin;s<=end;s++)
							if ((Gy[s]-Gy[s-1])*D<=D_) is_reverse*=0; 
						if (is_reverse==1) p3.push_back(j+1);//倒车或者逆行 
						*/
						//else cout<<"123:"<<0<<endl;//0表示正常
						//下一帧和后面的第10帧 
						if (j+20<cars[i].n){
							if ((Gy[j+20]-Gy[j])*D>=D_)
							p3.push_back(j);
						}
					}
				} 
			}
		}
		//cout<<count1<<" "<<count<<endl;
		double P,P_=0.43;//P是禁停区内速度小于阈值的概率,P_为阈值 
		P=(count!=0)?(count1*1.0/count):0; 
		//0表示正常,p4表示禁区违章停车
		if (P>P_) p4=1;
		//cout<<count1<<endl;
		//cout<<count<<endl;		
		//cout<<P<<endl;
		double P1,P1_=0.57;//P1是ju下速度小于阈值的概率,P1_为阈值 
		P1=(count2[0]!=0)?(count3[0]*1.0/count2[0]):0;  
		//0表示正常,p5表示违章越线停车
		if (P1>P1_) p5=1;
		//cout<<count3[0]<<endl;
		//cout<<count2[0]<<endl;		
		//cout<<P1<<endl;
		//p1:违规压线
		//p2:违规掉头
		//p3:倒车逆行
		//p4:禁区违章停车
		//p5:违章越线停车
		/*
		cout<<"编号为"<<cars[i].index<<"的车的交通异常判断结果如下:\n";
		cout<<"------------------------------------------------------\n";
		*/
	//	outfile<<cars[i].index<<endl;
		vector<int>wrong[1300];
		for (int i=0;i<1300;i++) wrong[i].clear();
	//	cout<<"是否发生违规压线的情况(是/否):";
	//	if (!p1.empty()) cout<<"是\n"; else cout<<"否\n";
		if (!p1.empty()){
	//		cout<<"发生该异常的帧数如下:\n";
			//p1_存储排序和去重的结果 
			vector<int>p1_; p1_.clear();
			for (int j=0;j<p1.size();j++) if (cars[i].frame[p1[j]]) p1_.push_back(cars[i].frame[p1[j]]);
			//排序和去重 
			sort(p1_.begin(),p1_.end());
			vector<int>::iterator it_1=p1_.begin();
		    vector<int>::iterator it_2=p1_.end();
    		vector<int>::iterator new_end; 
			new_end=unique(it_1,it_2); p1_.erase(new_end,it_2);
			/*
			for (int j=0;j<p1_.size();j++) {
				cout<<p1_[j]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p1_.size())%5!=0) cout<<endl;
			*/
			p1_.push_back(2000);
			//p1_p1放连续帧的第一帧 
			vector<int>p1_p1; int flag_=0;
			for (int j=0;j<p1_.size()-1;j++){
				if (p1_[j+1]-p1_[j]==1&&flag_==0){
					p1_p1.push_back(p1_[j]);
					flag_=1;
				}
				else if (p1_[j+1]-p1_[j]!=1&&flag_==1) flag_=0;
				else if (p1_[j+1]-p1_[j]!=1&&flag_==0) p1_p1.push_back(p1_[j]);
			}
			for (int j=0;j<p1_p1.size();j++) wrong[p1_p1[j]].push_back(1);
			/*
			for (int j=0;j<p1_p1.size();j++) {
				cout<<p1_p1[j]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p1_p1.size())%5!=0) cout<<endl;
			*/
			/*
			int flag_=1; 
			for (int j=0;j<p1.size()-1;j++){
				if (cars[i].frame[p1[j+1]]-cars[i].frame[p1[j]]==1&&flag_==1) {p1_.push_back(j); flag_=0;}
				else if (cars[i].frame[p1[j+1]]-cars[i].frame[p1[j]]!=1) flag_=1;
			}
			for (int j=0;j<p1_.size();j++) {
				cout<<cars[i].frame[p1_[j]]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p1_.size())%5!=0) cout<<endl;
			*/
		}
	//	cout<<"是否发生违规掉头的情况(是/否):";
	//	if (!p2.empty()) cout<<"是\n"; else cout<<"否\n";
		if (!p2.empty()){
			//cout<<"发生该异常的帧数如下:\n";
			//p2_存储排序和去重的结果
			vector<int>p2_; p2_.clear();
			for (int j=0;j<p2.size();j++) if (cars[i].frame[p2[j]]) p2_.push_back(cars[i].frame[p2[j]]);
			//排序和去重 
			sort(p2_.begin(),p2_.end());
			vector<int>::iterator it_1=p2_.begin();
		    vector<int>::iterator it_2=p2_.end();
    		vector<int>::iterator new_end; 
			new_end=unique(it_1,it_2); p2_.erase(new_end,it_2);
			/* 
			for (int j=0;j<p2_.size();j++) {
				cout<<p2_[j]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p2_.size())%5!=0) cout<<endl;
			*/
			p2_.push_back(2000);
			//p2_p2放连续帧的第一帧 
			vector<int>p2_p2; int flag_=0;
			for (int j=0;j<p2_.size()-1;j++){
				if (p2_[j+1]-p2_[j]==1&&flag_==0){
					p2_p2.push_back(p2_[j]);
					flag_=1;
				}
				else if (p2_[j+1]-p2_[j]!=1&&flag_==1) flag_=0;
				else if (p2_[j+1]-p2_[j]!=1&&flag_==0) p2_p2.push_back(p2_[j]);
			}
			for (int j=0;j<p2_p2.size();j++) wrong[p2_p2[j]].push_back(2);
			/*
			for (int j=0;j<p2_p2.size();j++) {
				cout<<p2_p2[j]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p2_p2.size())%5!=0) cout<<endl;
			*/
			/*
			int flag_=1; 
			for (int j=0;j<p2.size()-1;j++){
				if (cars[i].frame[p2[j+1]]-cars[i].frame[p2[j]]==1&&flag_==1) {p2_.push_back(j); flag_=0;}
				else if (cars[i].frame[p2[j+1]]-cars[i].frame[p2[j]]!=1) flag_=1;
			}
			for (int j=0;j<p2_.size();j++) {
				cout<<cars[i].frame[p2_[j]]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p2_.size())%5!=0) cout<<endl;
			*/
		}
	//	cout<<"是否发生倒车逆行的情况(是/否):";
	//	if (!p3.empty()) cout<<"是\n"; else cout<<"否\n";
		if (!p3.empty()){
	//		cout<<"发生该异常的帧数如下:\n";
			//p3_存储排序和去重的结果
			vector<int>p3_; p3_.clear();
			for (int j=0;j<p3.size();j++) if (cars[i].frame[p3[j]]) p3_.push_back(cars[i].frame[p3[j]]);
			//排序和去重 
			sort(p3_.begin(),p3_.end());
			vector<int>::iterator it_1=p3_.begin();
		    vector<int>::iterator it_2=p3_.end();
    		vector<int>::iterator new_end; 
			new_end=unique(it_1,it_2); p3_.erase(new_end,it_2); 
			/* 
			for (int j=0;j<p3_.size();j++) {
				cout<<p3_[j]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p3_.size())%5!=0) cout<<endl;
			*/ 
			p3_.push_back(2000);
			//p3_p3放连续帧的第一帧 
			vector<int>p3_p3; int flag_=0;
			for (int j=0;j<p3_.size()-1;j++){
				if (p3_[j+1]-p3_[j]==1&&flag_==0){
					p3_p3.push_back(p3_[j]);
					flag_=1;
				}
				else if (p3_[j+1]-p3_[j]!=1&&flag_==1) flag_=0;
				else if (p3_[j+1]-p3_[j]!=1&&flag_==0) p3_p3.push_back(p3_[j]);
			}
			for (int j=0;j<p3_p3.size();j++) wrong[p3_p3[j]].push_back(3);
			/*
			for (int j=0;j<p3_p3.size();j++) {
				cout<<p3_p3[j]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p3_p3.size())%5!=0) cout<<endl;
			*/
			/* 
			int flag_=1; 
			for (int j=0;j<p3.size()-1;j++){
				if (cars[i].frame[p3[j+1]]-cars[i].frame[p3[j]]==1&&flag_==1) {p3_.push_back(j); flag_=0;}
				else if (cars[i].frame[p3[j+1]]-cars[i].frame[p3[j]]!=1) flag_=1;
			}
			for (int j=0;j<p3_.size();j++) {
				cout<<cars[i].frame[p3_[j]]<<" ";
				if ((j+1)%5==0) cout<<endl;
			}
			if ((p3_.size())%5!=0) cout<<endl;
			*/
		}
		//cout<<"是否发生禁区违章停车的情况(是/否):";
		if (p4==1){
			wrong[cars[i].frame[p4_id]].push_back(4);
		//	cout<<"是\n"; 
			//映射回原本的帧 
		//	cout<<"产生禁区违章停车交通异常的第一帧为:"<<cars[i].frame[p4_id]<<endl; 
		}
		//else cout<<"否\n";
		//cout<<"是否发生违章越线停车的情况(是/否):";
		if (p5==1){
			wrong[cars[i].frame[p5_id]].push_back(5);
		//	cout<<"是\n";
			//映射回原本的帧
		//	cout<<"产生违章越线停车交通异常的第一帧为:"<<cars[i].frame[p5_id]<<endl;
		} 
		//else cout<<"否\n";
		//cout<<"------------------------------------------------------\n";
		for (int j=0;j<1300;j++) if (!wrong[j].empty()){
			for (int k=0;k<wrong[j].size();k++) outfile<<cars[i].index<<" "<<j<<" "<<wrong[j][k]<<endl;
		}  
	}
}
    /*
	int n=3,count=0,count1=0;
	int count2=0,count3=0;
	//n为视频的总帧数,count为禁停区内的帧数,count1表示禁停区内速度小于阈值的帧数
	//count2为ju小于等于0的帧数,count3为ju小于等于0时速度小于阈值的帧数 
	int D=1;//车道方向,恒值 
	bool flag=1;//线的类型  
	//放在外面的全局计算
	//计算每一帧的瞬时速度,放到v数组里面去
	double v[50];//瞬时速度 
	double Lx[50],Ly[50],Rx[50],Ry[50],Gx[50],Gy[50],ju[50];//矩形左上右下质心坐标 
	for (int i=0;i<3;i++) scanf("%lf,%lf,%lf,%lf,%lf,%lf",&Lx[i],&Ly[i],&Rx[i],&Ry[i],&Gx[i],&Gy[i]); 
	for(int i=0;i<n;i++){
		//计算每一帧的ju值
		ju[i]=(k*Lx[i]+b-Ly[i])*(k*Rx[i]+b-Ry[i]);
		if (i==0) continue;
		double v1;
		v1=(Gx[i-1]-Gx[i])*(Gx[i-1]-Gx[i])+(Gy[i-1]-Gy[i])*(Gy[i-1]-Gy[i]);//计算瞬时速度的平方 	
		v[i]=v1;
	}bool is_in;//是否在禁停区内 
	for (int i=1;i<n;i++){
		is_in=(K[0]*Gx[i]+B[0]>Gy[i])&&(K[1]*Gx[i]+B[1]>Gy[i])&&(K[2]*Gx[i]+B[2]<Gy[i])&&(K[3]*Gx[i]+B[3]<Gy[i]);
		if (is_in>0){count++;
			double v_=0.01;//阈值的平方 
			if (v[i]<v_) count1++;
		}
		else{
	//		cout<<ju[i]<<endl;
			if (ju[i]<=0){ count2++; 
				if (flag){
					if ((Gy[1]-Gy[0])*(Gy[n-1]-Gy[n-2])>0) cout<<3<<endl;//违规压线
					else cout<<4<<endl;//违规掉头				
				} 
				else{
					double v_=0.01;//ju判定下的阈值的平方
					if (v[i]<v_) count3++; 
				}
			} 
			else{
				//Gy[i]-Gy[i-1]表示v的方向,D表示车道方向
				//两者相乘为负表示同向 
				//**
				//根据质心位于方向线的哪侧赋予不同的D值(+1/-1)
				//if k*Gx+b-Gy>0 
				//D= 1
				//if k*Gx+b-Gy<=0 
				//D=-1
				//**
				if ((Gy[i]-Gy[i-1])*D>0) cout<<2<<endl;//return 2表示倒车或者逆行 
				else cout<<"123:"<<0<<endl;//0表示正常 
			}
		}
	}
	cout<<count2<<" "<<count3<<endl;
	double P,P_=0.8;//P是禁停区内速度小于阈值的概率,P_为阈值 
	P=count1*1.0/count; 
	//0表示正常,1表示禁区违章停车
	if (P>P_) cout<<1<<endl; else cout<<"321"<<0<<endl; 
	double P1,P1_=0.9;//P1表示ju下速度小于阈值的概率,P1_为阈值
	P1=count3*1.0/count2; 
	//5表示违章越线停车,6表示违章闯红灯 
	if (P1>P1_) cout<<5<<endl; else cout<<6<<endl;
	*/ 



int main(string a,string b){
	readTxt_car(a);
	readTxt_line(b);
	solve(); 
	//测试car数据集的读入 
	//text_1();
	return 0; 
}	

具体信息代码注释中有下,体量过于庞大这里就不多赘述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值