在目标检测过程中,可能会遇到这样的情况:一个目标被标记为多个区域。
如果一个目标被标记为多个区域,后续的跟踪很容易出现跟错、跟丢,这个情形在自动检测场和是很避讳的。
以下提供一个避免的方法:
- 是否合并?
通过一些条件判断,可以将本为同一目标的区域辨识,前文应该讲过判断方法。
- 中心距离在阈值范围内;
- 两个区域存在交集(包含在内为交集的特殊情况)。
虽然不全面,但是在目标检测场和有一定作用。
- 如何合并:
关于合并,笔者采用的流程如下:
- 寻找被合并区域的左上顶点;
- 计算合并区域的宽高。
左上顶点直接取顶点x、y最小值即可。关于合并后区域的宽高,可以采取这样的操作:
计算四个顶点中,x、y最小最大值,宽高即为对应x、y的差值。
具体实现如下:
void CPOS::AreaMerge(cv::Rect &inRect1, cv::Rect &inRect2, cv::Rect &outRect)
{
int x_0 = inRect1.x;
int x_1 = inRect1.x + inRect1.width;
int x_2 = inRect2.x;
int x_3 = inRect2.x + inRect2.width;
int y_0 = inRect1.y;
int y_1 = inRect1.y + inRect1.height;
int y_2 = inRect2.y;
int y_3 = inRect2.y + inRect2.height;
int x_min=0, x_max=0, y_min=0, y_max=0;
MinMax(x_0, x_1, x_2, x_3, x_min, x_max);
MinMax(y_0, y_1, y_2, y_3, y_min, y_max);
int width = x_max - x_min;
int height = y_max - y_min;
outRect.x = x_min;
outRect.y = y_min;
outRect.width = width;
outRect.height = height;
}
MinMax是笔者自己写的计算四个数的最小最大值,这个可以自行选择。