#pragma once #include "fusionobjectarray.pb.h" #include "fusionobject.pb.h" #include "Ctracker.h" #include #include #define FPS 8 #define MIN_DETECTEDFRAMES 5 /// /// \brief 跟踪器参数设置 /// bool InitTracker(CTracker& tracker) { TrackerSettings settings; settings.SetDistance(tracking::DistRect3Ds); // 代价矩阵:两中心点之间的距离 settings.m_kalmanType = tracking::KalmanLinear; // 滤波器类型:卡尔曼线性滤波器 settings.m_filterGoal = tracking::FilterRect3D; // 滤波对象:Rect3D settings.m_lostTrackType = tracking::TrackNone; // 丢失了的目标,不再追踪 settings.m_matchType = tracking::MatchHungrian; // 匹配算法:匈牙利 settings.m_dt = 1.f; // 卡尔曼滤波器的时间步长 settings.m_accelNoiseMag = 0.5f; // 卡尔曼的噪声放大器 settings.m_distThres = 30.f; // 匹配算法中的距离阈值 settings.m_minAreaRadiusPix = -1.f;//frame.rows / 20.f; // 目标的最小面积半径(像素) settings.m_maximumAllowedSkippedFrames = 2; // 被跟踪目标允许未匹配到的最大次数,当超过这一数值,该目标的跟踪器将被移除 settings.m_maxTraceLength = 5; // 最大跟踪长度,即历史轨迹保留的最大长度 tracker.setSettings(settings); return true; } /// /// \brief 对融合后的目标进行跟踪,并以跟踪后的最优估计值更新融合目标的状态信息 /// iv::fusion::fusionobjectarray Tracking(iv::fusion::fusionobjectarray& fusionobjvec, CTracker& tracker) { #ifdef DEBUG_SHOW std::cout<<"-------------------------------------------------"<CopyFrom(centroid); /* not update */ // iv::fusion::Dimension dimension; // iv::fusion::Dimension *obj_dimension; // dimension.set_x(track.m_rect.size.width); // dimension.set_y(track.m_rect.size.height); // dimension.set_z(track.m_rect.size.length); // obj_dimension=fusion_object.mutable_dimensions(); // obj_dimension->CopyFrom(dimension); // fusion_object.set_yaw(track.m_rect.yaw); // iv::fusion::VelXY vel_relative; // iv::fusion::VelXY *velrelative; // vel_relative.set_x(track.m_velocity[0]); // vel_relative.set_y(track.m_velocity[1]); // velrelative = fusion_object.mutable_vel_relative(); // velrelative->CopyFrom(vel_relative); iv::fusion::PointXYZ point_historical; for(int j=0;jCopyFrom(point_historical); } iv::fusion::fusionobject *pe = trackedobjvec.add_obj(); pe->CopyFrom(fusion_object); }else{ // 当前时刻没有融合目标与跟踪器中的已有目标匹配上,则将跟踪器中已有目标的预测结果增加到融合结果中 fusion_object.set_id(track.m_ID); fusion_object.set_type(track.m_region.m_type); iv::fusion::PointXYZ centroid; iv::fusion::PointXYZ *centerpoint; centroid.set_x(track.m_rect.center.x); centroid.set_y(track.m_rect.center.y); centroid.set_z(track.m_rect.center.z); centerpoint=fusion_object.mutable_centroid(); centerpoint->CopyFrom(centroid); iv::fusion::Dimension dimension; iv::fusion::Dimension *obj_dimension; dimension.set_x(track.m_region.m_rect.size.width); dimension.set_y(track.m_region.m_rect.size.height); dimension.set_z(track.m_region.m_rect.size.length); obj_dimension=fusion_object.mutable_dimensions(); obj_dimension->CopyFrom(dimension); fusion_object.set_yaw(track.m_region.m_rect.yaw); iv::fusion::VelXY vel_relative; iv::fusion::VelXY *velrelative; vel_relative.set_x(track.m_velocity[0]*FPS); vel_relative.set_y(track.m_velocity[1]*FPS); velrelative = fusion_object.mutable_vel_relative(); velrelative->CopyFrom(vel_relative); iv::fusion::PointXYZ point_historical; for(int j=0;jCopyFrom(point_historical); } iv::fusion::fusionobject *pe = trackedobjvec.add_obj(); pe->CopyFrom(fusion_object); } #ifdef DEBUG_SHOW std::cout<<"id:"<