C++ 不复制数据的矢量的矢量的OpenCV矩阵

C++ 不复制数据的矢量的矢量的OpenCV矩阵,c++,opencv,C++,Opencv,是否可以从std::vector创建cv::Mat,其中所有向量的宽度相同,而无需复制数据,即只创建标题,就像从std::vector创建cv::Mat一样 我有一个包装器,它只能在接口中使用STL类型,并将它们传递给底层的OpenCV函数。我希望避免过度的来回转换。一般来说,不会。您无法保证每个内部std::vector的相对内存位置。一个cv::Mat需要它的所有内存是连续的,或者在每一行之间有一个可预测的跳转。它只存储一个指向其数据开头的指针,访问内部向量需要每个向量都有一个指针 如果你能

是否可以从
std::vector
创建
cv::Mat
,其中所有向量的宽度相同,而无需复制数据,即只创建标题,就像从
std::vector
创建
cv::Mat
一样


我有一个包装器,它只能在接口中使用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
,它可能会很好地解决您的问题。

尽管下面给出了答案,但还是有可能……只需一点“作弊”