比较两个std :: vector <cv :: point>向量和安全公共点到第三个std :: vector <cv :: point>

时间:2016-01-11 14:07:07

标签: c++ opencv vector

我正在寻找virtual void DoSomething() override = 0;函数的替代版本,但是std::set_intersection向量。

我尝试比较两个不同大小的std::vector<cv::Point>个向量。这两个包含坐标列表。交叉方法的主要任务现在应该是检测公共对并通过std::vector<cv::Point>

将它们安全地保护到第三个std::vector<cv::Point>

我搜索了push_back()

这样的函数

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

由于您需要调用比较器三次,因此使用函数而不是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;
}