我有一个包含图像轮廓的向量。代码如下:
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()
它实际上是如何工作的(例如在内存位置领域)。
是否有人知道是否有更快和/或“更智能”的方式来解决此问题?提前致谢。
考虑到您以后肯定要对轮廓进行处理,调整大小可能不会成为程序中的性能热点。
在c ++中创建矢量时通常会有些懈怠。它们可能会占用当前内存大小的两倍。
如果调整向量的大小,它将首先检查调整大小是否适合保留的内存。如果是这种情况,则调整大小是免费的。
否则,将保留新的内存(最大为新大小的两倍),并将当前矢量内容移到那里。
由于向量在开始时是空的,因此无论如何它们都必须保留新的内存,因此(考虑到合理的编译器和标准库),很难在实现速度上击败对手。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句