Повышение точности сопоставления cvMatchShapes в OpenCV - PullRequest
6 голосов
/ 25 ноября 2011

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

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

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

РЕДАКТИРОВАТЬ

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

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

1 Ответ

3 голосов
/ 25 ноября 2011

Здесь - это сайт БЫСТРОГО изобретателя. FAST означает Особенности теста ускоренного сегмента . Здесь - это короткая запись в Википедии об алгоритмах, основанных на AST. Кроме того, здесь - это хороший обзор различных детекторов функций, используемых в настоящее время.

FAST фактически уже реализован OpenCV, если вы хотите использовать их реализацию.

РЕДАКТИРОВАТЬ: Вот короткий пример, который я создал, чтобы показать вам, как использовать детектор 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;
}

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...