#opencv #computer-vision
#opencv #компьютерное зрение
Вопрос:
У меня возникла проблема с поиском соответствующих точек в нескольких представлениях одного и того же артефакта калибровки. Ниже вы можете увидеть примерные изображения цели калибровки.
Мне нужно отсортировать 2D-координаты всех круговых маркеров и убедиться, что соответствующие (одинаковые) маркеры во всех представлениях имеют одинаковый индекс в векторах маркеров. Кто-нибудь может дать мне подсказку, как справиться с такой вещью? Большое спасибо.
Комментарии:
1. Это отверстия труб?
2. Нет. Этот целевой объект используется только для целей обработки изображений.
Ответ №1:
Я не уверен, что полностью понимаю, чего вы хотите, но я могу помочь.
Ваш артефакт хорош тем, что это плоскость, так что вы можете переходить от одного изображения к другому с помощью омографии. Как только у вас будет гомография, ваша проблема более или менее решена.
Однажды я написал программу, которая делала это :
- Загрузка изображений (
cv::imread()
) - Функции вычислительного серфинга (
cv::surf()
) - Сопоставьте объекты вместе (используя метод наименьшего квадрата между объектами)
- Используйте OpenCV
findHomography()
сCV_RANSAC
В принципе, в итоге вы получите что-то вроде этого : http://blogs.oregonstate.edu/hess/files/2010/10/sift_demo_screenshot1.jpg
И я думаю, это то, что вы хотите: у вас есть преобразование, которое соответствует вашим маркерам между вашими двумя изображениями. (Эта трансформация, гомография, гораздо менее запутанна, чем набор строк в приведенной мной ссылке. Это небольшая матрица, которая «проглатывает» координату маркера в изображении1 и «возвращает» координаты соответствующего маркера в изображении2) (которая использует SIFT вместо SURF, но они в значительной степени идентичны)
Комментарии:
1. Я думаю, что моя проблема немного в другом. У меня есть процедуры, которые вычисляют 2D-пиксельные координаты круговых маркеров и возвращают вектор Point2D (положения маркеров). Что мне нужно, так это отсортировать маркеры и убедиться, что маркер в (например) индексе i = 5 на первом изображении совпадает с маркером i = 5 на всех других изображениях.
2. Фантастика! Если я правильно понимаю, для каждого изображения вы можете получить
vector<Point2D>
, каждое из которых представляет 2D координаты маркера на изображении i. Теперь для каждого изображения у вас естьvector<Point2D>
, и вы задаетесь вопросом, всегда ли в индексе i это один и тот же маркер? Я приведу метод для 2 изображений: применить непосредственноcv::findHomography()
к двум векторам. Теперь у вас естьH
матрица. Для каждой точки 2dна первом изображении (назовем этоvec1[i]
) у вас должно бытьconstant*vec2[i] ~= H.vec1[i]
. (не забудьте добавить 1 в конце каждойvec[i]
)
Ответ №2:
Вы все еще можете использовать аналогичный подход.
В отличие от подхода Fezvez, который сочетает в себе определение объекта (какие точки на изображении интересны) и описание объекта (что уникального в этой точке), ваш собственный код уже предоставляет часть обнаружения (где находятся центры окружностей).
Теперь вам нужно сгенерировать набор предполагаемых совпадений (предположений, какой набор соответствует какому набору). Вы можете сделать это, используя дескриптор объекта в каждом местоположении круга (возможно, с большим окном). Смотрите этот раздел vl_sift о пользовательских фреймах для примера извлечения дескрипторов в определенном местоположении. Обратите внимание, вам может потребоваться перенормировать изображение, чтобы учесть локальное аффинное искажение. Используйте тест соотношения расстояний для SIFT или, возможно, какой-либо другой показатель расстояния для других систем.
Получив совпадения, вы можете передать их в надежный решатель гомографии, такой как findHomography от OpenCV, чтобы отклонить выбросы (недопустимые совпадения, которые неизбежно возникают из-за шума / других проблем).
В качестве альтернативы вы можете вручную установить соответствия точек для углов прямоугольников и т.д. и ввести это в решатель гомографии.
Перспективные проекции всех плоских поверхностей (например, вашей калибровочной цели) могут быть связаны с помощью гомографии. Все, что вы хотите сделать с точки зрения идентификации маркера, может быть удалено из преобразования.