是否可以在不复制数据的情况下创建cv::Mat
from std::vector<std::vector<T>>
,其中所有向量的宽度都相同,即只创建标题,因为它可以用于创建cv::Mat
from std::vector<T>
?
我有一个包装器,它只能在接口中使用 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
在您的通用代码中使用它可能会很好地解决您的问题。