@ -13,17 +13,83 @@
namespace opencv_test { namespace {
TEST ( blobRectToImageRect , DNN_PMODE_NULL )
{
Size inputSize ( 50 + ( rand ( ) % 100 ) / 4 * 4 , 50 + ( rand ( ) % 100 ) / 4 * 4 ) ;
Size imgSize ( 200 + ( rand ( ) % 100 ) / 4 * 4 , 200 + ( rand ( ) % 100 ) / 4 * 4 ) ;
Rect rBlob ( inputSize . width / 2 - inputSize . width / 4 , inputSize . height / 2 - inputSize . height / 4 , inputSize . width / 2 , inputSize . height / 2 ) ;
Image2BlobParams paramNet ;
paramNet . scalefactor = Scalar : : all ( 1.f ) ;
paramNet . size = inputSize ;
paramNet . ddepth = CV_32F ;
paramNet . mean = Scalar ( ) ;
paramNet . swapRB = false ;
paramNet . datalayout = DNN_LAYOUT_NHWC ;
paramNet . paddingmode = DNN_PMODE_NULL ;
Rect rOri = paramNet . blobRectToImageRect ( rBlob , imgSize ) ;
Rect rImg = Rect ( rBlob . x * ( float ) imgSize . width / inputSize . width , rBlob . y * ( float ) imgSize . height / inputSize . height ,
rBlob . width * ( float ) imgSize . width / inputSize . width , rBlob . height * ( float ) imgSize . height / inputSize . height ) ;
ASSERT_EQ ( rImg , rOri ) ;
}
TEST ( blobRectToImageRect , DNN_PMODE_CROP_CENTER )
{
Size inputSize ( 50 + ( rand ( ) % 100 ) / 4 * 4 , 50 + ( rand ( ) % 100 ) / 4 * 4 ) ;
Size imgSize ( 200 + ( rand ( ) % 100 ) / 4 * 4 , 200 + ( rand ( ) % 100 ) / 4 * 4 ) ;
Rect rBlob ( inputSize . width / 2 - inputSize . width / 4 , inputSize . height / 2 - inputSize . height / 4 , inputSize . width / 2 , inputSize . height / 2 ) ;
Image2BlobParams paramNet ;
paramNet . scalefactor = Scalar : : all ( 1.f ) ;
paramNet . size = inputSize ;
paramNet . ddepth = CV_32F ;
paramNet . mean = Scalar ( ) ;
paramNet . swapRB = false ;
paramNet . datalayout = DNN_LAYOUT_NHWC ;
paramNet . paddingmode = DNN_PMODE_CROP_CENTER ;
Rect rOri = paramNet . blobRectToImageRect ( rBlob , imgSize ) ;
float resizeFactor = std : : max ( inputSize . width / ( float ) imgSize . width ,
inputSize . height / ( float ) imgSize . height ) ;
Rect rImg = Rect ( ( rBlob . x + 0.5 * ( imgSize . width * resizeFactor - inputSize . width ) ) / resizeFactor , ( rBlob . y + 0.5 * ( imgSize . height * resizeFactor - inputSize . height ) ) / resizeFactor ,
rBlob . width / resizeFactor , rBlob . height / resizeFactor ) ;
ASSERT_EQ ( rImg , rOri ) ;
}
TEST ( blobRectToImageRect , DNN_PMODE_LETTERBOX )
{
Size inputSize ( 50 + ( rand ( ) % 100 ) / 4 * 4 , 50 + ( rand ( ) % 100 ) / 4 * 4 ) ;
Size imgSize ( 200 + ( rand ( ) % 100 ) / 4 * 4 , 200 + ( rand ( ) % 100 ) / 4 * 4 ) ;
Rect rBlob ( inputSize . width / 2 - inputSize . width / 4 , inputSize . height / 2 - inputSize . height / 4 , inputSize . width / 2 , inputSize . height / 2 ) ;
Image2BlobParams paramNet ;
paramNet . scalefactor = Scalar : : all ( 1.f ) ;
paramNet . size = inputSize ;
paramNet . ddepth = CV_32F ;
paramNet . mean = Scalar ( ) ;
paramNet . swapRB = false ;
paramNet . datalayout = DNN_LAYOUT_NHWC ;
paramNet . paddingmode = DNN_PMODE_LETTERBOX ;
Rect rOri = paramNet . blobRectToImageRect ( rBlob , imgSize ) ;
float resizeFactor = std : : min ( inputSize . width / ( float ) imgSize . width ,
inputSize . height / ( float ) imgSize . height ) ;
int rh = int ( imgSize . height * resizeFactor ) ;
int rw = int ( imgSize . width * resizeFactor ) ;
int top = ( inputSize . height - rh ) / 2 ;
int left = ( inputSize . width - rw ) / 2 ;
Rect rImg = Rect ( ( rBlob . x - left ) / resizeFactor , ( rBlob . y - top ) / resizeFactor , rBlob . width / resizeFactor , rBlob . height / resizeFactor ) ;
ASSERT_EQ ( rImg , rOri ) ;
}
TEST ( blobFromImage_4ch , Regression )
{
Mat ch [ 4 ] ;
for ( int i = 0 ; i < 4 ; i + + )
ch [ i ] = Mat : : ones ( 10 , 10 , CV_8U ) * i ;
for ( int i = 0 ; i < 4 ; i + + )
ch [ i ] = Mat : : ones ( 10 , 10 , CV_8U ) * i ;
Mat img ;
merge ( ch , 4 , img ) ;
Mat blob = dnn : : blobFromImage ( img , 1. , Size ( ) , Scalar ( ) , false , false ) ;
for ( int i = 0 ; i < 4 ; i + + )
for ( int i = 0 ; i < 4 ; i + + )
{
ch [ i ] = Mat ( img . rows , img . cols , CV_32F , blob . ptr ( 0 , i ) ) ;
ASSERT_DOUBLE_EQ ( cvtest : : norm ( ch [ i ] , cv : : NORM_INF ) , i ) ;
@ -32,7 +98,7 @@ TEST(blobFromImage_4ch, Regression)
TEST ( blobFromImage , allocated )
{
int size [ ] = { 1 , 3 , 4 , 5 } ;
int size [ ] = { 1 , 3 , 4 , 5 } ;
Mat img ( size [ 2 ] , size [ 3 ] , CV_32FC ( size [ 1 ] ) ) ;
Mat blob ( 4 , size , CV_32F ) ;
void * blobData = blob . data ;
@ -66,8 +132,8 @@ TEST(imagesFromBlob, Regression)
TEST ( blobFromImageWithParams_4ch , NHWC_scalar_scale )
{
Mat img ( 10 , 10 , CV_8UC4 , cv : : Scalar ( 0 , 1 , 2 , 3 ) ) ;
std : : vector < double > factorVec = { 0.1 , 0.2 , 0.3 , 0.4 } ;
Mat img ( 10 , 10 , CV_8UC4 , cv : : Scalar ( 0 , 1 , 2 , 3 ) ) ;
std : : vector < double > factorVec = { 0.1 , 0.2 , 0.3 , 0.4 } ;
Scalar scalefactor ( factorVec [ 0 ] , factorVec [ 1 ] , factorVec [ 2 ] , factorVec [ 3 ] ) ;
@ -77,7 +143,7 @@ TEST(blobFromImageWithParams_4ch, NHWC_scalar_scale)
Mat blob = dnn : : blobFromImageWithParams ( img , param ) ; // [1, 10, 10, 4]
float * blobPtr = blob . ptr < float > ( 0 ) ;
std : : vector < float > targetVec = { ( float ) factorVec [ 0 ] * 0 , ( float ) factorVec [ 1 ] * 1 , ( float ) factorVec [ 2 ] * 2 , ( float ) factorVec [ 3 ] * 3 } ; // Target Value.
std : : vector < float > targetVec = { ( float ) factorVec [ 0 ] * 0 , ( float ) factorVec [ 1 ] * 1 , ( float ) factorVec [ 2 ] * 2 , ( float ) factorVec [ 3 ] * 3 } ; // Target Value.
for ( int hi = 0 ; hi < 10 ; hi + + )
{
for ( int wi = 0 ; wi < 10 ; wi + + )
@ -128,16 +194,16 @@ TEST(blobFromImageWithParams_CustomPadding, letter_box)
TEST ( blobFromImageWithParams_4ch , letter_box )
{
Mat img ( 40 , 20 , CV_8UC4 , cv : : Scalar ( 0 , 1 , 2 , 3 ) ) ;
Mat img ( 40 , 20 , CV_8UC4 , cv : : Scalar ( 0 , 1 , 2 , 3 ) ) ;
// Construct target mat.
Mat targetCh [ 4 ] ;
// The letterbox will add zero at the left and right of output blob.
// After the letterbox, every row data would have same value showing as valVec.
std : : vector < uint8_t > valVec = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 } ;
std : : vector < uint8_t > valVec = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 } ;
Mat rowM ( 1 , 20 , CV_8UC1 , valVec . data ( ) ) ;
for ( int i = 0 ; i < 4 ; i + + )
for ( int i = 0 ; i < 4 ; i + + )
{
targetCh [ i ] = rowM * i ;
}
@ -163,7 +229,7 @@ TEST(blobFromImagesWithParams_4ch, multi_image)
param . scalefactor = scalefactor ;
param . datalayout = DNN_LAYOUT_NHWC ;
Mat blobs = blobFromImagesWithParams ( std : : vector < Mat > { img , 2 * img } , param ) ;
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 ] ) ) ;
@ -173,7 +239,7 @@ TEST(blobFromImagesWithParams_4ch, multi_image)
ranges [ 0 ] = Range ( 1 , 2 ) ;
Mat blob1 = blobs ( ranges ) ;
EXPECT_EQ ( 0 , cvtest : : norm ( 2 * blob0 , blob1 , NORM_INF ) ) ;
EXPECT_EQ ( 0 , cvtest : : norm ( 2 * blob0 , blob1 , NORM_INF ) ) ;
}
TEST ( readNet , Regression )