计算检测到的对象OPENCV

Compute Detected objects OPENCV

本文关键字:对象 OPENCV 检测 计算      更新时间:2023-10-16

我正在为使用haar级联的计算人员创建一个程序。检测不会在一帧中给我所有的人,但在下一帧中,我检测到在前一帧中没有检测到的对象。

例如:在一个视频中,我有几个人在帧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;
}

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

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

哈尔分类器不是魔术,它是非常近似的。

例如,您可以使用Haar检测对象,并创建一个"个人跟踪器"来跟踪它们的速度(运动),并测试在n+1帧中检测到的对象(如果它们可能是同一个人)。然后,在n次跟踪检测后,你可以将该对象归类为"人",而不是假阳性,在n个未检测后,"忘记"该对象或将其标记为丢失。

一种跟踪方法是在检测到的兴趣区域(Haar矩形)上使用光流,并试图确定人的运动。这很简单,但可能会被证明是有效的。。当然,还有更复杂、更准确的追踪方法。

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

您可以使用的方法取决于此工具的应用程序。如果你想要实时跟踪,有些选项是不可用的,例如在后处理中,你可以反向跟踪帧,并在确定它们不是真实检测后过滤掉假阳性。