我正在使用haar cascade创建一个计算人员的程序。检测不会在一帧中给我所有人,但在下一帧中我检测到在先前帧中未检测到的对象。
示例:在视频中我有自由人 在帧1中,我检测到人A和B. 在帧2中,我检测到人A和C
是否有根据两个框架获得真实人数
我使用了这个功能,但它不可靠
bool isInside(Rect rectangle, Point point)
{
if (point.x > rectangle.x && point.x<rectangle.x + rectangle.width && point.y>rectangle.y && point.y < rectangle.y + rectangle.height)
return true;
}
vector<Point> getNouvellesDetections(vector<Rect> rectangles, vector<Point> anciennePoints)
{
vector<Point> nouvellePoints = anciennePoints;
for (int i = 0; i < rectangles.size(); i++)
{
bool isNouveau = true;
for (int j = 0; j < anciennePoints.size(); j++)
{
if (isInside(rectangles[i], anciennePoints[j]))
{
isNouveau = false;
anciennePoints[j].x = getCenterX(rectangles[i]);
anciennePoints[j].y = getCenterY(rectangles[i]);
break;
}
}
if (isNouveau)
{
Point point;
point.x = getCenterX(rectangles[i]);
point.y = getCenterY(rectangles[i]);
nouvellePoints.push_back(point);
}
}
return nouvellePoints;
}
答案 0 :(得分:2)
您提供的代码无法深入了解您的检测方法等。
您是否考虑过跟踪检测到的对象?很难确定哪些检测是新的,哪些是没有某种跟踪的重新检测。
哈尔分类器并不神奇,它非常近似。例如,您可以使用Haar检测对象并创建一个“人物跟踪器”来跟踪他们的速度(移动)和测试在n + 1帧中检测到的对象(如果他们可能是同一个人)。然后在n个跟踪检测之后,您可以将该对象分类为“人”而不是误报,并且在非检测之后“忘记”该对象或将其标记为丢失。
一种跟踪方法是在检测到的AreaOfInterest(Haar矩形)上使用光流,并尝试确定人的移动。这很简单,但可能证明是有效的。当然有更复杂和准确的跟踪方法。
如果您的相机静止,这不是很难,否则会变得复杂。重叠的人也很棘手。
您可以使用的方法取决于此工具的应用。如果您想要实时跟踪某些选项不可用,那么在后期处理中您可以回溯帧,例如在确定它们不是真正的检测后过滤掉误报。