如何使用opencv的功能?

时间:2016-06-10 08:22:02

标签: c++ opencv

this帖子和this帖子类似,我希望通过修改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"

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

1 个答案:

答案 0 :(得分:1)

Welk ......如果你想要明智的答案,你应该向我们展示你的确切代码,但是......

如果我没有错,请输入&#39; ::&#39;必须是类或命名空间名称&#34;是误导性的:也可以是静态方法名称,这是你的意图。

我认为这个问题是另一个问题。

convert()中定义了两个EllipticKeyPoint静态方法:第一个在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 keypoints1 EllipticKeyPoint, I suppose you should define, together keypoints2`的向量中转换and的向量,那么另外几个向量,例如

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;