dnn: add crop flag to blobFromImage

This commit is contained in:
Vladislav Sovrasov 2017-10-11 15:46:20 +03:00
parent 1ea1ff197d
commit 47e1133e71
2 changed files with 23 additions and 14 deletions

View File

@ -695,12 +695,14 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
* @param scalefactor multiplier for @p image values. * @param scalefactor multiplier for @p image values.
* @param swapRB flag which indicates that swap first and last channels * @param swapRB flag which indicates that swap first and last channels
* in 3-channel image is necessary. * 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. * 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. * @returns 4-dimansional Mat with NCHW dimensions order.
*/ */
CV_EXPORTS_W Mat blobFromImage(const Mat& image, double scalefactor=1.0, const Size& size = Size(), 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 /** @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, * crops @p images from center, subtract @p mean values, scales values by @p scalefactor,
* swap Blue and Red channels. * swap Blue and Red channels.
@ -711,12 +713,14 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
* @param scalefactor multiplier for @p images values. * @param scalefactor multiplier for @p images values.
* @param swapRB flag which indicates that swap first and last channels * @param swapRB flag which indicates that swap first and last channels
* in 3-channel image is necessary. * 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. * 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. * @returns 4-dimansional Mat with NCHW dimensions order.
*/ */
CV_EXPORTS_W Mat blobFromImages(const std::vector<Mat>& images, double scalefactor=1.0, CV_EXPORTS_W Mat blobFromImages(const std::vector<Mat>& 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. /** @brief Convert all weights of Caffe network to half precision floating point.
* @param src Path to origin model from Caffe framework contains single * @param src Path to origin model from Caffe framework contains single

View File

@ -85,15 +85,15 @@ static String toString(const T &v)
} }
Mat blobFromImage(const Mat& image, double scalefactor, const Size& size, 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(); CV_TRACE_FUNCTION();
std::vector<Mat> images(1, image); std::vector<Mat> images(1, image);
return blobFromImages(images, scalefactor, size, mean, swapRB); return blobFromImages(images, scalefactor, size, mean, swapRB, crop);
} }
Mat blobFromImages(const std::vector<Mat>& images_, double scalefactor, Size size, Mat blobFromImages(const std::vector<Mat>& images_, double scalefactor, Size size,
const Scalar& mean_, bool swapRB) const Scalar& mean_, bool swapRB, bool crop)
{ {
CV_TRACE_FUNCTION(); CV_TRACE_FUNCTION();
std::vector<Mat> images = images_; std::vector<Mat> images = images_;
@ -103,6 +103,8 @@ Mat blobFromImages(const std::vector<Mat>& images_, double scalefactor, Size siz
if (size == Size()) if (size == Size())
size = imgSize; size = imgSize;
if (size != imgSize) if (size != imgSize)
{
if(crop)
{ {
float resizeFactor = std::max(size.width / (float)imgSize.width, float resizeFactor = std::max(size.width / (float)imgSize.width,
size.height / (float)imgSize.height); size.height / (float)imgSize.height);
@ -112,6 +114,9 @@ Mat blobFromImages(const std::vector<Mat>& images_, double scalefactor, Size siz
size); size);
images[i] = images[i](crop); images[i] = images[i](crop);
} }
else
resize(images[i], images[i], size);
}
if(images[i].depth() == CV_8U) if(images[i].depth() == CV_8U)
images[i].convertTo(images[i], CV_32F); images[i].convertTo(images[i], CV_32F);
Scalar mean = mean_; Scalar mean = mean_;