怎么将vector<float> object_keypoints转化为Point2f ImgPoints
时间: 2024-09-30 11:05:16 浏览: 24
将`std::vector<float>`类型的object_keypoints转换为OpenCV的`std::vector<cv::Point2f>`类型的ImgPoints,你需要做的是逐个元素从`float`数组创建`cv::Point2f`结构。`cv::Point2f`通常表示二维空间中的一个点,它有两个浮点数成员分别代表x坐标和y坐标。
以下是一个简单的示例步骤:
```cpp
std::vector<cv::Point2f> ImgPoints;
for (size_t i = 0; i < object_keypoints.size(); i += 2) { // 假设keypoints按(x, y)对齐
float x = object_keypoints[i];
float y = object_keypoints[i + 1];
cv::Point2f point(x, y);
ImgPoints.push_back(point);
}
```
这里假设`object_keypoints`的每个元素包含一对x和y值,如果是其他情况,你需要根据实际键点数据的结构调整索引。
相关问题
怎么将std::vector<float> object_keypoints转化为vector<Point2f>
在C++中,`std::vector<float>`通常存储一维数据,比如坐标点的各个分量(x和y),而`cv::Point2f`是一个二维点结构,包含两个`float`类型的值。如果你想将`object_keypoints`这个一维向量转换成`vector<cv::Point2f>`,你需要创建一个新的二维向量,并按照每个元素包含x和y的方式来填充。
以下是步骤:
1. 首先,确保`object_keypoints`的大小是偶数,因为它应该包含一对(x, y)坐标对。
2. 创建一个新的`std::vector<cv::Point2f>`,假设名为`keypoints_vector`。
3. 使用循环遍历`object_keypoints`,例如使用`for`循环:
```cpp
for (size_t i = 0; i < object_keypoints.size(); i += 2) {
cv::Point2f point(object_keypoints[i], object_keypoints[i + 1]);
keypoints_vector.push_back(point);
}
```
这里i每次增加2是因为每对坐标占两个位置。
4. 现在`keypoints_vector`包含了从`object_keypoints`转换来的`cv::Point2f`对象。
怎么将vector<vector<float>> objects_keypoints转化为vector<Point2f> objects_keypoints
将`std::vector<std::vector<cv::Point2f>> objects_keypoints`转换为`std::vector<cv::Point2f>`,你需要将每个内部的二维向量展平到一个单一的一维向量中。cv::Point2f是一个包含两个元素(x坐标和y坐标)的简单结构。以下是步骤:
1. 首先创建一个新的`std::vector<cv::Point2f>`用于存储结果。
2. 使用范围for循环遍历外层的`objects_keypoints`,对于每个内层的向量,使用`std::copy`或者`std::move`函数将点逐个添加到新的一维向量中。例如:
```cpp
std::vector<cv::Point2f> flat_objects_keypoints;
flat_objects_keypoints.reserve(objects_keypoints.size() * objects_keypoints[0].size());
for (const auto& inner_keypoints : objects_keypoints) {
std::copy(inner_keypoints.begin(), inner_keypoints.end(), std::back_inserter(flat_objects_keypoints));
}
```
或者更简洁地使用`std::vector`的`insert`迭代器:
```cpp
flat_objects_keypoints.insert(flat_objects_keypoints.end(), objects_keypoints.begin(), objects_keypoints.end());
```
这样就完成了从嵌套向量到单维度向量的转换。
阅读全文