Перейти к содержимому
Compvision.ru
mrgloom

Перемножение Vec3d и Mat_<double>?

Recommended Posts

Может ли OpenCV перемножать вектор с матрицей (Vec3d и Mat_<double>)?

*Не принимая во внимание, то что можно сковертить Vec3d в Mat руками и перемножить 2 Mat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, это вряд ли. Хотя, конечно, отсутствие этих методов не логично. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 hour ago, Smorodov said:

Нет, это вряд ли. Хотя, конечно, отсутствие этих методов не логично. 

Почему не логично? Хотите перемножить матрицу на вектор, приводите cv::Mat к cv::Matx, т.е. к матрице с известным размером)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну cv::Vec порождение cv::Matx, логично было бы видеть основные операции между ними.

Хотя самому при необходимости, написать, не вопрос но тогда можно было не вводить векторы, матрицы, а остановиться на тензорах и не путать народ :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
20 minutes ago, Smorodov said:

Ну cv::Vec порождение cv::Matx, логично было бы видеть основные операции между ними.

Хотя самому при необходимости, написать, не вопрос но тогда можно было не вводить векторы, матрицы, а остановиться на тензорах и не путать народ :)

Так Matx с Vec можно перемножать. Эти операции не определены только в том, случае, если вы используете cv::Mat, для которого заранее не тип ни размер не известны, для cv::Mat_<> тоже не определены... логика тут в том, что cv::Mat - это не матрица в математическом смысле (хотя может себя так вести в частных случаях) но имеющая некоторый набор операций (типа домножения на константу). А вот Matx - то уже матрица в математическом смысле, со всеми вытекающими.

Ну а если не хватает уже объявленых алиасов, то всегда можно написать ченить типа cv::Mat_<float, 3, 3> и оно тоже будет перемножаться с cv::Vec3f

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Судя по докам

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#matx

Matx не принимается во все ф-ии вместо Mat, так что последний вариант с Mat_ кажется самым нормальным решением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 minutes ago, mrgloom said:

Судя по докам

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#matx

Matx не принимается во все ф-ии вместо Mat, так что последний вариант с Mat_ кажется самым нормальным решением.

так если надо что-то куда-то передать, то все виды Mat'ов приводятся друг к другу, при этом по умолчанию они будут создаваться на одной памяти, т.ч. приведение типов будет по сути бесплатным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проверил сегодня, такое вообще не компилится:

Mat_<double,3,3> M; 

error: wrong number of template arguments (3, should be 1)

 

а если так

Vec3d v1(1.0, 2.4, 4.4);

Mat_<double> M(3,3);

то

Vec3d v2= M*v1;

не компилится

error: no match for ‘operator*’ (operand types are ‘cv::Mat_<double>’ and ‘cv::Vec3d {aka cv::Vec<double, 3>}’)

 

вообщем только так заработало

Matx<double, 3, 3> M;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
46 minutes ago, mrgloom said:

Проверил сегодня, такое вообще не компилится:

Mat_<double,3,3> M; 

error: wrong number of template arguments (3, should be 1)

 

а если так

Vec3d v1(1.0, 2.4, 4.4);

Mat_<double> M(3,3);

то

Vec3d v2= M*v1;

не компилится

error: no match for ‘operator*’ (operand types are ‘cv::Mat_<double>’ and ‘cv::Vec3d {aka cv::Vec<double, 3>}’)

 

вообщем только так заработало

Matx<double, 3, 3> M;

Да, так и должно быть, это я с синтаксисом немного напутал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И еще Vec3d рассматриваются как вертикальные вектора (т.е. (3,1) ) когда перемножаются с матрицей?

т.к.

cout << "v2" << v1*M << endl; //так не работает
cout << "v2" << M*v1 << endl;//так работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 minutes ago, mrgloom said:

И еще Vec3d рассматриваются как вертикальные вектора (т.е. (3,1) ) когда перемножаются с матрицей?

т.к.

cout << "v2" << v1*M << endl; //так не работает
cout << "v2" << M*v1 << endl;//так работает

Да, в первом случае сработает

v1.t() * M

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×