2011-10-13 62 views
1

我想創建一個openCV矩陣,矩陣的每個元素都是一個std :: vector,但是我似乎無法讓它工作。這是我在做什麼:a cv :: std :: vector的Mat ...我怎麼樣?

cv::Mat_<std::vector<double> > costVol(3,5); 
std::vector<double> slice0; 
slice0.push_back(8.0); 
costVol(0,1)=slice0; 

整個代碼編譯,但在costVol(0,1)= slice0;它會引發內存訪問錯誤。我猜這是因爲矩陣沒有被正確初始化......有人可以告訴我如何正確初始化cv :: Mat costVol。我理想地喜歡它被初始化爲一個空矢量,或者甚至是一個大小的矢量,默認情況下,所有元素都是5。

+0

哇..我從來沒有一個問題沒有迴應2小時!這是一個非常愚蠢的問題?我嘗試使用'cv :: Mat_ >'它工作,但openCV要求在編譯時知道numChannels。這不符合使用std :: vector的目的。只有在運行時才知道numChannels。 – Mustafa

+0

你是怎麼解決這個問題的? – subzero

回答

2

我不確定你是否可以這樣做 - 我敢肯定你不想!

cv :: Mat旨在存儲用於圖像處理的幾個預定義內置類型的1維或2維陣列。你可以讓它使用你自己的外部存儲器(它可以在向量中)用於實際數據並使用它的映射函數 - 但是你只能對與其預定義內置函數範圍相匹配的類型執行此操作。

例如。

std::vector<double> myData; 

// fill with 100 items 
myData.push_back(.....); 

// create a 10x10 cv::Mat pointing at the 100 elements of myData 
cv::Mat matrix(10,10,CV_32FC1,&myData.front()); 

你想做什麼?

+0

嗯...這非常接近我想要做的事情。我想基本上建立一個3D卷。 cv :: Mat索引空間中的高度x寬度區域,矢量索引空間中的離散深度。我希望它是一個向量,因爲只有一些深度有與他們相關的價值。你上面概述的代碼是矩陣的每個(i,j)元素指向相同的myData?可以每個(i,j)指向不同的myData ...對於空間中的每個(x,y)位置都是唯一的,我希望在(x,y)處保持特定深度值的唯一向量 – Mustafa

+1

cv :: Mat可以存儲N維。 – mevatron

+0

@Mustafa - 你可以存儲指向vector的cv :: Mat(假設你的機器的指針大小適合CV_xxC1類型之一),但是在openCV中有更好的方法來做3D矢量 –

0

爲什麼不使用3D矩陣?

Mat類可以通過使用可以變成一個立方體這樣的:

// create a 100x100x100 32-bit array 
int sz[] = {100, 100, 100}; 
Mat bigCube(3, sz, CV_32F, Scalar::all(0)); 

或者,如果你需要節省空間的一個「鐵血」 3D矩陣的素質,你可以看看SparseMat類。

另外,如果你這樣做是在運行時,你可以這樣做:

int sz[3] 
int dimSize[3]; 

// fill in your dynamic dimensions here... 

for(int i = 0; i < 3; i++) 
{ 
    sz[i] = dimSize[i]; 
} 

Mat* threeD = new Mat(3, sz, CV_32F, Scalar::all(0)); 
+0

使用Mat的問題作爲3D數組的類是沒有任何現有的功能來查找沿着特定維度的最小值。如果將矩陣想象爲一個平面,將第三維想象爲深度,那麼我希望能夠在每個(x,y)位置沿深度方向取最小值。 openCV沒有任何預先存在的功能。 – Mustafa

1

如果你所有的矢量具有相同的小固定長度,那麼最好的選擇將是一個多通道墊(支持的頻道數是1-512):

typedef cv::Vec<double, 5> Vec5d; 

cv::Mat costVol(3, 5, Vec5d::type); 
costVol = Vec5d::all(0.0);//set all elements of costVal to zero 

//find minimum at (i,j) location 
double min; 
cv::minMaxLoc(costVol.at<Vec5d>(i,j), &min);