Поддержание совместимости кода между OpenCV 2 и OpenCV 3

В моей библиотеке в настоящее время используется OpenCV 2. Теперь я пытаюсь скомпилировать библиотеку для использования OpenCV 3. Кажется, что некоторые файлы заголовков были перемещены, а некоторые константы были переименованы. Например, CV_INTER_LINEAR не определен в OpenCV 3.

Поскольку моя библиотека должна быть скомпилирована и запущена как на OpenCV 2, так и на 3, существует ли какой-либо простой способ преодолеть эту несовместимость? Я могу изменить свой код, но тогда он не работает в OpenCV 2.

3 ответа

У меня была та же проблема несколько месяцев назад, и мне пришлось противоречить Кирану: у меня был мой относительно большой проект по созданию как с OpenCv 2, так и с 3. Уметь строить как с 2, так и 3 очень важно в проекте переходный этап, особенно потому, что OpenCV 3 еще не находится в стабильной версии и все же имеет удивительные функции оптимизации.

Не указано cv::INTER_LINEAR как в OpenCV 2 (заголовок imgproc/imgproc.hpp), так и в 3? Вам придется заменить некоторые постоянные имена, добавить несколько включений, но это будет не слишком сложно.

Что касается включений заголовков, есть способ найти включенный путь, совместимый как для Opencv2, так и для 3.

От ссылки ссылка Kiran:

В OpenCV 3 мы пишем

#include "opencv2/core.hpp"

вместо

#include "opencv2/core/core.hpp"

Должен также работать старый метод.

Обновление В новом кандидате на выпуск, он сообщил, что у них улучшена совместимость между OpenCV 2.4 и 3.x

Улучшена совместимость с OpenCV 2.4:

  • 2.4.11 теперь включает "opencv2/core.hpp" и другие подобные заголовки в дополнение к стандартным "opencv2/core/core.hpp".
  • интеллектуальные указатели (Ptr <> ) теперь могут быть созданы как в стиле 2.4, так и в 3.0 (новое ClassName (params) vs makePtr (params))
  • обученные и сохраненные модели stat из opencv_ml 2.4 теперь может быть загружен и использован opencv_ml 3.0 как есть.
  • 2.4 = > 3,0 руководство по переходу: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html


EDIT: - Прочитайте ответ Антонио. Вы можете включить заголовок совместимости types_c.h (1) и использовать имена констант OpenCV 2, которые также работают в OpenCV 3. Это происходит потому, что, хотя постоянные имена различаются (например, INTER_LINEAR vs CV_INTER_LINEAR), постоянные значения остаются неизменными (2). Таким образом, функции, принимающие значения целочисленного const, не должны отличаться в OpenCV 2 и 3. То же самое относится и к другим константам. Таким образом, вам просто нужно изменить пути заголовков между OpenCV 2 и 3.

OLD ANSWER: - Это невозможно. OpenCV 3 не полностью обратно совместим с OpenCV 2. Вам нужно будет изменить перечисления, пути заголовков и т.д. Между OpenCV 2 и 3. См. Changelog (3) для разделов о обратной совместимости.

Вы можете попробовать такие вещи, как копирование заголовков вокруг, задание чисел вместо постоянных имен, использование #ifdefs по всему вашему коду - но рано или поздно это произойдет. Я предлагаю хранить отдельные копии и иметь спокойствие. Я бы предпочел полностью игнорировать OpenCV 2, если я не нахожусь в производстве.


Ребята из OpenCV создали онлайн-руководство для перехода: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

В сущности, я думаю, что следующее изменилось: -

  • ml module- > Существование StatModel в OpenCV 3 и то, что является корнем для всех классификаторов.
  • features2d и xfeatures2d → SIFT, а еще несколько человек перешли из основного репозитория в opecv_contrib repo
  • И многие другие, о которых я не знаю

Что касается кода, работающего с Opencv3 и opencv2, я обычно представляю директиву prepocessor, в которой есть флаг: -

#define HAS_OPENCV3 1
#ifdef HAS_OPENCV3
#include <opencv2 core.hpp=""> //Any OPENCV3 code
#else
#include <opencv2 core="" core.hpp=""> //Any Opencv2 code
#endif
</opencv2></opencv2>

Поскольку относительные части исключаются перед компиляцией, он также будет компилироваться только с библиотеками OpenCV2 или OpenCV3. Но, вводит много избыточности (чего можно избежать с помощью некоторого умного кодирования).

licensed under cc by-sa 3.0 with attribution.