我正在尝试使用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()
答案 0 :(得分:1)
您调用的函数需要一个Point3f
向量,因此,如果您唯一拥有的是屏蔽向量,则必须首先复制数据。如果该函数不接受向量及其掩码,则无法解决此问题。
要查看此副本是否存在问题,必须首先评估性能下降并查看此副本是否是瓶颈。如果这是瓶颈,那么第一件事就是计算所需的点数并在worldPointsSubset
中保留该容量。
答案 1 :(得分:0)
如果没有副本,则无法将数据从std::vector<int>
转换为std::vector<cv::Point3f>
,因为尽管您看到相同的值,但数据大小可能会有所不同。
但是您可以将正在处理的数据类型(从std::vector<int>
更改为std::vector<cv::Point3f>
),并直接与cv::Point3f
一起使用,并在需要时将其传递给solvePnPRansac()
。 / p>