OpenLV STL вектор в Mat для умножения матриц - PullRequest
3 голосов
/ 17 января 2012

Матричное умножение является очень простой задачей при обработке изображений, и OpenCV заботится о перегруженном * операторе.Вектор точек STL может быть преобразован в Mat путем приведения.

vector<Point2f> p1(2);
p1[0].x=1;p1[0].y=0;
p1[1].x=0;p1[1].y=1;
Mat p1M=Mat(p1);

Как упоминалось в документации OpenCV, это создаст матрицу с одним столбцом (с 2 элементами) со строками, равными ни одному из векторов:

[1 0;0 1]------>p1M.rows=2;p1M.cols=1

Это создает проблему, когда вы хотите умножить матрицу (p1M * p1M) ... [2x1] * [2x1] ??? ... По сути, я считаю, что весь вектор приведения к Matrixобъединить векторы как есть ....

Однако команда p1M.at<float> (0,1) и p1M.at<float> (1,0) возвращает 0 и 1 соответственно.это заставило меня думать, что p1M * p1M возможен, но, к сожалению, он только компилируется и генерирует ошибку времени выполнения:

Ошибка OpenCV: сбой подтверждения (a_size.width == len) в gemm, file / home /james / OpenCV-2.3.1 / modules / core / src / matmul.cpp, строка 708 завершается, после вызова экземпляра cv :: Exception what (): /home/james/OpenCV-2.3.1/modules/core / src / matmul.cpp: 708: ошибка: (-215) a_size.width == len в функции gemm

Я думаю о написании функции, которая просто делает это!вектор к мату и наоборот ... я что-то упустил?

1 Ответ

2 голосов
/ 08 сентября 2013

Возможно, вы захотите посмотреть в cv :: Mat :: reshape http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-reshape

Когда вы создаете Мат из списка точек, он создает один канал для каждого компонента точки. Поэтому, если вы используете Point3f, он делает Mat из одного столбца с 3 каналами.

Вы можете попробовать преобразовать p1M в ожидаемую матрицу, позвонив по номеру

p1M.reshape(1);
...