如何使用opencv的函数?

How to use a function from opencv?

本文关键字:函数 opencv 何使用      更新时间:2023-10-16

与这篇文章和这篇文章类似,我想通过修改此示例 SURF 检测和 opencv 库中的匹配代码,将检测到的关键点转换为椭圆关键点。

但是,我对 c++ 语法知之甚少,只熟悉 matlab。以前的帖子似乎指向使用以下来自 opencv 库的评估.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"

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

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

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

我想,问题是另一个问题。

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

但是当你打电话

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

你试图将keypoints1转换为自身;所以(向量)KeyPointKeyPointEllipticKeyPoint转换为EllipticKeyPoint

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

您的意图如下?

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

calculateRepeatability()我看到

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

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

--- 编辑 2016.06.11 ---

如果您打算将KeyPoint的向量转换为EllipticKeyPoint, I suppose you should define, together个关键点1的向量and关键点2',则另外几个向量,例如

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;