web-dev-qa-db-fra.com

En quoi l'opencv 4.x API est-elle différente de la version précédente?

J'ai remarqué qu'opencv 4 est sorti et une différence est que l'API a été modifiée pour être conforme à c ++ 11.

Qu'est-ce que cela signifie vraiment?

Comment changer mes codes pour être compatible avec cette version?

6
mans

Je pense que le plus différent est le OpenCV 4.0 utilise plus de fonctionnalités C++ 11. À présent cv::String == std::string et cv::Ptr est une mince enveloppe au-dessus de std::shared_ptr.

Le dossier de suppression d'Opencv 4.0 include/opencv et ne conservez que include/opencv2. Un grand nombre d'API C d'OpenCV 1.x a été supprimé. Les modules concernés sont objdetect, photo, video, videoio, imgcodecs, calib3d. L'ancienne définition de macro ou énumération sans nom n'est pas suggérée, utilisez nommée enum insted.

//! 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.
     };

    // ...
}

Tels que, lors de la lecture de l'image, cela devrait ressembler à ceci:

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

À l'exception des nouvelles fonctionnalités, la plupart des API C++ restent les mêmes. Alors que le plus grand différent que j'ai trouvé est cv2.findContours (dans Python OpenCV):

Dans OpenCV 3.4:

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

enter image description here

Dans OpenCV 4.0:

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

enter image description here

Une alternative pour travailler avec 2.x 、 3.x 、 4.x est:

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

Quelques liens:

  1. version OpenCV
  2. OpenCV ChangeLog
  3. Introduction à OpenCV
  4. Documentation OpenCV
  5. Comment utiliser `cv2.findContours` dans différentes versions d'OpenCV?
  6. OpenCV sur Stackoverflow

7
Kinght 金

Selon OpenCV 4.0. , vous n'avez pas à apporter de modifications importantes (très probablement pas du tout) à vos codes source, sauf si vous utilisez une API C qui a été supprimée.

Comme déjà indiqué

OpenCV est maintenant une bibliothèque C++ 11 et nécessite un compilateur compatible C++ 11

Utiliser c++11, la version 3.3 de clang et plus est requise avec le drapeau -std=c++11. Idem pour g ++ 4.3 et supérieur.

Il leur permet d'utiliser std::string au lieu de cv::String, et d'autres fonctionnalités c ++ 11. Mais ne vous inquiétez pas, cv::String fonctionnera toujours, mais est maintenant allias pour std::string. Similliar pour les pointeurs intelligents, etc.

3
kocica

Je pense que l'impact le plus vital est que vous devez utiliser un compilateur c ++ 11.

En outre, il ne peut pas modifier l'interface mais leur permettre d'utiliser les modifications de langue mises à jour, telles que les pointeurs intelligents, etc.

1
Eddie C.