将两个 std::vector<cv::Point> 向量和安全公共点与第三个 std::vector<cv::Point> 进行比较

Posted

技术标签:

【中文标题】将两个 std::vector<cv::Point> 向量和安全公共点与第三个 std::vector<cv::Point> 进行比较【英文标题】:Compare two std::vector<cv::Point> vectors and safe common points to a third std::vector<cv::Point> 【发布时间】:2016-01-11 14:07:07 【问题描述】:

我正在寻找 std::set_intersection 函数的替代版本,但要用于 std::vector&lt;cv::Point&gt; 向量。

我尝试比较两个不同大小的std::vector&lt;cv::Point&gt; 向量。这两个包含坐标列表。类似交叉点的方法的主要任务现在应该是检测公共对并通过push_back() 将它们安全到第三个std::vector&lt;cv::Point&gt;

我搜索了类似std::set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v3));的函数

有什么办法解决这个问题吗?

【问题讨论】:

std::set_intersection 正是这样做的,有什么问题? v1v2 必须排序。 我之前对向量进行了排序,但出现错误 C2893: failed to specialize function template 'unknown-type std::less::operator()(_Ty1 &&,Ty2 && const' .(来自文件算法)。我使用的向量包含 x 和 y 坐标。std::sort(v1.begin(), v1.end()); std::sort(v2.begin(), v2.end()); std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3)); @Flippy 对std::sort 使用自定义比较,即std::sort(v1.begin(), v2.end(), [](cv::Point lhs, cv::Point rhs) return (lhs.x &lt; rhs.x || (lhs.x == rhs.x &amp;&amp; lhs.y &lt;= rhs.y)); 然后是 std::set_intersection 的相同自定义比较器。 【参考方案1】:

正如@BoBTFish 和@NaCl 已经提到的,您需要使用自定义比较器,并将set_intersection 应用于排序 向量。

由于您需要调用 3 次比较器,因此使用函数而不是 lambda 表达式会很有用。

#include <opencv2/opencv.hpp>
#include <vector>
#include <algorithm>

using namespace std;
using namespace cv;

// Custom less comparator
bool lessPoints(const Point& lhs, const Point& rhs) 
    return (lhs.x < rhs.x) || ((lhs.x == rhs.x) && (lhs.y < rhs.y));


vector<Point> intersection(vector<Point> v1, vector<Point> v2)

    vector<Point> v3;
    // Sort vectors
    sort(v1.begin(), v1.end(), lessPoints);
    sort(v2.begin(), v2.end(), lessPoints);
    // Intersect
    set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3), lessPoints);
    return v3;


int main()

    // Your vectors
    vector<Point> v1 Point(2,3), Point(1,2), Point(5,5), Point(3,4) ;
    vector<Point> v2 Point(2,1), Point(1,2), Point(3,4), Point(6,7), Point(0,3) ;

    // Find intersections
    vector<Point> v3 = intersection(v1, v2);

    // Print out vector content
    std::copy(v3.begin(), v3.end(), std::ostream_iterator<Point>(std::cout, " "));

    return 0;

【讨论】:

再次感谢,很大的帮助,用上面的 cmets 做了一个类似的交集方法,但现在可以了!

以上是关于将两个 std::vector<cv::Point> 向量和安全公共点与第三个 std::vector<cv::Point> 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

c ++两个线程之间更快的变量交换一个std :: vector <float *>和array

如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?

一起“移动”两个向量

如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix

指向 std::vector 的指针,指针声明

这段代码安全吗?将 std::vector<Derived*> 强制转换为 std::vector<Base*>