一个cv :: std :: vector的垫子......我该怎么办?

时间:2011-10-13 20:37:56

标签: vector opencv

我正在尝试创建一个openCV矩阵,其中矩阵的每个元素都是std :: vector ...但我似乎无法让它工作。这就是我正在做的事情:

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。

3 个答案:

答案 0 :(得分: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()); 

你想做什么?

答案 1 :(得分:1)

如果你的所有向量都具有相同的小固定长度,那么最佳选择将是多声道Mat(支持的通道数为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);

答案 2 :(得分: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));