2016-10-29 2 views
3

Я использую SIFT для обнаружения функции и calcOpticalFlowPyrLK для отслеживания функций на изображениях. Я работаю над изображениями с низким разрешением (590x375 после обрезки), взятыми из Microsoft kinect.Отслеживание функций не работает правильно на изображениях с низким разрешением

// feature detection 
cv::Ptr<Feature2D> detector = cv::xfeatures2d::SIFT::create(); 
detector->detect(img_1,keypoints_1); 
KeyPoint::convert(keypoints_1, points1, vector<int>()); 

// feature tracking 
vector<float> err; 
Size winSize=Size(21,21); 
TermCriteria termcrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01); 
calcOpticalFlowPyrLK(img_1, img_2, points1, points2, status, err, winSize, 1, termcrit, 0, 0.001); 

Я побежал это на consective образы установившемся сцены (только, чтобы получить представление) взяты из той же позиции камеры со скоростью 30 кадров в секунду. Для глаз изображения выглядят одинаково, но каким-то образом calcOpticalFlowPyrLK не в состоянии отслеживать одни и те же функции с одного изображения на другое. Позиция (координаты x, y) должна быть одинаковой для обнаруженной функции и отслеживаемой функции. Как-то это не так.

В соответствии с предложением AldurDisciple, я считаю, что я обнаруживаю шум как функции. Черные изображения ниже - разница между кондуктивными элементами, показывает шум. Следующими являются оригинальные изображения, а затем изображения с обнаруженными функциями.

Моя цель - использовать информацию для поиска изменений в позиции робота с течением времени.

Я использовал

GaussianBlur(currImageDepth, currImageDepth, Size(9,9), 0, 0); 

для шума, но это не помогло.

Find complete code in here enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

+1

Распечатайте расстояния (норма L2) между входными и выходными точками и посмотрите, имеют ли они смысл. Если движения малы, вы можете уменьшить размер окна поиска и проверить. Также наведите на экран свои ключевые точки FAST и посмотрите, достаточно ли они для отслеживания. – dhanushka

+0

Я нарисовал линии между обнаруженными и отслеживаемыми координатами. Это имеет смысл, когда я перемещаю камеру, но когда я этого не делаю, я все еще вижу несколько строк, которые дают мне неправильный результат. Я пробовал рисовать круг вокруг обнаруженных точек, они не имели большого смысла для меня. – Ruturaj

+1

Когда нет движения, какая часть точек показывает движение, и как насчет их величины? Возможно, вы можете использовать эту информацию, чтобы отказаться от этих движений. Во всяком случае, избавление от ложных тревог может быть невозможно. FAST был разработан для работы в режиме реального времени и может быть не очень точным. Используйте детектор, такой как SIFT или SURF, и сравните качество ключевых точек. Вы можете настроить параметры FAST на основе этого сравнения, если вы должны использовать FAST. – dhanushka

ответ

3

Я думаю, что есть два фактора, которые следует принимать во внимание:

  1. Ваша сцена в основном состоит из 3-однородных областей, следовательно, БЫСТРО точки в этих регионах, вероятно, будет сгенерированных шумом в изображении. Поскольку картина шума может быть совершенно различной в двух последовательных изображениях, наилучшее совпадение для некоторых точек может находиться в совершенно другом положении на изображении.

  2. Ваше изображение уже имеет довольно низкое разрешение, а 3 в списке параметров функции calcOpticalFlowPyrLK означает, что вам требуется функция для отслеживания точек с использованием пирамиды из 4 уровней. Это означает, что точки сначала будут отслежены на изображении, уменьшенном в 2 раза 3 = 16 (т. Е. Изображение ~ 36х23), затем на изображении изменяется в 2 раза 2 = 8 (т. Е. Изображение размером 73х46) и т. Д. , Исходное разрешение 36x23 слишком мало для изображения с практически без текстуры.

Чтобы решить вашу проблему, вы можете попробовать использовать только два уровня пирамиды (т.е. пройти 1 вместо 3) или даже одного уровня (т.е. пройти 0 вместо 3). Но имейте в виду, что проблема с шумом подразумевает, что в целом вы всегда будете иметь несколько ложных совпадений.

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

+0

Теперь я пытаюсь сгладить изображения, робот перемещается во многих местах, и изображение является одним из примеров. Моя основная цель - отслеживать движение, но я получаю ненулевые значения для устойчивых изображений, что заставило меня думать, что мой результат с движением также будет иметь ошибку. Робот движется очень медленно и захватывает изображения при 30FPS. Я обрабатываю изображения, а затем получаю следующий, я не обрабатываю все, если это невозможно. Итак, сколько уровней пирамиды я должен использовать? Также я заменил FAST на SIFT и сейчас тестировал SURF. У меня также есть доступ к изображениям глубины, будет ли это работать, если вы хотите использовать изображение глубины вместо текущего RGB? – Ruturaj

+0

Я нарисовал круг вокруг обнаруженных объектов, они в основном в углах или где встречаются 2 плоскости, очень мало (2-4) находились в однородных регионах. Я вычитал последовательные изображения, и я получил некоторый шум (ненулевые значения), где плоскости встречаются или более темные области. Я буду добавлять изображения завтра утром. – Ruturaj

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