this post和this post类似,我想通过修改this示例SURF检测并匹配opencv库中的代码,将检测到的关键点转换为椭圆形关键点。

但是,我对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行之后生成的。所以我尝试通过添加以下内容将它们转换为椭圆关键点:

202行和之后的
  • cv::EllipticKeyPoint::convert(keypoints1, keypoints1);
  • 开头的
  • using namespace cv::xfeatures2d::EllipticKeyPoint
    但都显示错误:
  • name followed by '::' must be a class or namespace name
  • namespace "cv::xfeatures2d" has no member "EllipticKeyPoint"分别

  • 我应该使用哪个类/ namespace /成员?如何正确编写代码,以便可以使用此功能将关键点转换为椭圆形关键点?

    最佳答案

    编织...如果您需要明智的答案,则应向我们显示您的确切代码,但是...

    如果我没看错,那么消息“名称后跟'::'必须是类或 namespace 名称”会产生误导:也可以是静态方法名称,这就是您的意图。

    我想这是另一个问题。

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

    但是当你打电话

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

    您尝试将keypoints1转换为自身;所以KeyPoint(的 vector )到KeyPointEllipticKeyPointEllipticKeyPoint

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

    您的意图是以下?
    cv::EllipticKeyPoint::convert( _keypoints1 , keypoints1 );
    

    calculateRepeatability()中,我看到了
    EllipticKeyPoint::convert( _keypoints1, keypoints1 );
    EllipticKeyPoint::convert( _keypoints2, keypoints2 );
    

    因此请小心使用下划线(_)。

    ---编辑2016.06.11 ---

    如果您打算将KeyPoint的 vector 转换为EllipticKeyPoint, I suppose you should define, together keypoints1的 vector ,and keypoints2`,则另外两个 vector ,例如
    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;
    

    10-07 15:42