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;