Улучшить точность сопоставления cvMatchShapes в OpenCV

Я попытался использовать cvMatchShapes() для сопоставления двух шаблонов маркеров. Как вы можете видеть в Лучший способ подсчитать количество белых пятен в пороговом IplImage в OpenCV 2.3.0, источник имеет низкое качество изображения.

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

Примечание. Мое запасное решение состоит в том, чтобы изменить шаблон маркера, чтобы он имел довольно большие/четко видимые формы. Пожалуйста, перейдите по ссылке выше, чтобы увидеть мой текущий шаблон маркера.

ИЗМЕНИТЬ

Я нашел это всестороннее сравнение различных алгоритмов обнаружения функций, реализованных в OpenCV. http://computer-vision-talks.com/2011/01/comparison-of-the-opencvs-feature-detection-algorithms-2 . В соответствии с этим FAST кажется хорошим выбором.

Я бы дал +1 всем, кто может поделиться хорошим руководством по реализации FAST (иначе STAR/SURF/SIFT) в OpenCV. Я не могу google думать быстро как скорость :(


person coder9    schedule 24.11.2011    source источник
comment
В своем редактировании вы публикуете ссылку на различные тесты детекторов функций, доступных в OpenCV. Затем вы просите детектор признаков. В OpenCV   -  person Sam    schedule 25.11.2011


Ответы (1)


Вот сайт изобретателя FAST. FAST расшифровывается как Функции ускоренного тестирования сегментов. Вот краткая статья в Википедии об алгоритмах на основе AST. Кроме того, здесь можно найти хороший обзор различные детекторы признаков, используемые в настоящее время.

FAST на самом деле уже реализован OpenCV, если вы хотели бы использовать их реализацию.

EDIT: Вот краткий пример, который я создал, чтобы показать вам, как использовать детектор FAST:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    Mat far = imread("far.jpg", 0);
    Mat near = imread("near.jpg", 0);

    Ptr<FeatureDetector> detector = FeatureDetector::create("FAST");

    vector<KeyPoint> farPoints;
    detector->detect(far, farPoints);

    Mat farColor;
    cvtColor(far, farColor, CV_GRAY2BGR);
    drawKeypoints(farColor, farPoints, farColor, Scalar(255, 0, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG);
    imshow("farColor", farColor);
    imwrite("farPoints.jpg", farColor);

    vector<KeyPoint> nearPoints;
    detector->detect(near, nearPoints);

    Mat nearColor;
    cvtColor(near, nearColor, CV_GRAY2BGR);
    drawKeypoints(nearColor, nearPoints, nearColor, Scalar(0, 255, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG);
    imshow("nearColor", nearColor);
    imwrite("nearPoints.jpg", nearColor);

    waitKey();
    return 0;
}

Этот код находит следующие характерные точки для дальнего и ближнего изображения:
ближнее изображениедальнее изображение

Как видите, ближнее изображение имеет гораздо больше характеристик, но похоже, что та же базовая структура обнаруживается и на дальнем изображении. Таким образом, вы должны быть в состоянии соответствовать этим. Взгляните на descriptor_extractor_matcher.cpp. . Это должно заставить вас начать.

Надеюсь, это поможет!

person mevatron    schedule 25.11.2011
comment
Будут ли эти алгоритмы обнаружения функций работать с изображениями низкого качества, такими как изображения на stackoverflow.com/questions/8259655/ ? - person coder9; 25.11.2011