簡體   English   中英

沒有匹配的 function 調用 'normalize(cv::Point3f&)' 錯誤

[英]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);

根據當前文檔, crossnormalize都接受相同的參數類型,即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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM