mirror of
https://github.com/opencv/opencv.git
synced 2025-06-12 20:42:53 +08:00
Update dnn_utils.cpp
This commit is contained in:
parent
7d59db4ec4
commit
674c618471
@ -5,6 +5,7 @@
|
|||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#include <opencv2/imgproc.hpp>
|
#include <opencv2/imgproc.hpp>
|
||||||
|
#include <opencv2/core/utils/logger.hpp>
|
||||||
|
|
||||||
|
|
||||||
namespace cv {
|
namespace cv {
|
||||||
@ -100,15 +101,29 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
|
|||||||
images_.getMatVector(images);
|
images_.getMatVector(images);
|
||||||
CV_Assert(!images.empty());
|
CV_Assert(!images.empty());
|
||||||
|
|
||||||
int nch = images[0].channels();
|
|
||||||
Scalar scalefactor = param.scalefactor;
|
|
||||||
|
|
||||||
if (param.ddepth == CV_8U)
|
if (param.ddepth == CV_8U)
|
||||||
{
|
{
|
||||||
CV_Assert(scalefactor == Scalar::all(1.0) && "Scaling is not supported for CV_8U blob depth");
|
CV_Assert(param.scalefactor == Scalar::all(1.0) && "Scaling is not supported for CV_8U blob depth");
|
||||||
CV_Assert(param.mean == Scalar() && "Mean subtraction is not supported for CV_8U blob depth");
|
CV_Assert(param.mean == Scalar() && "Mean subtraction is not supported for CV_8U blob depth");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nch = images[0].channels();
|
||||||
|
Scalar scalefactor = param.scalefactor;
|
||||||
|
Scalar mean = param.mean;
|
||||||
|
|
||||||
|
if (param.swapRB)
|
||||||
|
{
|
||||||
|
if (nch > 2)
|
||||||
|
{
|
||||||
|
std::swap(mean[0], mean[2]);
|
||||||
|
std::swap(scalefactor[0], scalefactor[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CV_LOG_WARNING(NULL, "Red/blue color swapping requires at least three image channels.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < images.size(); i++)
|
for (size_t i = 0; i < images.size(); i++)
|
||||||
{
|
{
|
||||||
Size imgSize = images[i].size();
|
Size imgSize = images[i].size();
|
||||||
@ -126,34 +141,26 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
|
|||||||
size);
|
size);
|
||||||
images[i] = images[i](crop);
|
images[i] = images[i](crop);
|
||||||
}
|
}
|
||||||
|
else if (param.paddingmode == DNN_PMODE_LETTERBOX)
|
||||||
|
{
|
||||||
|
float resizeFactor = std::min(size.width / (float)imgSize.width,
|
||||||
|
size.height / (float)imgSize.height);
|
||||||
|
int rh = int(imgSize.height * resizeFactor);
|
||||||
|
int rw = int(imgSize.width * resizeFactor);
|
||||||
|
resize(images[i], images[i], Size(rw, rh), INTER_LINEAR);
|
||||||
|
|
||||||
|
int top = (size.height - rh)/2;
|
||||||
|
int bottom = size.height - top - rh;
|
||||||
|
int left = (size.width - rw)/2;
|
||||||
|
int right = size.width - left - rw;
|
||||||
|
copyMakeBorder(images[i], images[i], top, bottom, left, right, BORDER_CONSTANT);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (param.paddingmode == DNN_PMODE_LETTERBOX)
|
resize(images[i], images[i], size, 0, 0, INTER_LINEAR);
|
||||||
{
|
|
||||||
float resizeFactor = std::min(size.width / (float)imgSize.width,
|
|
||||||
size.height / (float)imgSize.height);
|
|
||||||
int rh = int(imgSize.height * resizeFactor);
|
|
||||||
int rw = int(imgSize.width * resizeFactor);
|
|
||||||
resize(images[i], images[i], Size(rw, rh), INTER_LINEAR);
|
|
||||||
|
|
||||||
int top = (size.height - rh)/2;
|
|
||||||
int bottom = size.height - top - rh;
|
|
||||||
int left = (size.width - rw)/2;
|
|
||||||
int right = size.width - left - rw;
|
|
||||||
copyMakeBorder(images[i], images[i], top, bottom, left, right, BORDER_CONSTANT);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
resize(images[i], images[i], size, 0, 0, INTER_LINEAR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Scalar mean = param.mean;
|
|
||||||
if (param.swapRB)
|
|
||||||
{
|
|
||||||
std::swap(mean[0], mean[2]);
|
|
||||||
std::swap(scalefactor[0], scalefactor[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (images[i].depth() == CV_8U && param.ddepth == CV_32F)
|
if (images[i].depth() == CV_8U && param.ddepth == CV_32F)
|
||||||
images[i].convertTo(images[i], CV_32F);
|
images[i].convertTo(images[i], CV_32F);
|
||||||
|
|
||||||
@ -220,18 +227,22 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
|
|||||||
CV_Assert(image.depth() == blob_.depth());
|
CV_Assert(image.depth() == blob_.depth());
|
||||||
CV_Assert(image.channels() == image0.channels());
|
CV_Assert(image.channels() == image0.channels());
|
||||||
CV_Assert(image.size() == image0.size());
|
CV_Assert(image.size() == image0.size());
|
||||||
if (param.swapRB)
|
if (nch > 2 && param.swapRB)
|
||||||
{
|
{
|
||||||
Mat tmpRB;
|
Mat tmpRB;
|
||||||
cvtColor(image, tmpRB, COLOR_BGR2RGB);
|
cvtColor(image, tmpRB, COLOR_BGR2RGB);
|
||||||
tmpRB.copyTo(Mat(tmpRB.rows, tmpRB.cols, subMatType, blob.ptr((int)i, 0)));
|
tmpRB.copyTo(Mat(tmpRB.rows, tmpRB.cols, subMatType, blob.ptr((int)i, 0)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
image.copyTo(Mat(image.rows, image.cols, subMatType, blob.ptr((int)i, 0)));
|
image.copyTo(Mat(image.rows, image.cols, subMatType, blob.ptr((int)i, 0)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
CV_Error(Error::StsUnsupportedFormat, "Unsupported data layout in blobFromImagesWithParams function.");
|
CV_Error(Error::StsUnsupportedFormat, "Unsupported data layout in blobFromImagesWithParams function.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imagesFromBlob(const cv::Mat& blob_, OutputArrayOfArrays images_)
|
void imagesFromBlob(const cv::Mat& blob_, OutputArrayOfArrays images_)
|
||||||
|
@ -120,6 +120,28 @@ TEST(blobFromImageWithParams_4ch, letter_box)
|
|||||||
EXPECT_EQ(0, cvtest::norm(targetBlob, blob, NORM_INF));
|
EXPECT_EQ(0, cvtest::norm(targetBlob, blob, NORM_INF));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(blobFromImagesWithParams_4ch, multi_image)
|
||||||
|
{
|
||||||
|
Mat img(10, 10, CV_8UC4, cv::Scalar(0, 1, 2, 3));
|
||||||
|
Scalar scalefactor(0.1, 0.2, 0.3, 0.4);
|
||||||
|
|
||||||
|
Image2BlobParams param;
|
||||||
|
param.scalefactor = scalefactor;
|
||||||
|
param.datalayout = DNN_LAYOUT_NHWC;
|
||||||
|
|
||||||
|
Mat blobs = blobFromImagesWithParams(std::vector<Mat> { img, 2*img }, param);
|
||||||
|
vector<Range> ranges;
|
||||||
|
ranges.push_back(Range(0, 1));
|
||||||
|
ranges.push_back(Range(0, blobs.size[1]));
|
||||||
|
ranges.push_back(Range(0, blobs.size[2]));
|
||||||
|
ranges.push_back(Range(0, blobs.size[3]));
|
||||||
|
Mat blob0 = blobs(ranges);
|
||||||
|
ranges[0] = Range(1, 2);
|
||||||
|
Mat blob1 = blobs(ranges);
|
||||||
|
|
||||||
|
EXPECT_EQ(0, cvtest::norm(2*blob0, blob1, NORM_INF));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(readNet, Regression)
|
TEST(readNet, Regression)
|
||||||
{
|
{
|
||||||
Net net = readNet(findDataFile("dnn/squeezenet_v1.1.prototxt"),
|
Net net = readNet(findDataFile("dnn/squeezenet_v1.1.prototxt"),
|
||||||
|
Loading…
Reference in New Issue
Block a user