与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 )到KeyPoint
或EllipticKeyPoint
到EllipticKeyPoint
。而且您缺少这种类型的转换器。
您的意图是以下?
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;
并且,在加载了
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;