3

是否可以在不复制数据的情况下创建cv::Matfrom std::vector<std::vector<T>>,其中所有向量的宽度都相同,即只创建标题,因为它可以用于创建cv::Matfrom std::vector<T>

我有一个包装器,它只能在接口中使用 STL 类型并将它们传递给底层的 OpenCV 函数。我想避免来回过度转换。

4

2 回答 2

3

一般来说,没有。您不能对每个内部 std::vector 的相对内存位置做出任何保证。一个 cv::Mat 需要它的所有内存是连续的或者在每行之间有一个可预测的跳转。它只存储一个指向其数据开头的指针,并且访问您的内部向量需要每个向量的指针。

如果你能以某种方式保证你的记忆是连续的,那么是的,你可以。

于 2013-01-23T16:41:21.183 回答
1

如果你真正想要的是效率,你应该基于使用这个构造函数来工作:

// C++: 

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)¶

此构造函数不复制数据,这可能是效率低下的地方。因此,不要使用嵌套向量,而是使用包含所有数据的单个向量。

请注意,向量中数据的生命周期必须足以访问矩阵,这意味着您也不能修改向量的大小,因为这可能会使基础数据无效&v[0]

如果您被允许boost::matrix在您的通用代码中使用它可能会很好地解决您的问题。

于 2013-01-23T17:08:07.133 回答