SIFT & SURF: установите OPENCV_ENABLE_NONFREE CMake ==> Решение OpenCV 3 и OpenCV 4
Я пытаюсь использовать функцию SIFT и SURF с некоторыми версиями OpenCV 3 и openCV 4 (после установки opencv-contrib-python) с помощью:
pip install opencv-contrib-python
Я пробую версии 3.4.3 и 3.4.9 и 4.1.0, но у меня такая же проблема:
sift = cv2.xfeatures2d.SIFT_create()
surf = cv2.xfeatures2d.SURF_create()
==> error: (-213: The function / feature is not implemented) This algorithm is patented and is excluded in this configuration;
Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create'
но в версии 3.4.2 работает нормально.
Итак, как заставить SIFT и SURF работать в разных версиях OpenCV? Спасибо.
Подробное объяснение приветствуется
1 ответ
Вот уже два года, как я вижу одну и ту же тему, которая несколько раз зависает в отношении 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. Пакеты Pythons представляют собой файлы типа 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, просто with pip install), потому что проблемы начинаются с версии 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