目录
文章目录
- 目录
- 0. 目标GPS信息、速度、加速度、航向角信息的输出
- 1. 目标检测算法接口
- 1.1 模型相关
- 1.2 检测结果相关
- 2. 应用算法接口
- 2.1 bool cross_line; //跨线(变道压线检测)
- 2.2 bool break_in; //闯入(目标闯入)
- 2.3 bool stay; //停留(目标违停)
- 2.4 bool left_behind; //遗留物(道路遗留、抛散、异常)
- 2.5 bool retrograde; //逆行(目标逆行)
- 2.6 目标占道(占用公交车道、应急车道... ...)
- 2.7 流量统计
- 2.8 车辆行驶车道
- 2.9 车身颜色识别
- 2.10 车牌识别
- 3 道路信息
0. 目标GPS信息、速度、加速度、航向角信息的输出
接口示例:
// 道路信息配置(GPS信息配置)
struct GPSPosition
{
double longitude; //经度
double latitude; //纬度
float altitude; //高度
};
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Row
{
std::vector<GPSPosition> gps; //多个点位经纬度信息
std::vector<Point> pos; // 多个点位像素位置
};
std::vector<Row> rows;
为vector rows赋值示例:
// 长度为3认为标定了3行信息
vector<Row> rows(3);
int len_rows = rows.size(); // 3
// 第一行信息认为三个点赋值
rows[0].gps[0].longitude = 100.0281330;
rows[0].gps[0].latitude = 100.5329955;
rows[0].gps[0].altitude = 886.4188;
rows[0].pos[0].x = 0;
rows[0].pos[0].y = 0;
rows[0].gps[1].longitude = 150.0281382;
rows[0].gps[1].latitude = 100.5329584;
rows[0].gps[1].altitude = 886.3948;
rows[0].pos[1].x = 50;
rows[0].pos[1].y = 0;
rows[0].gps[2].longitude = 200.0281402;
rows[0].gps[2].latitude = 100.5329200;
rows[0].gps[2].altitude = 886.3948;
rows[0].pos[2].x = 100;
rows[0].pos[2].y = 0;
// 第二行信息认为两个点赋值
rows[1].gps[0].longitude = 100.0281330;
rows[1].gps[0].latitude = 150.5328777;
rows[1].gps[0].altitude = 883.0678;
rows[1].pos[0].x = 0;
rows[1].pos[0].y =45;
rows[1].gps[1].longitude = 100.0276137;
rows[1].gps[1].latitude = 153.5328084;
rows[1].gps[1].altitude = 883.3948;
rows[1].pos[1].x = 100;
rows[1].pos[1].y = 50;
// 第三行信息认为三个点赋值
rows[2].gps[0].longitude = 100.0281330;
rows[2].gps[0].latitude = 203.5327223;
rows[2].gps[0].altitude = 878.6568;
rows[2].pos[0].x = 0;
rows[2].pos[0].y = 100;
rows[2].gps[1].longitude = 150.0281382;
rows[2].gps[1].latitude = 203.5326848;
rows[2].gps[1].altitude = 878.8278;
rows[2].pos[1].x = 50;
rows[2].pos[1].y = 100;
rows[2].gps[2].longitude = 200.0281402;
rows[2].gps[2].latitude = 200.5326465;
rows[2].gps[2].altitude = 878.9038;
rows[2].pos[2].x = 100;
rows[2].pos[2].y = 100;
1. 目标检测算法接口
1.1 模型相关
模型相关文件及其对应的目标类型。
如下文件:
best.wts
best.cfg
best.engine
labels.txt
其中,labels.txt内容对应模型文件的分类类型,示例如下:
car
truck
bus
elec
bike
pedes
tricycle
coni
warm
1.2 检测结果相关
【注】:跟模型文件一起写死在算法内部。
检测结果涉及目标输出信息和目标所属类别置信度信息。
//目标分类数
static constexpr int CLASS_NUM = 9;
//输入图像宽高
static constexpr int INPUT_H = 960;
static constexpr int INPUT_W = 960;
//目标框
struct Box
{
uint16_t x;
uint16_t y;
uint16_t w;
uint16_t h;
};
//目标置信度
pre-cluster-threshold=0.25
//
//nms-iou-threshold=0.45
2. 应用算法接口
2.0 每帧图像的目标信息如下:
vector<TargetAttribute>;
2.1 bool cross_line; //跨线(变道压线检测)
输入:每帧的目标信息 和 如下结构体的标定信息
// 跨线检测对应标定线结构体定义,可能需要考虑线段id,涉及多条线段需要跨线检测的时候
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Line
{
uint8_t line_id; //线段id
bool is_able; //使能
vector<Point> line_info; //线段信息,长度等于2
};
vector <Line> line;
输出:当前帧图像的目标信息。增加了对应目标信息的TriggerEvent事件结果。
2.2 bool break_in; //闯入(目标闯入)
输入:每帧的目标信息 和 如下结构体的标定信息
//目标闯入的标定区间struct定义
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Region
{
uint8_t region_id; //区域id
bool is_able; //使能
vector<Point> region_info; //区域信息,长度大于等于3
};
vector <Region> region;
输出:当前帧图像的目标信息。增加了对应目标信息的事件结果。
2.3 bool stay; //停留(目标违停)
输入:每帧的目标信息 和 如下结构体的标定信息
//目标闯入的标定区间struct定义
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Region
{
uint8_t region_id; //区域id
bool is_able; //使能
vector<Point> region_info; //区域信息,长度大于等于3
};
vector <Region> region;
输出:当前帧图像的目标信息。增加了对应目标信息的事件结果。
2.4 bool left_behind; //遗留物(道路遗留、抛散、异常)
输入:每帧的目标信息 和 如下结构体的标定信息
//目标停留的标定区间struct定义
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Region
{
uint8_t region_id;
bool is_able; //使能
vector<Point> region_info; //长度大于等于3
};
vector <Region> region;
输出:当前帧图像的目标信息。增加了对应目标信息的事件结果。
2.5 bool retrograde; //逆行(目标逆行)
输入:每帧的目标信息 和 如下结构体的标定信息
//目标停留的标定区间struct定义
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Region
{
uint8_t region_id;
bool is_able; //使能
vector<Point> region_info; //长度大于等于3
vector<Point> right_direction;//正确方向,长度等于2,两点确定方向向量,[起点, 终点]
};
vector <Region> region;
输出:当前帧图像的目标信息。增加了对应目标信息的事件结果。
2.6 目标占道(占用公交车道、应急车道… …)
输入:每帧的目标信息 和 如下结构体的标定信息
//目标停留的标定区间struct定义
struct Point
{
uint16_t x; //像素x
uint16_t y; //像素y
};
struct Region
{
uint8_t region_id; //区域id
bool is_able; //使能
vector<Point> region_info; //长度大于等于3
};
vector <Region> region;
输出:当前帧图像的目标信息。增加了对应目标信息的事件结果。
2.7 流量统计
参见 2.1 跨线检测 。
2.8 车辆行驶车道
依赖车道识别算法 或 标定车道信息
2.9 车身颜色识别
输入: 一帧图像的Mat信息 和 每帧的目标信息
// 一帧图像的信息,类型为Mat
Mat frames;
// 每帧的目标信息,如下:
vector<TargetAttribute> objs;
输出:当前帧图像的目标信息。增加了对应目标信息的事件结果。
2.10 车牌识别
3 道路信息
3.1 车道占用率
3.2 车道空间占用率
3.3 车道车辆数
3.4 是否拥堵
3.5 车道排队车辆数
3.6 车辆排队长度
3.7 队首队尾车辆位置
3.8 车头间距
3.9 车头时距
3.10 车流平均速度
3.11 车辆缓行
3.12 超高速
3.13 超低速
3.14