如何使用OpenCV将向量向量的结构复制到另一个向量C++
How to copy the structure of a vector of vectors to another one in C++ using OpenCV
我得到了一个包含图像轮廓的向量。代码如下所示:
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++ 中的向量通常是在创建时稍微松弛才能增长的。它们可能会占用其当前内存大小的两倍。
如果调整矢量大小,它将首先检查调整大小是否适合保留的内存。如果是这种情况,调整大小是免费的。
否则,将保留新内存(最多是新大小的两倍),并将当前矢量内容移动到那里。
由于您的向量在开始时是空的,因此无论如何它们都必须保留新内存,因此(给定一个健全的编译器和标准库)很难击败您的实现速度。
如果你想要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) );
}
}
相关文章:
- 将指向给定子类的指针从一个向量复制到另一个向量
- 将字符向量复制到另一个向量
- 将shared_ptr的向量复制到抽象基的派生类
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 自定义类对象的C++向量 - 复制构造函数已删除 - std::ifstream
- 如何在C++中将一个对象从一个向量复制到另一个向量?
- 将特征向量复制到 C 数组
- 将std ::向量复制到CV :: Mat_的行操作相同
- 将向量复制到 std::string
- 如何以相反的顺序将整个向量复制到队列中
- 按索引将类类型元素从一个向量复制到另一个 c++
- 使用迭代器将向量复制到数组中
- 为什么是非法的:将指针向量复制到指向常量的指针向量中
- 将元素从一个向量复制到另一个向量的最有效方法,给定一个不被复制的索引列表
- C++-将数据从浮点向量复制到uint8向量
- 将字符串从向量复制到字符串
- 我可以使用STD ::复制将数据的位模式从整数向量复制到一系列未签名的字符
- 将指针从一个向量复制到另一个向量;地址指出了变化
- 如何将内容从一个字符串向量复制到另一个字符串向量
- 以相反的顺序将一个向量复制到另一个向量