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

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

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

8

Решение

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

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

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

От ссылка Киран размещена:

В 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 (новое имя класса (params) против
    makePtr (PARAMS))
  • обученные и сохраненные модели статистики из
    opencv_ml 2.4 теперь может быть загружен и использован opencv_ml 3.0 как есть.
  • 2.4 => 3.0 руководство по переходу было набросано: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html
5

Другие решения

РЕДАКТИРОВАТЬ: — Прочитайте ответ Антонио. Вы можете включить заголовок совместимости types_c.h(1) и использовать имена констант OpenCV 2, которые также работают в OpenCV 3. Это потому, что, хотя имена констант отличаются (например, INTER_LINEAR против CV_INTER_LINEAR), постоянная ценности оставаться прежним(2). Таким образом, функции, принимающие целочисленные значения констант, должны вести себя одинаково в OpenCV 2 и 3. То же самое можно сказать и о других константах. Таким образом, вам просто нужно изменить пути заголовков между OpenCV 2 и 3.

СТАРЫЙ ОТВЕТ: — Это невозможно. OpenCV 3 не полностью обратно совместим с OpenCV 2. Вам придется менять перечисления, пути заголовков и т. Д. Между OpenCV 2 и 3. См. Журнал изменений (3) для разделов о обратной совместимости.

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

5

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

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

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

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

#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 или OpenCV3. Но вводит много избыточности (чего можно избежать с помощью некоторого умного кодирования).

0
По вопросам рекламы [email protected]