Как разместить элементы матрицы в c ++ opencv? - PullRequest
2 голосов
/ 07 мая 2011

Я всегда использовал C API и пытаюсь преобразовать простой проект в C ++ API, чтобы справиться с ним, но я не могу понять, как распределить элементы матрицы в C ++.Например, у меня есть следующий массив:

double rotation[] = { 0, 1, 0,
                     -1, 0, 0,
                      0, 0, 1 };

У меня есть мат 3x3, выделенный с Mat *rotation_vector = new Mat(3,3, CV_64FC1);

В C это будет просто cvInitMatHeader(rotation_vector, 3, 3, CV_64FC1, rotation);.Как это делается в C ++?

Ответы [ 2 ]

6 голосов
/ 07 мая 2011

Вы должны использовать какой-то вариант объекта cv :: Mat.

Для небольших матриц, где размер известен и фиксирован , вы можете использовать объект cv :: Matx:

cv::Matx33d rotation(  0.0, 1.0, 0.0,
                      -1.0, 0.0, 0.0,
                       0.0, 0.0, 1.0 );

Для массивов динамического размера вы используете объект cv :: Mat

cv::Mat aBigMatrix( 53, 71, cv::CV_64FC1, cv::Scalar::all( 0.0 ) );

Это создаст 2d-матрицу с шириной 53, высотой 71, каждый элемент является одноканальным значением 64-битной плавающей запятой (в основном, двойным), и все элементы будут установлены в 0.

В качестве альтернативы вы можете использовать шаблонный класс cv :: Mat_, и выгода заключается в более чистой инициализации (среди прочего):

cv::Mat_<double> anotherBigMatrix( 53, 71, 0.0 );

Это создаст матрицу, эквивалентную описанной выше.

Наконец, вы можете использовать класс матрицы шаблонов со списком инициализации, аналогичным тому, как вы делали бы это в обычном C:

Существует множество компромиссов при использовании различных классов, поэтому вам следует обязательно прочитать документацию OpenCV , чтобы выбрать правильный

1 голос
/ 09 мая 2011

Если вы просто хотите создать заголовок для уже выделенных данных, выполните:

cv::Mat rotation_matrix(3, 3, CV_64FC1, rotation)

это сделает Mat заголовком для этих данных (данные не будут скопированы). Если вы хотите скопировать его в новую матрицу, вы можете сделать:

cv::Mat new_matrix = rotation_matrix.clone();

Вы не хотите использовать new с cv::Mat (почти во всех случаях), это тип данных с подсчетом ссылок - считайте его умным указателем. То, что было CvMat*, должно быть cv::Mat (обратите внимание на отсутствие *).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...