是否有可能創建從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