【发布时间】:2015-04-01 01:51:15
【问题描述】:
我有一个结构的向量
vector<contour> hotspots;
轮廓是我定义如下的结构
struct contour
{
double arc;
double area;
Point2f center;
double me;
double hullArea;
vector<Point> contourVector;
vector<Point> hullVector;
bool operator <(const contour& comp)
{
return me < comp.me;
}
};
所以我要做的是循环遍历它并删除包含在另一个轮廓中的每个轮廓,我可以让它在大多数情况下工作,但有时我会遇到索引错误,我假设它有事可做当我擦除一个元素时,索引会变得混乱,所以我超出了范围。这是我写的循环:
vector<vector<Point>> cleanUp(vector<Point2f> centers, vector<Moments> areas, vector<vector<Point>> contours)
{
for (int i = 0; i < contours.size(); i++)
for (int j = 0; j < contours.size(); j++)
if (i != j)
{
if ((areas[i].m00 < areas[j].m00) == true && (pointPolygonTest(contours[j], centers[i], false) > 0) == true)
{
contours.erase(contours.begin() + i);
centers.erase(centers.begin() + i);
areas.erase(areas.begin() + i);
}
}
return contours;
}
我尝试了几种不同的解决方案,例如 i - 1,但删除了错误的轮廓,而不是使用擦除,而是用最后一个覆盖我要删除的元素,然后使用 .pop_back 删除最后一个元素,但是似乎也没有工作。有什么想法吗?
编辑:修复了区域和中心不同步的问题,但现在只要我调用函数擦除一些轮廓,问题就会立即出现。
【问题讨论】:
-
您的
areas和contours在第一次删除后“不同步”。您应该从两者中删除东西,或者想出一些其他方式将区域和轮廓表示为单个项目。 -
上帝...我什至没有意识到我没有这样做,我什至在我计划的时候考虑过...谢谢。
标签: c++ visual-studio opencv vector contour