cv :: Mat of std :: vector ... как мне это сделать? - PullRequest
1 голос
/ 14 октября 2011

Я пытаюсь создать матрицу openCV, где каждый элемент матрицы является std :: vector ... но я не могу заставить его работать. Вот что я делаю:

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

Весь код компилируется, но по стоимостиVol (0,1) = slice0; выдает ошибку доступа к памяти. Я предполагаю, что это потому, что матрица не была правильно инициализирована ... может кто-нибудь сказать мне, как правильно инициализировать cv :: Mat costVol. В идеале мне бы хотелось, чтобы он был инициализирован пустым вектором или даже вектором размера, скажем, 5 со всеми элементами по умолчанию.

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Я не уверен, что вы можете сделать это таким образом - и я уверен, что вы не хотите!

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 голос
/ 15 октября 2011

Если все ваши векторы имеют одинаковую фиксированную длину, лучшим выбором будет многоканальный мат (поддерживаемое количество каналов 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);
0 голосов
/ 14 октября 2011

Почему бы не использовать 3D-матрицу?

Класс Mat можно превратить в куб с помощью такого использования:

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

Или, если вам нужнокомпактные качества «зубчатой» трехмерной матрицы, вы можете взглянуть на класс 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...