OpenCV 2.2 SURF功能匹配问题

Mai*_*one 6 c++ opencv computer-vision surf

在右上角没有任何匹配

我已经修改了OpenCV演示应用程序"matching_to_many_images.cpp"来查询图像(左)到网络摄像头的帧(右).第一张图片的右上角出了什么问题?

我们认为这与我们遇到的另一个问题有关.我们从一个空的数据库开始,我们只添加唯一的(与我们数据库中的功能不匹配的功能),但在添加三个功能后,我们得到所有新功能的匹配....

我们正在使用:SurfFeatureDetector surfFeatureDetector(400,3,4); SurfDescriptorExtractor surfDescriptorExtractor; FlannBasedMatcher flannDescriptorMatcher;

完整代码可在以下网址找到:http://www.copypastecode.com/71973/

KMS*_*KMS 10

我认为这与边界关键点有关.检测器检测关键点,但是为了使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() );
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)

此外,近似最近邻居索引不是匹配图像对之间的特征的最佳方式.我建议你尝试其他更简单的匹配器.