Чем API opencv 4.x отличается от предыдущей версии? - PullRequest
0 голосов
/ 23 декабря 2018

Я заметил, что opencv 4 выпущен, и одно отличие состоит в том, что API изменен, чтобы быть совместимым с c ++ 11.

Что это действительно означает?

Как мне изменить свои коды, чтобысовместим с этой версией?

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Согласно OpenCV 4.0.0 , вам не нужно вносить каких-либо существенных изменений (скорее всего, вообще) в ваши исходные коды, если вы не используете какой-либо C API, который был удален.

Как уже говорилось

OpenCV теперь является библиотекой C ++ 11, а требует C ++ 11-совместимого компилятора

Чтобы использовать c++11, требуется лямка версии 3.3 и выше с флагом -std=c++11.То же самое для g ++ 4.3 и выше.

Это позволяет им использовать std::string вместо cv::String и другие функции c ++ 11.Но не волнуйтесь, cv::String все еще будет работать, но теперь является псевдонимом для std::string.Similliar для умных указателей и т. Д.

0 голосов
/ 24 декабря 2018

Я думаю, что самое разное, OpenCV 4.0 использует больше возможностей C ++ 11.Теперь cv::String == std::string и cv::Ptr - это тонкая оболочка поверх std::shared_ptr.

Opencv 4.0 удаляет папку include/opencv и сохраняет только include/opencv2.Большая часть C API из OpenCV 1.x была удалена.Затронутые модули objdetect, photo, video, videoio, imgcodecs, calib3d.Старое определение макроса или безымянное перечисление не предлагается, используйте именованное перечисление enum.

//! include/opencv2/imgcodes.hpp
namespace cv
{

//! @addtogroup imgcodecs
//! @{

//! Imread flags
enum ImreadModes {
       IMREAD_UNCHANGED            = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
       IMREAD_GRAYSCALE            = 0,  //!< If set, always convert image to the single channel grayscale image (codec internal conversion).
       IMREAD_COLOR                = 1,  //!< If set, always convert image to the 3 channel BGR color image.
       IMREAD_ANYDEPTH             = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
       IMREAD_ANYCOLOR             = 4,  //!< If set, the image is read in any possible color format.
       IMREAD_LOAD_GDAL            = 8,  //!< If set, use the gdal driver for loading the image.
       IMREAD_REDUCED_GRAYSCALE_2  = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
       IMREAD_REDUCED_COLOR_2      = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
       IMREAD_REDUCED_GRAYSCALE_4  = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
       IMREAD_REDUCED_COLOR_4      = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
       IMREAD_REDUCED_GRAYSCALE_8  = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
       IMREAD_REDUCED_COLOR_8      = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
       IMREAD_IGNORE_ORIENTATION   = 128 //!< If set, do not rotate the image according to EXIF's orientation flag.
     };

    // ...
}

Например, при считывании изображения оно должно выглядеть примерно так:

cv::Mat img = cv::imread("test.png", cv::IMREAD_COLOR);

За исключением новых возможностей, большинство API C ++ сохраняют то же самое.Хотя самое большое различие, которое я нашел, это cv2.findContoursPython OpenCV):

В OpenCV 3.4:

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy

enter image description here

В OpenCV 4.0:

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy

enter image description here

Альтернативой для работы с 2.x 、 3.x 、 4.x является:

cnts, hiers = cv2.findContours(...)[-2:]

Некоторые ссылки:

  1. Выпуск OpenCV
  2. OpenCV ChangeLog
  3. Введение в OpenCV
  4. Документация OpenCV
  5. Как использовать `cv2.findContours` в различных версиях OpenCV?
  6. OpenCV на Stackoverflow

0 голосов
/ 23 декабря 2018

Я думаю, что наиболее важным для вас является использование компилятора c ++ 11.

Кроме того, он может не изменять интерфейс, но позволяет им использовать обновленные изменения языка, такие как smartуказатели и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...