如何使用 OpenCV 将向量的结构复制到 C++ 中的另一个向量

Posted

技术标签:

【中文标题】如何使用 OpenCV 将向量的结构复制到 C++ 中的另一个向量【英文标题】:How to copy the structure of a vector of vectors to another one in C++ using OpenCV 【发布时间】:2015-04-23 15:46:48 【问题描述】:

我有一个包含图像轮廓的向量。代码如下所示:

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);

我现在想做的是转换这些点。因此,我创建了另一个向量,它与另一个向量具有相同的结构,只是使用Point3delements 而不是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()实际上是如何工作的(例如在内存位置领域)。

有没有人知道是否有更快和/或“更智能”的方法来解决这个问题?提前致谢。

【问题讨论】:

嗨,我想创建一个结构。我还能用这样的方式打电话给findContours() 吗? struct xy cv::Point contour; cv::Point3d contour 3D; ... 所以函数调用看起来像这样:findContours(edges, xyVariable.contour, ...) 【参考方案1】:

鉴于您之后肯定想对轮廓做一些事情,调整大小可能不会成为您程序中的性能热点。

c++ 中的向量通常在创建时会稍有延迟。它们在内存中可能占用当前大小的两倍。

如果您调整向量的大小,它将首先检查调整大小是否适合保留的内存。 如果是这种情况,调整大小是免费的。

否则将保留新内存(最多为新大小的两倍)并将当前矢量内容移动到那里。

由于您的向量在开始时是空的,因此无论如何它们都必须保留新内存,因此(给定一个健全的编译器和标准库)在实现速度方面很难超越您的实现速度。

【讨论】:

感谢您的回复。那我就这样放着吧。【参考方案2】:

如果您想要 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) );
    

【讨论】:

这是一个关于进一步编程的有趣想法。我会试试的。非常感谢您的帮助。

以上是关于如何使用 OpenCV 将向量的结构复制到 C++ 中的另一个向量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将一个对象从一个向量复制到另一个向量?

将 Vector<float> 中的数据复制到 Vector<Mat> (Opencv/C++)

将矩阵中的列向量复制到opencv中另一个矩阵的每个列中

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?

如何在 C++ 中将两个向量复制到另一个向量

如何使用opencv从矩阵向量构造图像