2016-06-10 58 views
0

类似于this post和this后,我想通过修改this示例SURF检测和来自opencv库的匹配代码,将检测到的关键点转换为椭圆关键点。如何使用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);线202后
  • using namespace cv::xfeatures2d::EllipticKeyPoint的代码

,但开始时都显示错误,他说:

  • name followed by '::' must be a class or namespace name and
  • namespace "cv::xfeatures2d" has no member "EllipticKeyPoint" respecti vely

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

回答

1

卫尔克......你应该告诉我们你的确切的代码,如果你想明智的答案,但...

如果我没有错,消息“名称后跟‘::’必须是类或名称空间名称“是误导性的:也可以是静态方法名称,这是您的意图。

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

有定义了两个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的矢量EllipticKeyPoint, I suppose you should define, together keypoints1 and keypoints2`的载体,另一对夫妇的载体,像

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; 
+0

确切的代码是示例SURF代码(第3个链接从帖子)。我希望通过使用opencv库中的易用代码来为其添加1或2行。我试着将你的1行代码添加到示例代码中,但它不起作用。使用这个:'cv :: evaluateFeatureDetector(img1.getMat(ACCESS_READ),img2.getMat(ACCESS_READ),H,);'似乎工作,但我不明白第三个参数等等。对于我来说,看起来我对所有不同种类的符号都非常困惑。你能解释一下它的含义吗? – SK90

+0

我的意思是象“<>,&,*和::”这样的符号以及它们如何组合在一起会让我感到困惑,因为我不熟悉C++ – SK90

+0

@ SK90 - 回答改进以解释(我希望)转换()';关于“<>,&,*和::”的使用,那么......你可以尝试询问单个示例,但很难给出一个普遍的答案; C++是一门复杂的语言,我建议用一本好书或者一本非常好的教程来学习它 – max66