将两个 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<cv::Point>
向量。
我尝试比较两个不同大小的std::vector<cv::Point>
向量。这两个包含坐标列表。类似交叉点的方法的主要任务现在应该是检测公共对并通过push_back()
将它们安全到第三个std::vector<cv::Point>
我搜索了类似std::set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v3));
的函数
有什么办法解决这个问题吗?
【问题讨论】:
std::set_intersection
正是这样做的,有什么问题? v1
和 v2
必须排序。
我之前对向量进行了排序,但出现错误 C2893: failed to specialize function template 'unknown-type std::lessstd::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));
std::sort
使用自定义比较,即std::sort(v1.begin(), v2.end(), [](cv::Point lhs, cv::Point rhs) return (lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y <= 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