OpenCV 2.2 SURF Проблемы соответствия функций - PullRequest
6 голосов
/ 30 мая 2011

Matching with nothing in the top right corner

Я изменил демонстрационное приложение OpenCV "Match_to_many_images.cpp", чтобы запросить изображение (слева) для кадров с веб-камеры (справа).Что пошло не так с верхним правым углом первого изображения?

Мы думаем, что это связано с другой проблемой, которая у нас есть.Мы начинаем с пустой базы данных и добавляем только уникальные (функции, которые не соответствуют функциям в нашей базе данных), но после добавления только трех функций мы получаем совпадение по всем новым функциям ....

мы используем: SurfFeatureDetector surfFeatureDetector (400,3,4);SurfDescriptorExtractor surfDescriptorExtractor;FlannBasedMatcher flannDescriptorMatcher;

Полный код можно найти по адресу: http://www.copypastecode.com/71973/

Ответы [ 3 ]

10 голосов
/ 31 мая 2011

Я думаю, что это связано с ключевыми точками границы.Детектор обнаруживает ключевые точки, но для того чтобы дескриптор SURF возвращал согласованные значения, ему нужны данные пикселей в блоке пикселей вокруг него, который недоступен в граничных пикселях.Вы можете использовать следующий фрагмент кода, чтобы удалить граничные точки после обнаружения ключевых точек, но до вычисления дескрипторов.Я предлагаю использовать borderSize от 20 или более.

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;
};

Кроме того, индексация приблизительного ближайшего соседа не лучший способ сопоставления объектов между парамиизображений.Я бы посоветовал вам попробовать другие более простые совпадения.

4 голосов
/ 09 декабря 2011

Ваш подход работает безупречно, но он показывает неверные результаты из-за неправильного вызова функции drawMatches.

Ваш неправильный звонок был примерно таким:

drawMatches(image2, image2Keypoints, image1, image1Keypoints, matches, result);

Правильный вызов должен быть:

drawMatches(image1, image1Keypoints, image2, image2Keypoints, matches, result);
3 голосов
/ 26 февраля 2012

Я столкнулся с той же проблемой.Удивительно, но решение не имеет ничего общего с пограничными точками или сопоставителем KNN.Просто нужна другая стратегия сопоставления для фильтрации "хороших совпадений" из множества совпадений.

Используйте поиск 2 NN и следующее условие:

, если расстояние (1-е совпадение) <0,6* расстояние (2-е совпадение) 1-е совпадение является "хорошим совпадением". </p>

Отфильтруйте все совпадения, которые не удовлетворяют вышеуказанному условию, и вызовите drawMatches только для "хороших совпадений".Voila!

...