如何有效地传递std :: vector <cv :: point3f>的子向量作为参数(不拥有函数)

时间:2019-04-03 11:34:11

标签: c++ opencv

我正在尝试使用opencv函数,该函数在其他参数中接受std::vector<cv::Point3f>。在我的程序中,我有一个std::vector<cv::Point3f> worldPoints和另一个std::vector<int> mask,它们的尺寸都比我要发送的尺寸大。

我想做的是尽可能高效地仅将具有各自非零掩码的条目传递给opencv函数。

std::vector<cv::Point3f> worldPointsSubset;
for (int i=0; i<mask.size(); i++) {
    if (mask[i] != 0) {
        worldPointsSubset.push_back(worldPoints[i]);
    }
}

// Then use worldPointsSubset in function

还有其他解决方法,可能不涉及数据复制吗?

编辑1:我指的功能是solvePnPRansac()

2 个答案:

答案 0 :(得分:1)

您调用的函数需要一个Point3f向量,因此,如果您唯一拥有的是屏蔽向量,则必须首先复制数据。如果该函数不接受向量及其掩码,则无法解决此问题。

要查看此副本是否存在问题,必须首先评估性能下降并查看此副本是否是瓶颈。如果这是瓶颈,那么第一件事就是计算所需的点数并在worldPointsSubset中保留该容量。

答案 1 :(得分:0)

如果没有副本,则无法将数据从std::vector<int>转换为std::vector<cv::Point3f>,因为尽管您看到相同的值,但数据大小可能会有所不同。

但是您可以将正在处理的数据类型(从std::vector<int>更改为std::vector<cv::Point3f>),并直接与cv::Point3f一起使用,并在需要时将其传递给solvePnPRansac()。 / p>