2013-07-08 43 views
2

我的問題是類同的一個a cv::Mat of std::vector ... how do I?如何定義和使用用戶類型的OpenCV的墊

我需要一個矩陣,每個元素都是一個std :: vector的。這個矩陣是在一系列相同大小的圖像(如視頻)上完成的計算輸出。許多計算都是典型的cv函數(轉換爲灰度,盒式濾波器等),然後將像素的值添加到矢量中。我不事先知道有多少圖像將有在任何情況下,我不能使用的圖像可能會超過512

一個建議的答案有使用指針的墊材的渠道理念。所以如果我嘗試以下方法,它會起作用嗎?

這將在Windows機器上,我明白,指針大小INT-PTR 64位寬。然後我可以使用CV_64,但只定義了CV_64F。由於我不會用這個矩陣做任何計算,我可以使用它來存儲指針。我在考慮在讀取第一張圖片之前,我會得到大小,創建這個矩陣,使用「new std :: vector」爲每個像素創建矢量並將該指針存儲在元素中。在我的計算循環中,我使用相同的訪問偏移來讀取原始圖像並將輸出存儲在向量中。當我完成向量時,我需要在釋放cv :: mat之前刪除這些向量。

我很欣賞那些對opencv比我更瞭解的人的任何意見 - 這實在是來自opencv的第一個應用程序。

+1

鑑於這是您的第一個OpenCV應用程序,我可能會建議將您的用戶類型放入矩陣可能不是您想要執行的操作嗎?難道你不能創建一個存儲普通值矩陣的用戶類型,然後存儲這些矩陣的矢量,其中每個矢量元素代表一幀的結果? – paddy

+0

正如我引用的例子,我需要快速訪問第三維中的所有數據。一個矩陣向量不會給我這個。 –

回答

2

嘗試

cv::Mat_<your_type> 

http://docs.opencv.org/modules/core/doc/basic_structures.html#id7

特別是:

To use Mat_ for multi-channel images/matrices, pass Vec as a Mat_ parameter 

有一個很好的例子,你可以使用的Vec 自己的 「混合」(假設的大小每個元素的數組/矢量是固定的),或者如果你真的需要你可以使用std::vector

+0

謝謝!這應該做到這一點。由於我不會在編譯時(實際上在運行時計算之前)知道,我將擁有多少圖像,因此我無法使用已知大小的矢量。我會嘗試Mat_並更新我的成功。 –

+0

這是我所做的 - 它似乎按預期工作。
typedef std :: vector MyVector,* LPMyVector;
cv :: Mat_ m_matPtrs;
在開始時,我分配這些矢量並將其用於我的計算。這使我可以使用opencv函數處理圖像,並將結果存儲在同一個循環中的矩陣中。
曾經感謝你。 –