如何在 CvPoint 和 int 的结构上应用 std::sort 和 std::erase?

Posted

技术标签:

【中文标题】如何在 CvPoint 和 int 的结构上应用 std::sort 和 std::erase?【英文标题】:How to apply std::sort and std::erase on struct of CvPoint and int? 【发布时间】:2016-02-02 05:42:05 【问题描述】:

我有一个 CvPoint 和 int 结构,如下所示。

struct strcOfPoints 
        CvPoint p;
        int c;
    ;

我有一个这样的 strcOfPoints 向量

UniquePoints::strcOfPoints s1, s2, s3, s4, s5, s6, s7;
    s1.p =  33, 122 , s1.c = 255;
    s2.p =  68, 207 , s2.c = 158;
    s3.p =  162, 42 , s3.c = 120;
    s4.p =  219, 42 , s4.c = 50;
    s5.p =  162, 216 , s5.c = 20;
    s6.p =  162, 216 , s6.c = 20;
    s7.p =  162, 216 , s7.c = 20;
    vector <UniquePoints::strcOfPoints> strpts =  s1, s2, s3, s4, s5, s6, s7 ;

Q. 我们如何在 struct 的向量上应用 std::sort 和 std::erase 来删除重复点?

注意。我可以用点向量来做到这一点。但我没有为Point和int的结构向量做到这一点。

需要进一步处理的指南。谢谢

【问题讨论】:

您需要想出一种方法来比较您的结构,然后将其用作 std::sort 的第三个参数。 【参考方案1】:

首先,让我们构建一个比较器:

bool compare(strcOfPoints const & lhs, strcOfPoints const & rhs) 
    return std::tie(lhs.p, lhs.c) < std::tie(rhs.p, rhs.c);

接下来我们对向量进行排序:

vector<strcOfPoints> strpts =  s1, s2, s3, s4, s5, s6, s7 ;
std::sort(strpts.begin(), strpts.end(), compare);

最后我们删除所有重复项:

strpts.erase(
    std::unique(strpts.begin(), strpts.end(), compare),
    strpts.end());

【讨论】:

以上是关于如何在 CvPoint 和 int 的结构上应用 std::sort 和 std::erase?的主要内容,如果未能解决你的问题,请参考以下文章

3.1 OpenCV的基本数据类型

opencv的基本数据类型CvPoint,CvSize,CvRect,CvScalar

从“CvSeq”类型到“CvPoint*”类型的无效转换(如何在 Opencv 中进行类型转换)

如何从 vector<vector<Point>> 轮廓转换为 CVPoint 或 cvpoint2d32f?

从 cvpoint 转换为 cvpoint2d32f

OpenCV:我们是不是需要删除 CvPoint 以及如何删除?