4

Я работаю с изображениями с низким разрешением (VGA) и jpg-сжатыми изображениями для визуальной навигации на мобильном роботе. В настоящий момент я использую SURF для обнаружения ключевых точек и извлечения дескрипторов из изображений, а FLANN - для их отслеживания. Я получаю 4000-5000 функций на изображение, и обычно 350-450 совпадений производятся на пару последовательных изображений, прежде чем применять RANSAC (что обычно уменьшает 20% количество совпадений)Функциональный детектор и дескриптор изображений с низким разрешением

Я пытаюсь увеличить число (и качество) матчей. Я пробовал два других детектора: SIFT и ORB. SIFT заметно увеличивает количество функций (на 35% больше отслеживаемых функций, в целом), но он намного медленнее. ORB извлекает примерно столько же функций, сколько SURF, но сопоставительная производительность намного беднее (~ 100 совпадений, в лучшем случае). Моя реализация в OpenCV ОРБ является:

cv::ORB orb = cv::ORB(10000, 1.2f, 8, 31); 
orb(frame->img, cv::Mat(), im_keypoints, frame->descriptors); 
frame->descriptors.convertTo(frame->descriptors, CV_32F); //so that is the same type as m_dists 

И тогда, когда соответствующие:

cv::Mat m_indices(descriptors1.rows, 2, CV_32S); 
cv::Mat m_dists(descriptors1.rows, 2, CV_32F); 
cv::flann::Index flann_index(descriptors2, cv::flann::KDTreeIndexParams(6)); 
flann_index.knnSearch(descriptors1, m_indices, m_dists, 2, cv::flann::SearchParams(64)); 

Что такое лучший детектор особенность и экстрактор при работе с низким разрешением и зашумленных изображений? Должен ли я изменять какой-либо параметр в FLANN в зависимости от используемого детектора функции?

EDIT:

я выкладываю несколько фотографий довольно легко последовательности для отслеживания. Изображения - это то, что я даю им методам детектирования признаков. Они были предварительно обработаны, чтобы устранить шум (посредством cv::bilateralFilter())

enter image description here Image 2 http://oi61.tinypic.com/vertrk.jpg

+0

Можете ли вы загрузить несколько примеров изображений? Кроме того, есть много поворота от кадра к кадру? – GilLevi

+0

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

+0

OK, BRIEF более точен, чем другие двоичные дескрипторы в ситуациях без вращения. Я бы попробовал его вместо орба. – GilLevi

ответ

0

Если у вас есть контроль над функцией отслеживанием вы может это их вращение инвариантно и использовать корреляцию.

2

Во многих случаях метод оптического потока Pyramidal Lucas Kanade является хорошим выбором. метод имеет некоторые ограничения, например. большие изменения в освещении. Если вы используете большое окно 21x21 или больше, чем трекер должен быть более устойчивым к шуму. Вы можете получить функции для отслеживания из вашего любимого детектора SIFT, SURF, FAST или GFT или вы инициализируете их как обычную сетку с выборкой. Это дает вам преимущество регулярных пробных данных движения с вашей сцены.

0

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

https://github.com/wher0001/Image-Capture-and-Processing

Когда я бег ORB, используя фотографии и стандартную сортировку расстояния, я получаю следующую картину, которая, очевидно, имеет несколько плохих матчей , ORB Matching - standard sorting

Я всегда устанавливаю количество высоких (5000) и начинаю оттуда. По умолчанию 500, что я использовал для этих изображений. Оттуда вы можете изменить способ сортировки, как я показал здесь, может уменьшить число nfeatures или даже просто использовать это верхнее количество X совпадений.

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

img1 = cv2.imread("c:/Users/rwheatley/Desktop/pS8zi.jpg") 
img2 = cv2.imread("c:/Users/rwheatley/Desktop/vertrk.jpg") 

grey1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
grey2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 

# Initiate ORB detector 
orb = cv2.ORB_create(nfeatures=5000) 

# find the keypoints and descriptors with ORB 
kp1, des1 = orb.detectAndCompute(grey1,None) 
kp2, des2 = orb.detectAndCompute(grey2,None) 

# create BFMatcher object 
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 

# Match descriptors. 
matches = bf.match(des1,des2) 

# Sort them in the order of their distance. 
matches = sorted(matches, key = lambda x:x.distance) 

# Draw first 10 matches. 
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches,None,flags=2) 
print(len(matches)) 

plt.imshow(img3),plt.show() 

Я затем переключиться на несколько различных методов, которые я нашел полезным при использовании (извините за термин) дерьмовый Dell Webcam. ORB with knnMatching

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

img1 = cv2.imread("c:/Users/rwheatley/Desktop/pS8zi.jpg") 
img2 = cv2.imread("c:/Users/rwheatley/Desktop/vertrk.jpg") 

grey1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
grey2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 

# Initiate ORB detector 
orb = cv2.ORB_create(nfeatures=5000) 

# find the keypoints and descriptors with ORB 
kp1, des1 = orb.detectAndCompute(grey1,None) 
kp2, des2 = orb.detectAndCompute(grey2,None) 

# BFMatcher with default params 
bf = cv2.BFMatcher() 
matches = bf.knnMatch(des1,des2, k=2) 

# Apply ratio test 
good = [] 
for m,n in matches: 
    if m.distance < 0.75*n.distance: 
     good.append([m]) 

# cv2.drawMatchesKnn expects list of lists as matches. 
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) 
print(len(matches)) 

plt.imshow(img3),plt.show() 

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

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

+0

Да, эта веб-камера довольно дерьмовая. Совпадение с ORB-knnMatching выглядит довольно хорошо, сколько совпадений вы получили? – capstain

+0

Я использую ORB, потому что это вращение и инвариант масштаба. Я установил его на 5000 совпадений, и я получил 2395 для первого набора кода и около 3401 для второго. Я не согласен с профессором в использовании 0,75 для второго алгоритма, поскольку он оставляет слишком много плохих матчей. Я предлагаю использовать стандартный алгоритм для удаления выбросов, основанных на различиях ориентации, даже если они соответствуют расстоянию. Затем используйте области сходства с функциями дорожки. –

+0

«Второй алгоритм» Я предполагаю, что вы имеете в виду отношение Лоу, не так ли? Я бы сказал, что если вы опустите его на 0,6 или даже больше, количество хороших матчей резко возрастет. В любом случае, вы сказали мне, сколько функций ORB находит, я спрашивал, сколько хороших совпадений вы получаете. На картинке это выглядит не более 200. – capstain

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

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