OpenCV 3.4.0教程中Points()函数缺失及匹配关键点提取问题咨询
解决OpenCV 3.4.0 Android NDK下的两个特征匹配问题
嘿,刚好我之前在Android NDK环境用OpenCV 3.x做过特征跟踪,来帮你搞定这两个问题~
问题一:找不到教程里的Points()函数
首先得说,OpenCV 3.4.0的原生C++ API里并没有内置叫Points()的函数,大概率是教程作者自己封装的一个工具函数,作用是把vector<KeyPoint>类型的关键点集合转换成vector<Point2f>类型的坐标点集合。
你可以自己实现这个函数,代码很简单:
// 自定义函数:将KeyPoint数组转为Point2f数组,对应教程里的Points() vector<Point2f> KeyPointsToPoints(const vector<KeyPoint>& keypoints) { vector<Point2f> points; points.reserve(keypoints.size()); // 预分配空间提升效率 for (const auto& kp : keypoints) { points.push_back(kp.pt); // 每个KeyPoint的pt属性就是它的坐标 } return points; }
之后你就可以用这个函数替代教程里的Points(),比如auto points = KeyPointsToPoints(yourKeypoints);
问题二:从匹配结果中提取关键点
首先得明确:FlannBasedMatcher的匹配结果应该是一个vector<DMatch>类型的集合,每个DMatch对象里的queryIdx对应模板图像的关键点索引,trainIdx对应相机实时图像的关键点索引。
假设你已经有:
vector<KeyPoint> templateKps;// 模板图像检测到的关键点vector<KeyPoint> cameraKps;// 相机帧检测到的关键点vector<DMatch> matches;// FlannBasedMatcher输出的匹配结果
那么提取matched1(模板侧匹配关键点)和matched2(相机侧匹配关键点)的代码如下:
vector<KeyPoint> matched1, matched2; for (const auto& match : matches) { // 根据匹配索引从原始关键点集合中取出对应元素 matched1.push_back(templateKps[match.queryIdx]); matched2.push_back(cameraKps[match.trainIdx]); }
如果你的需求是直接提取坐标点(而不是KeyPoint对象),可以结合上面的自定义函数,或者直接在遍历中取pt属性:
vector<Point2f> matchedPoints1, matchedPoints2; for (const auto& match : matches) { matchedPoints1.push_back(templateKps[match.queryIdx].pt); matchedPoints2.push_back(cameraKps[match.trainIdx].pt); }
内容的提问来源于stack exchange,提问作者JavaOpenCVWorker
相关产品推荐
相关产品推荐

