我通过OpenCV获得了一个vector<vector<Point>>
数据。由于某些原因(例如偏移/缩放),我需要将数据Point
转换为Point2f
。我该怎么做?
例如:
std::vector<std::vector<Point> > contours;
std::vector<std::Vec4i> hierarchy;
cv::findContours(edges, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
std::vector<std::vector<Point2f> > new_contour;
我需要new_contour
,它是Point2f
的vector
的vector
。有没有简单的方法将它转换为浮点类型?然后我可以通过替换每个Point2f
数据来做一些修改(例如偏移/缩放)。
我尝试使用push_back
。但仍然得到错误时,建设...
2条答案
按热度按时间mwyxok5s1#
可以使用2个嵌套循环:一个用于外部
vector
,一个用于内部。在下面的代码中,您可以替换int
和float
之间的普通转换,并应用您需要的任何转换。注意,对于输出轮廓,我使用
std::vector::resize
分配了外部向量,然后以类似的方式分配了循环中的所有内部vector
。或者,您可以使用
std::vector::reserve
执行所有分配,并使用std::vector::push_back
添加元素。另一种实现方法是使用
std::transform
(在这里,我发现使用适当的std::vector
构造函数分配向量很方便):第2版实际上实现了您所需要的确切操作(从一种表示转换为另一种表示)。
whitzsjs2#
我首先关注你真正的问题,也就是类型转换。假设我们有一些基本的类型别名,以使我们的工作更容易:
为了解决这个问题,我们采用“分而治之”的原则:
转换单个点
这实际上是微不足道的,因为
cv::Point_
提供了一个强制转换操作符,允许隐式转换到不同数据类型的点,因此,转换是通过一个简单的赋值来完成的:转换点的向量
由于点的隐式转换是可能的,这也同样简单--我们简单地构造新向量,使用迭代器对初始化它:
转换点矢量的矢量
我们在一个循环中完成上述操作。为了提高性能,我们可以在目标向量中使用
reserve
空间来避免重新分配。然后,我们使用emplace_back
来构造点的向量,使用迭代器对来初始化它们。转换期间的附加操作
@wohlstad的回答已经提供了一些可能的方法,然而,查看使用
std::transform
的第二段代码让我想知道是否有一种方法可以使它变得更简洁,也许可以利用更新的标准(如c++20)提供的特性,下面是我使用std::views::transform
的方法。首先,我们创建一个“范围适配器闭包”来 Package 我们的转换lambda函数,它应用了一些常量缩放和偏移:
接下来,我们创建一个整数点向量的输入向量的外部转换视图,lambda函数将使用之前创建的“范围适配器闭包”创建一个内部转换视图,并使用此视图构造一个浮点数向量:
最后,我们将构造一个浮点向量的向量,使用这个视图的迭代器对:
示例代码
示例输出