0

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

  1. 通过 FAST 检测特征点(输出:MatOfKeyPoint)
  2. 将 MatOfKeyPoint 转换为 Point,因为 pointPolygonTest 需要 Point 类型。(我设法做到了)
  3. 转换回 MatOfKeyPoint。DescriptorExtractor 需要这种类型。

我被困在最后一步。谢谢。

4

1 回答 1

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()使用MatOfKeyPoint.

于 2013-07-05T04:40:09.863 回答