C++ 如何从矢量中删除重复矩形<;Rect>;?

C++ 如何从矢量中删除重复矩形<;Rect>;?,c++,opencv3.0,C++,Opencv3.0,我有许多矩形存储在向量中。但里面有很多重复的矩形。如何移除它们?例如: Point Pt1(267, 83); Point Pt2(487, 167); Rect rec1(Pt1, Pt2); GroundTruthSet.push_back(rec1); Point Pt3(257, 90); Point Pt4(450, 150); Rect rec2(Pt3, Pt4); G

我有许多
矩形
存储在
向量
中。但里面有很多重复的矩形。如何移除它们?例如:

    Point Pt1(267, 83);                 
    Point Pt2(487, 167);
    Rect    rec1(Pt1, Pt2);
    GroundTruthSet.push_back(rec1);


    Point Pt3(257, 90);
    Point Pt4(450, 150);
    Rect    rec2(Pt3, Pt4);
    GroundTruthSet.push_back(rec2);

    Point Pt5(267, 83);                 
    Point Pt6(487, 167);
    Rect    rec3(Pt1, Pt2);
    GroundTruthSet.push_back(rec3);
如何删除
向量中的重复矩形?

您需要在
矩形上创建一个。对于矩形,比较它们各自的组件就足够了

auto comp_lt = [](const Rect& lhs, const Rect& rhs) {
    // compare each component in the following lexicographical order
    return std::tie(lhs.x, lhs.y, lhs.width, lhs.height) <
        std::tie(rhs.x, rhs.y, rhs.width, rhs.height);
};
auto comp_eq = [](const Rect& lhs, const Rect& rhs) {
    // `std::unique` uses equality-comparison, not less-than-comparison
    return std::tie(lhs.x, lhs.y, lhs.width, lhs.height) ==
        std::tie(rhs.x, rhs.y, rhs.width, rhs.height);
};

std::sort(std::begin(GroundTruthSet), std::end(GroundTruthSet), comp_lt);
auto pivot = std::unique(std::begin(GroundTruthSet), std::end(GroundTruthSet), comp_eq);
v.erase(pivot, std::end(GroundTruthSet));
auto comp\u lt=[](常量Rect&lhs,常量Rect&rhs){
//按以下词典顺序比较每个成分
返回标准:系结(左侧x、左侧y、左侧宽度、左侧高度)<
标准:系结(rhs.x、rhs.y、rhs.width、rhs.height);
};
自动补偿均衡器=[](常数矩形和左侧、常数矩形和右侧){
//`std::unique`使用相等比较,不少于比较
返回标准:系结(左侧x、左侧y、左侧宽度、左侧高度)==
标准:系结(rhs.x、rhs.y、rhs.width、rhs.height);
};
标准::排序(标准::开始(GroundTruthSet)、标准::结束(GroundTruthSet)、组件);
自动枢轴=标准::唯一(标准::开始(地面真相集)、标准::结束(地面真相集)、补偿均衡);
v、 擦除(轴,标准::结束(地面设置));

首先将它们存储在一个集合中,然后复制到vector?std::sort+std::unique+erase。。。。假设您的
Rect
类具有合理的相等和比较操作(如果没有,则实现它们!),但vect无法排序。您可以使用来使比较稍微不那么难看。由于问题标记打开CV3,您可以将
(y1,y2,x1,x2)
更改为
(x,y,width,height)
:@ilent谢谢,只需设置它