1

Я разрабатываю приложение отслеживания признаков и до сих пор, после того, как вы попытались почти все детекторы/дескрипторы функций, у меня есть самые удовлетворительные общие результаты с ORB. И мой дескриптор функции, и детектор - это ORB.Оценка неустойчивой гомографии с использованием ORB

Я выбираю определенную область для обнаружения объектов на своем исходном изображении (путем маскировки). а затем сопоставить его с функциями, обнаруженными в последующих кадрах.

Тогда я фильтровать матчи, выполняя тест отношений на «спичках», полученных из следующего кода:

std::vector<std::vector<DMatch>> matches1; 

m_matcher.knnMatch(m_descriptorsSrcScene, m_descriptorsCurScene, matches1,2); 

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

я также добавить мин проверить расстояние до моего отношения испытания, которые, apppears, дает лучшие результаты

if (distanceRatio < m_fThreshRatio && bestMatch.distance < 5*min_dist) 
{ 
    refinedMatches.push_back(bestMatch); 
} 

и в конце концов, я оценить гомографию.

Mat H = findHomography(points1,points2); 

Я попытался с помощью метода RANSAC для оценки inliners, а затем с помощью тех, пересчитывать свою гомографию, но это дает больше нестабильности плюс потребляет больше времени.

Тогда, в конце концов, я рисую прямоугольник вокруг моей конкретной области, который должен быть отслежен. я получаю самолет координаты:

perspectiveTransform(obj_corners, scene_corners, H); 

где «objcorners» являются координатами моей маскируются (или разоблачен) область.

Реактив, который я рисую, используя «scene_corners», кажется, вибрирует. увеличение количества функций немного уменьшило его, но я не могу увеличить их слишком сильно из-за ограничения времени.

Как я могу улучшить стабильность?

Любые предложения будут оценены.

Спасибо.

ответ

0

Предложение, которое приходит на ум из опыта обнаружения/сопоставления функций, заключается в том, что иногда вам просто нужно принимать согласованные точки функции, которые не будут работать идеально. Даже незначительные изменения в сцене, которую вы смотрите, могут вызвать некоторые неприятные проблемы, например, изменения в свете или нежелательных объектах, которые появляются в поле зрения.

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

Другой (маленький) взлом, который вы можете использовать, заключается в том, чтобы избежать перерисовки окна области, если предыдущее окно имело аналогичный размер и положение.

+0

Спасибо за ваш ответ Мики. – Abhishek

+0

Спасибо за ваш ответ Майки. Фактически я рассматривал не пересчет окна региона, если предыдущее окно имело аналогичный размер и положение, но я оставил это в качестве крайней меры. Угадайте, что с этим пошло. И еще одно: знаете ли вы, как работает параметр EdgeThreshold для ORB-детектора? увеличение означает, что нужно получить более сильные углы (края, следовательно, углы). – Abhishek

+0

Это размер границы вокруг вашего изображения, в котором точки объекта не обнаружены. Поскольку он использует исправления для обнаружения точек функции, он не может работать слишком близко к краю изображения, иначе патч будет за пределами границ. Однако, если вы обнаруживаете только функцию в области большего изображения, вы можете уменьшить ее до нуля. Быстро посмотрите документацию, у нее есть дополнительная информация: http://docs.opencv.org/modules/features2d/doc/feature_detection_and_description.html#orb-orb – MikeGold

1

Если это вибрация, которые действительно надоедливые к вам, то вы могли бы попробовать принимать скользящую среднее значение матриц гомографии с течением времени:

cv::Mat homoG = cv::findHomography(obj, scene, CV_RANSAC); 
if (homography.empty()) { 
    homoG.copyTo(homography); 
} 
cv::accumulateWeighted(homoG, homography, 0.1); 

сделать «гомографию» переменный глобальным, и продолжать называть это каждым вы получите новый кадр. Альфа-параметр accumulateWeighted является обратной величиной периода скользящей средней.

Так 0,1 принимает среднее значение из последних 10 кадров и 0,2 принимает в среднем от 5 последних и так далее ...

+0

Спасибо, сэм, я обязательно дам ему шанс – Abhishek

 Смежные вопросы

  • Нет связанных вопросов^_^