gpt4 book ai didi

c++ - 打开简历;对 vector 进行排序并删除某些条目

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:58 27 4
gpt4 key购买 nike

我有这个问题,我无法解决这个问题。我正在尝试检测和跟踪视频中的某些内容。因此,我使用了 GaussianBlur()、threshold()、findContours() 等函数

findContours() 为我提供了一个等高线 vector ,该 vector 稍后会转换为边界矩形。到目前为止,一切都很好。

我现在需要从带有边界矩形的 vector 中得到的是它们按大小 (area) 排序并且只包含未被另一个矩形包围的矩形。

为了更好地理解,我试着画了一个小草图,click here for image .

所以我正在寻找的是 #8 是第一个条目,然后是 #1, #3,....应删除 #2、#4、#9、#10 和 #11 等条目。

我知道 vector 不适合排序和删除。所以我尝试将 vector 复制到列表中,如下所示:

std::list<Rect> sorted_list(boundRect_temp.begin(), boundRect_temp.end());

但是现在我无法访问像area这样的成员变量。问题是算法不应该太耗时,这就是为什么我正在寻找一个好的解决方案。也许已经有一个功能?

最佳答案

1) 如果将 findContours() 与 CV_RETR_EXTERNAL 标志一起使用,则可以过滤大多数交叉点。这意味着不会返回包含在其他轮廓内的轮廓。当然,这不会阻止边界框相交的所有情况,但这会大大提高后处理的性能

2) vector 绝对有利于排序。代码将简短而高效。而且它比列表更好,因为数据在内存中是连续的。

3) 从 vector 中逐一删除值确实无效,但您不需要这样做。只需创建包含选定框的临时 vector ,如下所示:

vector < Rect > nonIntersect;
for(unsigned int i=0; i < sortedBoxes.size(); i++) {
bool toAdd = true;
Point center = (sortedBoxes[i].tl()+sortedBoxes[i].br())*0.5;
for(unsigned int j=0; j < nonIntersect.size(); j++)
if (nonIntersect[j].contains(center)) {
toAdd = false;
break;
}
if (toAdd)
nonIntersect.push back(sortedBoxes[i]);
}

这也可以“就地”完成,但何必呢。与原始图像的内存或 findContours 找到的轮廓的内存相比,此内存可忽略不计。

关于c++ - 打开简历;对 vector<Rect> 进行排序并删除某些条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21013500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com