我有一个包含图像轮廓的矢量。代码如下所示:
cv::Mat img = cv::imread ("whatever");
cv::Mat edges;
double lowThresh = 100, highThresh = 2*lowThresh;
Canny(img, edges, lowThresh, highThresh);
std::vector<std::vector<cv::Point>> contourVec;
std::vector<cv::Vec4i> hierarchy;
int mode = CV_RETR_LIST;
int method = CV_CHAIN_APPROX_TC89_KCOS;
findContours(edges, contourVec, hierarchy, mode, method);
我现在想做的是改变这些观点。因此,我创建了另一个向量,它与另一个向量具有相同的结构,仅使用Point3d
元素而不是Point
。目前,我这样做:
std::vector<std::vector<cv::Point3d>> contour3DVec(contourVec.size());
for (int i = 0; i < contourVec.size(); i++)
contour3DVec[i].resize(contourVec[i].size());
但是我不确定这是否真的是最好的方式,因为我不知道resize()
实际上是如何工作的(例如在内存位置领域)。 / p>
是否有人知道是否有更快和/或更智能的&#34;解决这个问题的方法?提前谢谢。
答案 0 :(得分:2)
鉴于您确实希望事后对轮廓做一些事情,调整大小可能不会成为您计划中的性能热点。
c ++中的向量通常会有一点松弛来增长。它们可能会占用当前大小的两倍。
如果您调整矢量大小,它将首先检查调整大小是否适合保留的内存。 如果是这种情况,则调整大小是免费的。
否则将保留新内存(最多为新大小的两倍)并且当前矢量内容会移动到那里。
由于你的向量在开始时是空的,所以无论如何它们都必须保留新的内存,所以(给定一个理智的编译器和标准库),很难明智地击败你的实现。
答案 1 :(得分:1)
如果您想要3d积分,您必须逐个手动创建它们:
std::vector<std::vector<cv::Point3d>> contour3DVec(contourVec.size());
for (size_t i = 0; i < contourVec.size(); i++)
{
for (size_t j = 0; j < contourVec[i].size(); j++)
{
Point p = contourVec[i][j];
contour3DVec[i].push_back( Point3d(p.x, p.y, 1) );
}
}