Прошло уже два года, как я несколько раз вижу одну и ту же тему, касающуюся SIFT и SURF, что у некоторых вызывает проблемы. всегда есть сообщение об этих двух.
Прежде всего, вам нужно кое-что понять: OpenCV — это библиотека с открытым исходным кодом, которая реализует алгоритмы, разработанные исследователями, некоторые из этих алгоритмов бесплатны для личного или коммерческого использования, другие бесплатны для персональное использование.
Начнем с небольшого пояснения в зависимости от версии OpenCV: opencv2 -› opencv3 -› opencv4 -› new_versions of opencv эм>
- Мы не будем говорить об opencv 2 (наверное, сейчас его мало кто использует). Единственное, что вы должны помнить из этой версии, это то, что SIFT и SURF работали нормально.
- После выпуска OpenCV3 реализации SIFT и SURF были удалены из установки по умолчанию OpenCV 3, то же самое для OpenCV 4.
Причина удаления SIFT и SURF связана с тем, что OpenCV называет алгоритмы несвободными. SIFT и SURF являются (летом) как проприетарными, так и запатентованными алгоритмами, что означает, что вы должны технически получить разрешение на их использование в коммерческих алгоритмах (однако они бесплатны для академических целей). и исследовательские цели).
По этой причине OpenCV принял решение перенести запатентованные алгоритмы (с экспериментальными реализациями) в пакет с именем opencv_contrib. Это означает доступ к SIFT и SURF.
Случай с OpenCV в C++: необходимо скомпилировать и установить OpenCV из исходного кода с включенной поддержкой opencv-contrib. (Мы увидим это позже)
Случай OpenCV в python: вам необходимо установить через pip пакет opencv-contrib-python следующим образом:
pip install opencv-contrib-python
однако в некоторых версиях OpenCV 3 (та, с которой у вас возникли проблемы в python) алгоритмы SIFT и SURF работают не хочет работать, и вы получаете эту ошибку: "module 'cv2.cv2' has no attribute 'xfeatures2d' ”
.
Я могу дать вам объяснение (это мое личное мнение), но перед этим вы должны знать, что пакет OpenCV python создается путем компиляции исходного кода OpenCV< /сильный>. Пакеты Python представляют собой файлы типа Wheel, поэтому расширение .whl.
Поэтому, когда вы выполняете ** pip install opencv-python **, вы фактически консультируетесь с этим https://pypi.org/project/opencv-python/#files, который выберет файл колеса, соответствующий вашей конфигурации (операционная система, а также версия python), то же самое для opencv-contrib-python, ссылка на который следующие https://pypi.org/project/opencv-contrib-python/#files< /а>.
Так почему же SIFT и SURF не работают во всех версиях OpenCV?
Гипотеза 1. Забудьте об активации дополнительных модулей и несвободных алгоритмов от разработчиков при компиляции исходного кода и сборке пакета opencv-contrib-python. Но так как эта проблема присутствует не в одном релизе, а в десяти, это порождает вторую гипотезу.
Гипотеза 2: это было сделано намеренно, но зачем?
Примечание: это только мое мнение, если у кого-то есть точная причина, поделитесь ею с нами.
История версий и работа: из SIFT и SURF.
1- Для SIFT (Проверено):
sift = cv2.sift_create() # work in:
# 3.4.11, 4.4.0. ==> Sift became free since March 2020
sift = cv2.xfeatures2D.SIFT_create () # work in:
# 3.2.x, 3.3.x, 3.4.0, 3.4.1, 3.4.2, 3.4.10, 4.3.0, 4.4.0
sift = cv2.xfeatures2D.SIFT_create () # ==> Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create' (the versions where the problem is present)
# 3.4.3, 3.4.4, 3.4.5, 3.4.6, 3.4.7, 3.4.8, 3.4.9, 4.0.x, 4.1.x, 4.2.x
2- Для SURF (Предполагается (не тестировать все)):
SURF = cv2.xfeatures2D.SURF_create () # work in :
# 3.2.x, 3.3.x, 3.4.0, 3.4.1, 3.4.2
SURF = cv2.xfeatures2D.SURF_create () # ==> Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create' (the versions where the problem is present)
# 3.4.3, 3.4.4, 3.4.5, 3.4.6, 3.4.7, 3.4.8, 3.4.9, 3.4.10, 3.4.11, 4.0.x, 4.1.x, 4.2.x, 4.3.0, 4.4.0.
РЕШЕНИЕ:
1- Самое простое решение, как упоминалось на многих форумах (если вы ищете немного вместо того, чтобы каждый раз публиковать одну и ту же проблему), - это понижение версии openCV до версии 3.4. 2.17 (если вам нужно, чтобы SIFT и SURF работали только с установкой pip), потому что проблемы начинаются с версии 3.4.3.
2- Если вам нужна конкретная версия, зная, что это проблема с SIFT или SURF, вы можете исправить ее, установив OpenCV с включением алгоритмов opencv-contrib и NONFREE из исходного кода. вот учебное пособие:учебное пособие
Для компиляции OpenCV с включением алгоритмов opencv-contrib и NONFREE вам потребуется следующее:
cmake -D CMAKE_BUILD_TYPE = RELEASE \
-D CMAKE_INSTALL_PREFIX = /usr/local \
-D INSTALL_PYTHON_EXAMPLES = ON \
-D INSTALL_C_EXAMPLES = OFF \
-D OPENCV_ENABLE_NONFREE = ON \
-D OPENCV_EXTRA_MODULES_PATH=(Path_to_opencv-contrib)/opencv_contrib/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/(Python_environement)/bin/python \
-D BUILD_EXAMPLES=ON ..
Протестировано с opencv 3.4.9 под python 3.6.9 (отлично работает для SIFT и SURF)
Все существующие выпуски opencv 3 и 4 находятся здесь Выпуски
Все версии openCV3 ›= 3.4.11 включают бесплатную версию SIFT.
Все версии openCV4 ›= 4.4.0 включают бесплатную версию SIFT.
person
Rashid Ladjouzi
schedule
25.10.2020