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?
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
Dans OpenCV 4.0:
findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
Une alternative pour travailler avec 2.x 、 3.x 、 4.x est:
cnts, hiers = cv2.findContours(...)[-2:]
Quelques liens:
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.
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.