【问题标题】:How to use a function from opencv?如何使用opencv中的函数?
【发布时间】:2016-06-16 18:37:24
【问题描述】:

类似于this 帖子和this 帖子,我想通过修改来自opencv 库的this 示例SURF 检测和匹配代码,将检测到的关键点转换为椭圆关键点。

但是,我对c++语法知之甚少,只熟悉matlab。以前的帖子似乎指向使用来自opencv库的evaluation.cpp的以下代码来转换它们:

void EllipticKeyPoint::convert( const std::vector<KeyPoint>& src, std::vector<EllipticKeyPoint>& dst )
{
    if( !src.empty() )
    {
        dst.resize(src.size());
        for( size_t i = 0; i < src.size(); i++ )
        {
            float rad = src[i].size/2;
            CV_Assert( rad );
            float fac = 1.f/(rad*rad);
            dst[i] = EllipticKeyPoint( src[i].pt, Scalar(fac, 0, fac) );
        }
    }
} 

关键点似乎是在示例代码的第 202 行之后生成的。所以我尝试了以下方法,通过添加将它们转换为椭圆关键点:

  • cv::EllipticKeyPoint::convert(keypoints1, keypoints1); 在第 202 行之后和
  • using namespace cv::xfeatures2d::EllipticKeyPoint在代码开头

但两者都显示错误:

  • name followed by '::' must be a class or namespace name
  • namespace "cv::xfeatures2d" has no member "EllipticKeyPoint"分别

我应该使用哪个类/命名空间/成员?如何正确编写代码,以便我可以使用此函数将关键点转换为椭圆关键点?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    好吧...如果您想要合理的答案,您应该向我们展示您的确切代码,但是...

    如果我没记错的话,消息“名称后跟 '::' 必须是类或命名空间名称”具有误导性:也可以是静态方法名称,这是您的意图。

    我想是另一个问题。

    EllipticKeyPoint中定义了两个convert()静态方法:第一个将KeyPoint的向量转换成EllipticKeyPoint的向量;第二个将EllipticKeyPoint的向量转换为KeyPoint的向量。

    但是当你打电话时

    cv::EllipticKeyPoint::convert(keypoints1, keypoints1);
    

    您尝试将keypoints1 转换为自身;所以(向量)KeyPointKeyPointEllipticKeyPointEllipticKeyPoint

    而你缺少这种类型的转换器。

    您的意图如下?

    cv::EllipticKeyPoint::convert( _keypoints1 , keypoints1 );
    

    calculateRepeatability() 我看到了

    EllipticKeyPoint::convert( _keypoints1, keypoints1 );
    EllipticKeyPoint::convert( _keypoints2, keypoints2 );
    

    所以要小心使用下划线 (_)。

    --- 编辑 2016.06.11 ---

    如果您的意图是将KeyPoint 的向量转换为EllipticKeyPoint, I suppose you should define, togetherkeypoints1andkeypoints2` 的向量,另外几个向量,类似于

    std::vector<KeyPoint> keypoints1, keypoints2;
    std::vector<EllipticKeyPoint> ellkeypoints1, ellkeypoints2;
    

    并且,当keypoints1keypoints2 全部加载时,调用convert();我想像

    std::cout << "FOUND " << keypoints1.size() << " keypoints on first image" << std::endl;
    std::cout << "FOUND " << keypoints2.size() << " keypoints on second image" << std::endl;
    
    EllipticKeyPoint::convert(keypoints1, ellkeypoints1);
    EllipticKeyPoint::convert(keypoints2, ellkeypoints2);
    
    std::cout << "FOUND " << ellkeypoints1.size() << " elliptic keypoints on first image" << std::endl;
    std::cout << "FOUND " << ellkeypoints2.size() << " elliptic keypoints on second image" << std::endl;
    

    【讨论】:

    • 确切的代码是示例 SURF 代码(帖子中的第三个链接)。我希望通过使用 opencv 库中现成的代码来添加 1 或 2 行。我尝试将您的 1 行代码添加到示例代码中,但没有成功。使用这个:cv::evaluateFeatureDetector(img1.getMat(ACCESS_READ), img2.getMat(ACCESS_READ), H,); 似乎有效,但我不明白第三个参数等等想要什么。对于所有不同类型的符号,我看起来很困惑。你能解释一下这是什么意思吗?
    • 我的意思是像“、&、*和::”这样的符号以及它们如何组合在一起让我感到困惑,因为我不熟悉 C++
    • @SK90 - 改进了答案以解释(我希望)如何使用convert();关于“,&,*,和::”的使用,嗯......你可以尝试询问单个示例,但很难给出一般性的答案; C++ 是一门复杂的语言,我建议通过一本好书或一个非常好的教程来学习它
    • 尝试了代码,但对我不起作用。将发布更具体的问题。谢谢。
    • 它有效。将evaluation.cpp中的转换函数定义和相关模板/类/函数定义复制并粘贴到示例代码中。
    猜你喜欢
    • 2017-03-20
    • 2019-12-05
    • 2018-12-29
    • 2010-11-01
    • 2013-02-03
    • 2012-04-17
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多