与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行之后生成的。所以我尝试通过添加以下内容将它们转换为椭圆关键点:
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"
我应该使用哪个类/名称空间/成员?如何正确编写代码以便我可以使用此函数将关键点转换为椭圆关键点?
答案 0 :(得分:1)
Welk ......如果你想要明智的答案,你应该向我们展示你的确切代码,但是......
如果我没有错,请输入&#39; ::&#39;必须是类或命名空间名称&#34;是误导性的:也可以是静态方法名称,这是你的意图。
我认为这个问题是另一个问题。
在convert()
中定义了两个EllipticKeyPoint
静态方法:第一个在KeyPoint
的向量中转换EllipticKeyPoint
的向量;第二个在EllipticKeyPoint
的向量中转换KeyPoint
的向量。
但是当你打电话时
cv::EllipticKeyPoint::convert(keypoints1, keypoints1);
您尝试将keypoints1
转换为自己;所以(向量)KeyPoint
到KeyPoint
或EllipticKeyPoint
到EllipticKeyPoint
。
你缺少这种类型的转换器。
您的意图如下?
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;
并且,当加载keypoints1
和keypoints2
时,请致电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;