нет соответствующей функции для вызова ошибки 'normalize (cv :: Point3f &)' - PullRequest
1 голос
/ 07 мая 2020

Я получаю no matching function for call to ‘normalize(cv::Point3f&)’ ошибку в этом фрагменте кода с использованием g cc 9.3.0 и OpenCV 4.3.0:

    cv::Point3f p{3, 0, 0}, q{0, 2, 0};
    p.cross(q);
    cv::normalize(p);

Согласно текущей документации, как cross, так и normalize принять тот же тип параметра, который равен const Vec< _Tp, cn > &. Почему тогда вызов cross компилируется, а вызов normalize - нет?

EDIT

Я знаю, что cv::normalize((Vec3f)p); работает. Спрашивается, почему здесь необходимо это явное преобразование в Vec3f, а не в случае cross()?

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

cv::norm(...) дает вам норму (скалярное значение) вашего вектора. Вы можете нормализовать вектор, разделив его на норму.

Учитывая два вектора p, q, вы можете получить вектор нормали как:

cv::Point3f p{3, 0, 0}, q{0, 2, 0};
cv::Point3f r = p.cross(q);
cv::Point3f rn = r / cv::norm(r);

Вы также можете использовать cv::Vec3f вместо cv::Point:

cv::Vec3f p{3, 0, 0}, q{0, 2, 0};
cv::Vec3f r = p.cross(q);
cv::Vec3f rn = r / cv::norm(r);
// or
cv::Vec3f rm = cv::normalize(r);

Вопрос в том, почему здесь необходимо это явное преобразование в Vec3f

Поскольку cv :: normalized определен для cv::Vec_<Tp, 3>, а не для cv::Point3_<Tp>

template<typename _Tp, int cn> inline
Vec<_Tp, cn> normalize(const Vec<_Tp, cn>& v)
{
    double nv = norm(v);
    return v * (nv ? 1./nv : 0.);
}

Обратите внимание, что он просто делит вектор на его норму, как показано выше для случая cv::Point3f.

, но не в случае пересечения ()

cross - это метод класса cv::Point3_

Также обратите внимание, что cv::Point3_ имеет перегруженный оператор преобразования для cv::Vec

//! conversion to cv::Vec<>
operator Vec<_Tp, 3>() const;
0 голосов
/ 07 мая 2020

Согласно do c для 4.3.0, вам нужно включить <opencv/core/matx.hpp>, вы пробовали это?

Я также понимаю из do c, что вам нужно назначить возвращаемое значение, входной аргумент - const, и вам нужно сделать это также для перекрестного произведения. Так что это будет что-то вроде:

#include <opencv/core/matx.hpp>
...
cv::Point3f p{3, 0, 0}, q{0, 2, 0};
auto normalized = cv::normalize(p.cross(q));

- РЕДАКТИРОВАТЬ. Также есть несоответствие в типе (Vec вместо Point). Эта последняя версия отлично собирает:

cv::Vec3f p{3, 0, 0}, q{0, 2, 0};
auto normalized = cv::normalize(p.cross(q)); // Defined only for Vec_
cv::Point3f p3 = normalized; // Get back a Point3f, or continue with a Vec?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...