OpenCV的; 对vector <Rect>进行排序并删除某些条目

 低调酥紫_631 发布于 2023-02-04 22:41

我有这个问题我无法绕过头脑.我试图检测并跟踪视频中的某些内容.因此我使用的功能GaussianBlur(), threshold(), findContours(),.

findContours()给我一个轮廓矢量,后来转换成边界矩形.到现在为止还挺好.

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

我试图画一个小草图以便更好地理解,点击这里查看图片.

所以我要找的是#8第一个条目,然后是#1, #3,.... 条目,#2,#4, #9, #10 and #11应删除.

我知道向量不适合排序和删除.所以我试着将矢量复制到一个列表中,如下所示:

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

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

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

    2)向量绝对适合排序.代码简短而有效.并且它比列表更好,因为数据将在内存中连续.

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

    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找到的轮廓记忆相比,这种记忆是可以忽略的.

    2023-02-04 22:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有