2013-01-23 54 views
3

是否有可能创建从std::vector<std::vector<T>>,其中所有矢量具有相同的宽度,cv::Mat而不复制数据,即只创建头,因为它可以用于从std::vector<T>创建cv::MatOpenCV的矩阵而不复制数据

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

+0

尽管下面的答案,这是可能的....有点“欺骗” – DmitryK

回答

3

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

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

1

如果你真正需要的是效率,你应该根据使用此构造工作:

// C++: 

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

此构造方法不复制数据,这是在任何低效率可能会撒谎。 因此,而不是有嵌套的向量,有一个包含所有数据的单个向量。

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

如果您可以在您的通用代码中使用boost::matrix,那么它很可能会解决您的问题。