193 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2018 The MediaPipe Authors.
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //      http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| #include "mediapipe/calculators/image/scale_image_utils.h"
 | |
| 
 | |
| #include "mediapipe/framework/port/gmock.h"
 | |
| #include "mediapipe/framework/port/gtest.h"
 | |
| #include "mediapipe/framework/port/status_matchers.h"
 | |
| 
 | |
| namespace mediapipe {
 | |
| namespace scale_image {
 | |
| namespace {
 | |
| 
 | |
| TEST(ScaleImageUtilsTest, FindCropDimensions) {
 | |
|   int crop_width;
 | |
|   int crop_height;
 | |
|   int col_start;
 | |
|   int row_start;
 | |
|   // No cropping because aspect ratios should be ignored.
 | |
|   MP_ASSERT_OK(FindCropDimensions(50, 100, "0/1", "1/0", &crop_width,
 | |
|                                   &crop_height, &col_start, &row_start));
 | |
|   EXPECT_EQ(50, crop_width);
 | |
|   EXPECT_EQ(100, crop_height);
 | |
|   EXPECT_EQ(0, row_start);
 | |
|   EXPECT_EQ(0, col_start);
 | |
| 
 | |
|   // Tests proto examples.
 | |
|   // 16:9 aspect ratio, should be unchanged.
 | |
|   MP_ASSERT_OK(FindCropDimensions(1920, 1080, "9/16", "16/9", &crop_width,
 | |
|                                   &crop_height, &col_start, &row_start));
 | |
|   EXPECT_EQ(0, col_start);
 | |
|   EXPECT_EQ(1920, crop_width);
 | |
|   EXPECT_EQ(0, row_start);
 | |
|   EXPECT_EQ(1080, crop_height);
 | |
|   // 10:16 aspect ratio, should be unchanged.
 | |
|   MP_ASSERT_OK(FindCropDimensions(640, 1024, "9/16", "16/9", &crop_width,
 | |
|                                   &crop_height, &col_start, &row_start));
 | |
|   EXPECT_EQ(0, col_start);
 | |
|   EXPECT_EQ(640, crop_width);
 | |
|   EXPECT_EQ(0, row_start);
 | |
|   EXPECT_EQ(1024, crop_height);
 | |
| 
 | |
|   // 2:1 aspect ratio, width is cropped.
 | |
|   MP_ASSERT_OK(FindCropDimensions(640, 320, "9/16", "16/9", &crop_width,
 | |
|                                   &crop_height, &col_start, &row_start));
 | |
|   EXPECT_EQ(36, col_start);
 | |
|   EXPECT_EQ(568, crop_width);
 | |
|   EXPECT_EQ(0, row_start);
 | |
|   EXPECT_EQ(320, crop_height);
 | |
|   // 1:5 aspect ratio, height is cropped.
 | |
|   MP_ASSERT_OK(FindCropDimensions(96, 480, "9/16", "16/9", &crop_width,
 | |
|                                   &crop_height, &col_start, &row_start));
 | |
|   EXPECT_EQ(0, col_start);
 | |
|   EXPECT_EQ(96, crop_width);
 | |
|   EXPECT_EQ(155, row_start);
 | |
|   EXPECT_EQ(170, crop_height);
 | |
| 
 | |
|   // Tests min = max, crops width.
 | |
|   MP_ASSERT_OK(FindCropDimensions(200, 100, "1/1", "1/1", &crop_width,
 | |
|                                   &crop_height, &col_start, &row_start));
 | |
|   EXPECT_EQ(50, col_start);
 | |
|   EXPECT_EQ(100, crop_width);
 | |
|   EXPECT_EQ(0, row_start);
 | |
|   EXPECT_EQ(100, crop_height);
 | |
| }
 | |
| 
 | |
| TEST(ScaleImageUtilsTest, FindOutputDimensionsPreserveRatio) {
 | |
|   int output_width;
 | |
|   int output_height;
 | |
|   // Not scale.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, -1, -1, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(200, output_width);
 | |
|   EXPECT_EQ(100, output_height);
 | |
|   // Not scale with odd input size.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(201, 101, -1, -1, false, 1, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(201, output_width);
 | |
|   EXPECT_EQ(101, output_height);
 | |
|   // Scale down by 1/2.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 100, -1, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(100, output_width);
 | |
|   EXPECT_EQ(50, output_height);
 | |
|   // Scale up, doubling dimensions.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, -1, 200, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(400, output_width);
 | |
|   EXPECT_EQ(200, output_height);
 | |
|   // Fits a 2:1 image into a 150 x 150 box. Output dimensions are always
 | |
|   // visible by 2.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 150, 150, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(150, output_width);
 | |
|   EXPECT_EQ(74, output_height);
 | |
|   // Fits a 2:1 image into a 400 x 50 box.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 400, 50, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(100, output_width);
 | |
|   EXPECT_EQ(50, output_height);
 | |
|   // Scale to multiple number with odd targe size.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 101, -1, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(100, output_width);
 | |
|   EXPECT_EQ(50, output_height);
 | |
|   // Scale to multiple number with odd targe size.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 101, -1, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(100, output_width);
 | |
|   EXPECT_EQ(50, output_height);
 | |
|   // Scale to odd size.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 151, 101, false, 1, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(151, output_width);
 | |
|   EXPECT_EQ(101, output_height);
 | |
| }
 | |
| 
 | |
| // Tests scaling without keeping the aspect ratio fixed.
 | |
| TEST(ScaleImageUtilsTest, FindOutputDimensionsNoAspectRatio) {
 | |
|   int output_width;
 | |
|   int output_height;
 | |
|   // Scale width only.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 100, -1, false, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(100, output_width);
 | |
|   EXPECT_EQ(100, output_height);
 | |
|   // Scale height only.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, -1, 200, false, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(200, output_width);
 | |
|   EXPECT_EQ(200, output_height);
 | |
|   // Scale both dimensions.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 150, 200, false, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(150, output_width);
 | |
|   EXPECT_EQ(200, output_height);
 | |
| }
 | |
| 
 | |
| // Tests scale_to_multiple_of.
 | |
| TEST(ScaleImageUtilsTest, FindOutputDimensionsDownScaleToMultipleOf) {
 | |
|   int output_width;
 | |
|   int output_height;
 | |
|   // Set no targets, downscale to a multiple of 8.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(100, 100, -1, -1, false, 8, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(96, output_width);
 | |
|   EXPECT_EQ(96, output_height);
 | |
|   // Set width target, downscale to a multiple of 8.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 100, -1, false, 8, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(96, output_width);
 | |
|   EXPECT_EQ(96, output_height);
 | |
|   // Set height target, downscale to a multiple of 8.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(201, 101, -1, 201, false, 8, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(200, output_width);
 | |
|   EXPECT_EQ(200, output_height);
 | |
|   // Set both targets, downscale to a multiple of 8.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 150, 200, false, 8, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(144, output_width);
 | |
|   EXPECT_EQ(200, output_height);
 | |
|   // Doesn't throw error if keep aspect is true and downscale multiple is 2.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 400, 200, true, 2, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(400, output_width);
 | |
|   EXPECT_EQ(200, output_height);
 | |
|   // Throws error if keep aspect is true, but downscale multiple is not 2.
 | |
|   ASSERT_THAT(FindOutputDimensions(200, 100, 400, 200, true, 4, &output_width,
 | |
|                                    &output_height),
 | |
|               testing::Not(testing::status::IsOk()));
 | |
|   // Downscaling to multiple ignored if multiple is less than 2.
 | |
|   MP_ASSERT_OK(FindOutputDimensions(200, 100, 401, 201, false, 1, &output_width,
 | |
|                                     &output_height));
 | |
|   EXPECT_EQ(401, output_width);
 | |
|   EXPECT_EQ(201, output_height);
 | |
| }
 | |
| 
 | |
| }  // namespace
 | |
| }  // namespace scale_image
 | |
| }  // namespace mediapipe
 |