将MatOfPoint转换为MatOfKeypoint

时间:2013-07-04 13:12:18

标签: android opencv

正如我在标题上写的那样,我需要一种方法来转换它们。 这就是我希望它发挥作用的方式:

  1. 通过FAST检测要素点(输出:MatOfKeyPoint)
  2. 将MatOfKeyPoint转换为Point,因为pointPolygonTest需要Point类型。 (我设法做到了这一点)
  3. 转换回MatOfKeyPoint。 DescriptorExtractor需要这种类型。
  4. 我坚持到最后一步。 谢谢。

1 个答案:

答案 0 :(得分:0)

快速执行此操作的方法是仅使用多边形内的点填充新的MatOfKeyPoint,然后将其传递给DescriptorExtractor

这是一个使用C ++ API的例子(我不知道Java API),但我希望它能指出你正确的方向。

cv::Mat image;    //Your image
std::vector<cv::Point2f> contour;      //This is the contour you're testing
std::vector<cv::KeyPoint> keypoints;   //From FAST detection
std::vector<cv::KeyPoint> in_polygon;

for (const cv::KeyPoint& key : keypoints)
{
    if (cv::pointPolygonTest(contour, key.pt, true) > 0)    //Inside polygon, ignore points on edge
    {
        in_polygon.push_back(key);
    }
}

auto extractor =  cv::DescriptorExtractor::create("ORB");    //ORB for example; I don't know which you're using
cv::Mat descriptors;
extractor->compute(image, in_polygon, descriptors);

您应该能够使用toList()的{​​{1}}方法复制此功能。