C++ 计算检测到的对象OPENCV
我正在使用haar cascade创建一个计算程序。检测不会在一帧中显示所有人,但在下一帧中,我会检测到前一帧中未检测到的对象 在一段视频中,我看到了三个人 在第1帧中,我检测到人A和B 在第2帧中,我检测到人A和C 根据这两个框架是否有任何方法可以得到真实的人数 我使用了这个功能,但不可靠C++ 计算检测到的对象OPENCV,c++,opencv,haar-classifier,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<rec
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;
}
bool-isInside(矩形、点)
{
if(point.x>rectangle.x&&point.xrectangle.y&&point.y
您提供的代码无法深入了解您的检测方法等
你考虑过跟踪检测到的物体吗?如果没有某种跟踪,很难确定哪些检测是新的,哪些是重新检测
Haar分类器不是魔术,它是非常近似的
例如,您可以使用Haar检测对象,并创建一个“人员跟踪器”,该跟踪器将跟踪对象的速度(移动),并测试在n+1帧中检测到的对象(如果它们可能是同一个人)。然后,在n次跟踪检测后,您可以将该对象分类为“人”,而不是假阳性,在n次未检测后,“忘记”该对象或将其标记为丢失
跟踪的一种方法是在检测到的感兴趣区域(哈尔矩形)上使用光流,并尝试确定人的移动。这很简单,但可能被证明是有效的。。当然还有更复杂、更精确的跟踪方法
如果你的相机是静止的,这并不难,否则它会变得复杂。此外,重叠的人也很棘手
您可以使用的方法取决于此工具的应用。如果您想要实时跟踪,某些选项不可用,例如,在后处理中,您可以回溯跟踪帧,并在确定误报不是真实检测后过滤掉误报