gpt4 book ai didi

C++ OpenCV : Convert vector> to vector>

转载 作者:行者123 更新时间:2023-12-02 01:24:53 32 4
gpt4 key购买 nike

我得到一个vector<vector<Point>>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 PointPoint2f 。我怎样才能做到这一点?

例如:

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这是 vectorvectorPoint2f 。有没有简单的方法将其转换为浮点类型?然后我可以通过替换每个 Point2f 进行一些修改(例如偏移/缩放)数据。

我尝试使用push_back 。但构建时仍然出错...

最佳答案

您可以使用 2 个嵌套循环:一个用于外部 vector ,一个用于内部 vector 。在下面的代码中,您可以替换 intfloat 之间的简单转换,并应用您需要的任何转换。

请注意,对于输出轮廓,我使用 std::vector::resize 分配了外部 vector 然后以类似的方式分配循环中的所有内部 vector 。

或者您可以使用 std::vector::reservestd::vector::push_back 一起进行所有分配用于添加元素。

std::vector<std::vector<cv::Point>> contours;

// ... obtain the contours

std::vector<std::vector<cv::Point2f>> contours_float;
contours_float.resize(contours.size()); // allocate the outer vector
for (size_t i = 0; i < contours.size(); ++i)
{
auto const & cur_contour = contours[i];
auto & cur_contour_float = contours_float[i];
cur_contour_float.resize(cur_contour.size()); // allocate the current inner vector
for (size_t j = 0; j < cur_contour.size(); ++j)
{
auto const & cur_point = cur_contour[j];
// Here you can apply any transformation you need:
float x = static_cast<float>(cur_point.x);
float y = static_cast<float>(cur_point.y);
cur_contour_float[j] = cv::Point2f{ x,y };
}
}

实现此目的的另一种方法是使用 std::transform (在这里,我发现使用适当的 std::vector 构造函数来分配 vector 很方便):

std::vector<std::vector<cv::Point>> contours;

// ... obtain the contours

std::vector<std::vector<cv::Point2f>> contours_float(contours.size()); // allocate the outer vector
std::transform(
contours.begin(),
contours.end(),
contours_float.begin(),
[](auto const & cur_contour) -> auto
{
std::vector<cv::Point2f> cur_contour_float(cur_contour.size()); // allocate the current inner vector
std::transform(
cur_contour.begin(),
cur_contour.end(),
cur_contour_float.begin(),
[](auto const & cur_point) -> auto
{
// Here you can apply any transformation you need:
float x = static_cast<float>(cur_point.x);
float y = static_cast<float>(cur_point.y);
return cv::Point2f{ x,y };
});
return cur_contour_float;
});

第二个版本实际上实现了您所需的确切操作(从一种表示形式转换为另一种表示形式)。

关于C++ OpenCV : Convert vector<vector<Point>> to vector<vector<Point2f>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74994748/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com