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? Спасибо.

Подробное объяснение приветствуется


person Rashid Ladjouzi    schedule 25.10.2020    source источник
comment
Я не понимаю, в чем тут вопрос? SO - это сайт вопросов и ответов, а не форум, похоже, вы используете его как форум, и это неправильно. Вы можете сами отвечать на свои вопросы, но для этого вам нужно сначала задать вопрос, а затем ответить на него в поле для ответов ниже.   -  person Dr. Snoopy    schedule 25.10.2020
comment
Спасибо за ваш ответ. Я исправлю это через мгновение   -  person Rashid Ladjouzi    schedule 25.10.2020


Ответы (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< /сильный>. Пакеты 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