Функция отслеживания не работает правильно на изображениях с низким разрешением

Я использую 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);

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

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

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

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

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

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

Найти полный код здесь

1 ответ

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

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

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

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

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

Другие вопросы по тегам