2013-01-23 47 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,那麼它很可能會解決您的問題。