我觉得这与边框的关键点做:
完整代码可以在这里找到。检测器检测关键点,但是对于SURF描述符返回一致的值,它需要围绕它的像素块中的像素数据,这在边界像素中不可用。在检测到关键点之后但计算描述符之前,可以使用以下片段删除边界点。我建议使用20或更多的borderSize。
removeBorderKeypoints(vector<cv::KeyPoint>& keypoints, const cv::Size imageSize, const boost::int32_t borderSize)
{
if(borderSize > 0)
{
keypoints.erase(remove_if(keypoints.begin(), keypoints.end(),
RoiPredicatePic((float)borderSize, (float)borderSize,
(float)(imageSize.width - borderSize),
(float)(imageSize.height - borderSize))),
keypoints.end());
}
}
凡RoiPredicatePic实现为:
struct RoiPredicatePic
{
RoiPredicatePic(float _minX, float _minY, float _maxX, float _maxY)
: minX(_minX), minY(_minY), maxX(_maxX), maxY(_maxY)
{}
bool operator()(const cv::KeyPoint& keyPt) const
{
cv::Point2f pt = keyPt.pt;
return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY);
}
float minX, minY, maxX, maxY;
};
此外,近似最近邻索引是不匹配的图像对之间的功能的最佳途径。我建议你尝试其他更简单的匹配器。
来源
2011-05-31 05:59:22
KMS
要100%正确,它是右图像的左上角。我们需要一种方式来筛选这些明显错误的匹配,任何想法?为什么这些点被检测为匹配? – Orka 2011-05-30 09:37:45
您应该将我的答案标记为正确答案。实际的一个是误导。 – 2013-05-12 12:28:34