[英]no matching function for call to ‘normalize(cv::Point3f&)’ error
在使用 gcc 9.3.0 和 Z5BD4C87976F48E6A53919D53E040 的代碼片段中,我no matching function for call to 'normalize(cv::Point3f&)'
錯誤。
cv::Point3f p{3, 0, 0}, q{0, 2, 0};
p.cross(q);
cv::normalize(p);
根據當前文檔, cross
和normalize
都接受相同的參數類型,即const Vec< _Tp, cn > &
。 為什么然后調用cross
編譯,但調用normalize
不呢?
編輯
我知道cv::normalize((Vec3f)p);
作品。 問題是為什么這里需要顯式轉換到Vec3f
,但在cross()
的情況下不需要?
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() 的情況下
cross
是 class cv::Point3_
的一種方法
還要注意cv::Point3_
有一個用於cv::Vec
的重載轉換運算符
//! conversion to cv::Vec<>
operator Vec<_Tp, 3>() const;
根據 4.3.0 的文檔,您需要包含<opencv/core/matx.hpp>
,您嘗試過嗎?
我也從文檔中了解到您需要分配返回值,輸入參數是 const,並且您也需要為叉積執行此操作。 所以它會是這樣的:
#include <opencv/core/matx.hpp>
...
cv::Point3f p{3, 0, 0}, q{0, 2, 0};
auto normalized = cv::normalize(p.cross(q));
--EDIT-- 類型也存在不匹配( 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?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.