Моя библиотека в настоящее время использует OpenCV 2. Теперь я пытаюсь скомпилировать библиотеку для использования OpenCV 3. Кажется, что некоторые заголовочные файлы были перемещены, а некоторые константы были переименованы. Например, CV_INTER_LINEAR
не определено в OpenCV 3.
Поскольку моя библиотека должна быть скомпилирована и запущена как на OpenCV 2, так и на 3, существует ли простой способ преодоления этой несовместимости?
Я могу изменить свой код, но тогда он не работает в OpenCV 2.
У меня была такая же проблема несколько месяцев назад, и я должен противопоставить Кирану: я получил свой относительно большой проект для сборки с использованием 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
РЕДАКТИРОВАТЬ: — Прочитайте ответ Антонио. Вы можете включить заголовок совместимости 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, если я не работаю в данный момент.
Ребята из OpenCV выложили руководство по переходу онлайн: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html
По сути, я думаю, что изменилось следующее:
Что касается кода, работающего с 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. Но вводит много избыточности (чего можно избежать с помощью некоторого умного кодирования).