From 47e1133e711f7c63639af1ab4a045f09fee637b0 Mon Sep 17 00:00:00 2001 From: Vladislav Sovrasov Date: Wed, 11 Oct 2017 15:46:20 +0300 Subject: [PATCH] dnn: add crop flag to blobFromImage --- modules/dnn/include/opencv2/dnn/dnn.hpp | 12 ++++++++---- modules/dnn/src/dnn.cpp | 25 +++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/modules/dnn/include/opencv2/dnn/dnn.hpp b/modules/dnn/include/opencv2/dnn/dnn.hpp index 59970e6dd4..b92ecc0fa6 100644 --- a/modules/dnn/include/opencv2/dnn/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn/dnn.hpp @@ -695,12 +695,14 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN * @param scalefactor multiplier for @p image values. * @param swapRB flag which indicates that swap first and last channels * in 3-channel image is necessary. - * @details input image is resized so one side after resize is equal to corresponing + * @param crop flag which indicates whether image will be cropped after resize or not + * @details if @p crop is true, input image is resized so one side after resize is equal to corresponing * dimension in @p size and another one is equal or larger. Then, crop from the center is performed. + * If @p crop is false, direct resize without cropping and preserving aspect ratio is performed. * @returns 4-dimansional Mat with NCHW dimensions order. */ CV_EXPORTS_W Mat blobFromImage(const Mat& image, double scalefactor=1.0, const Size& size = Size(), - const Scalar& mean = Scalar(), bool swapRB=true); + const Scalar& mean = Scalar(), bool swapRB=true, bool crop=true); /** @brief Creates 4-dimensional blob from series of images. Optionally resizes and * crops @p images from center, subtract @p mean values, scales values by @p scalefactor, * swap Blue and Red channels. @@ -711,12 +713,14 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN * @param scalefactor multiplier for @p images values. * @param swapRB flag which indicates that swap first and last channels * in 3-channel image is necessary. - * @details input image is resized so one side after resize is equal to corresponing + * @param crop flag which indicates whether image will be cropped after resize or not + * @details if @p crop is true, input image is resized so one side after resize is equal to corresponing * dimension in @p size and another one is equal or larger. Then, crop from the center is performed. + * If @p crop is false, direct resize without cropping and preserving aspect ratio is performed. * @returns 4-dimansional Mat with NCHW dimensions order. */ CV_EXPORTS_W Mat blobFromImages(const std::vector& images, double scalefactor=1.0, - Size size = Size(), const Scalar& mean = Scalar(), bool swapRB=true); + Size size = Size(), const Scalar& mean = Scalar(), bool swapRB=true, bool crop=true); /** @brief Convert all weights of Caffe network to half precision floating point. * @param src Path to origin model from Caffe framework contains single diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 424e8425a4..22592c05a3 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -85,15 +85,15 @@ static String toString(const T &v) } Mat blobFromImage(const Mat& image, double scalefactor, const Size& size, - const Scalar& mean, bool swapRB) + const Scalar& mean, bool swapRB, bool crop) { CV_TRACE_FUNCTION(); std::vector images(1, image); - return blobFromImages(images, scalefactor, size, mean, swapRB); + return blobFromImages(images, scalefactor, size, mean, swapRB, crop); } Mat blobFromImages(const std::vector& images_, double scalefactor, Size size, - const Scalar& mean_, bool swapRB) + const Scalar& mean_, bool swapRB, bool crop) { CV_TRACE_FUNCTION(); std::vector images = images_; @@ -104,13 +104,18 @@ Mat blobFromImages(const std::vector& images_, double scalefactor, Size siz size = imgSize; if (size != imgSize) { - float resizeFactor = std::max(size.width / (float)imgSize.width, - size.height / (float)imgSize.height); - resize(images[i], images[i], Size(), resizeFactor, resizeFactor); - Rect crop(Point(0.5 * (images[i].cols - size.width), - 0.5 * (images[i].rows - size.height)), - size); - images[i] = images[i](crop); + if(crop) + { + float resizeFactor = std::max(size.width / (float)imgSize.width, + size.height / (float)imgSize.height); + resize(images[i], images[i], Size(), resizeFactor, resizeFactor); + Rect crop(Point(0.5 * (images[i].cols - size.width), + 0.5 * (images[i].rows - size.height)), + size); + images[i] = images[i](crop); + } + else + resize(images[i], images[i], size); } if(images[i].depth() == CV_8U) images[i].convertTo(images[i], CV_32F);