是否有可能创建从std::vector<std::vector<T>>
,其中所有矢量具有相同的宽度,cv::Mat
而不复制数据,即只创建头,因为它可以用于从std::vector<T>
创建cv::Mat
?OpenCV的矩阵而不复制数据
我有一个包装只能在接口中使用STL类型,并将它们传递给基础OpenCV函数。我想避免来回过度的转换。
是否有可能创建从std::vector<std::vector<T>>
,其中所有矢量具有相同的宽度,cv::Mat
而不复制数据,即只创建头,因为它可以用于从std::vector<T>
创建cv::Mat
?OpenCV的矩阵而不复制数据
我有一个包装只能在接口中使用STL类型,并将它们传递给基础OpenCV函数。我想避免来回过度的转换。
一般来说,没有。你不能对每个内部std :: vector的相对内存位置做任何保证。一个cv :: Mat需要它的所有内存是连续的,或者在每一行之间都有一个可预测的跳转。它只存储一个指向数据开始的指针,访问你的内部向量需要每个向量的指针。
如果你可以以某种方式保证你的记忆是连续的,那么你可以。
如果你真正需要的是效率,你应该根据使用此构造工作:
// C++:
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)¶
此构造方法不复制数据,这是在任何低效率可能会撒谎。 因此,而不是有嵌套的向量,有一个包含所有数据的单个向量。
请注意,向量中的数据的生命周期必须足以访问矩阵,这意味着您也无法修改向量的大小,因为这可能导致基础数据无效,即&v[0]
。
如果您可以在您的通用代码中使用boost::matrix
,那么它很可能会解决您的问题。
尽管下面的答案,这是可能的....有点“欺骗” – DmitryK