正如我在标题上写的那样,我需要一种方法来转换它们。这就是我希望它发挥作用的方式:
- 通过 FAST 检测特征点(输出:MatOfKeyPoint)
- 将 MatOfKeyPoint 转换为 Point,因为 pointPolygonTest 需要 Point 类型。(我设法做到了)
- 转换回 MatOfKeyPoint。DescriptorExtractor 需要这种类型。
我被困在最后一步。谢谢。
一个快速的方法是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
.