计算检测到的对象OPENCV

时间:2016-06-07 00:08:22

标签: c++ opencv haar-classifier

我正在使用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;
}

1 个答案:

答案 0 :(得分:2)

您提供的代码无法深入了解您的检测方法等。

您是否考虑过跟踪检测到的对象?很难确定哪些检测是新的,哪些是没有某种跟踪的重新检测。

哈尔分类器并不神奇,它非常近似。

例如,您可以使用Haar检测对象并创建一个“人物跟踪器”来跟踪他们的速度(移动)和测试在n + 1帧中检测到的对象(如果他们可能是同一个人)。然后在n个跟踪检测之后,您可以将该对象分类为“人”而不是误报,并且在非检测之后“忘记”该对象或将其标记为丢失。

一种跟踪方法是在检测到的AreaOfInterest(Haar矩形)上使用光流,并尝试确定人的移动。这很简单,但可能证明是有效的。当然有更复杂和准确的跟踪方法。

如果您的相机静止,这不是很难,否则会变得复杂。重叠的人也很棘手。

您可以使用的方法取决于此工具的应用。如果您想要实时跟踪某些选项不可用,那么在后期处理中您可以回溯帧,例如在确定它们不是真正的检测后过滤掉误报。