2
2
3
3
#include < catch2/catch_test_macros.hpp>
4
4
#include < opencv2/core.hpp>
5
+ #include < opencv2/imgcodecs.hpp>
5
6
6
7
#include " xpano/utils/vec.h"
7
8
@@ -22,47 +23,47 @@ TEST_CASE("Auto crop full mask / even size") {
22
23
auto result = FindLargestCrop (mask);
23
24
REQUIRE (result.has_value ());
24
25
CHECK (result->start == Point2i{0 , 0 });
25
- CHECK (result->end == Point2i{19 , 9 });
26
+ CHECK (result->end == Point2i{20 , 10 });
26
27
}
27
28
28
29
TEST_CASE (" Auto crop full mask / odd size" ) {
29
30
cv::Mat mask (10 , 21 , CV_8U, cv::Scalar (kMaskValueOn ));
30
31
auto result = FindLargestCrop (mask);
31
32
REQUIRE (result.has_value ());
32
33
CHECK (result->start == Point2i{0 , 0 });
33
- CHECK (result->end == Point2i{20 , 9 });
34
+ CHECK (result->end == Point2i{21 , 10 });
34
35
}
35
36
36
37
TEST_CASE (" Auto crop single column mask" ) {
37
38
cv::Mat mask (10 , 1 , CV_8U, cv::Scalar (kMaskValueOn ));
38
39
auto result = FindLargestCrop (mask);
39
40
REQUIRE (result.has_value ());
40
41
CHECK (result->start == Point2i{0 , 0 });
41
- CHECK (result->end == Point2i{0 , 9 });
42
+ CHECK (result->end == Point2i{1 , 10 });
42
43
}
43
44
44
45
TEST_CASE (" Auto crop two columns mask" ) {
45
46
cv::Mat mask (10 , 2 , CV_8U, cv::Scalar (kMaskValueOn ));
46
47
auto result = FindLargestCrop (mask);
47
48
REQUIRE (result.has_value ());
48
49
CHECK (result->start == Point2i{0 , 0 });
49
- CHECK (result->end == Point2i{1 , 9 });
50
+ CHECK (result->end == Point2i{2 , 10 });
50
51
}
51
52
52
53
TEST_CASE (" Auto crop single row mask" ) {
53
54
cv::Mat mask (1 , 20 , CV_8U, cv::Scalar (kMaskValueOn ));
54
55
auto result = FindLargestCrop (mask);
55
56
REQUIRE (result.has_value ());
56
57
CHECK (result->start == Point2i{0 , 0 });
57
- CHECK (result->end == Point2i{19 , 0 });
58
+ CHECK (result->end == Point2i{20 , 1 });
58
59
}
59
60
60
61
TEST_CASE (" Auto crop two rows mask" ) {
61
62
cv::Mat mask (2 , 20 , CV_8U, cv::Scalar (kMaskValueOn ));
62
63
auto result = FindLargestCrop (mask);
63
64
REQUIRE (result.has_value ());
64
65
CHECK (result->start == Point2i{0 , 0 });
65
- CHECK (result->end == Point2i{19 , 1 });
66
+ CHECK (result->end == Point2i{20 , 2 });
66
67
}
67
68
68
69
TEST_CASE (" Auto crop mask with rows set" ) {
@@ -73,7 +74,7 @@ TEST_CASE("Auto crop mask with rows set") {
73
74
auto result = FindLargestCrop (mask);
74
75
REQUIRE (result.has_value ());
75
76
CHECK (result->start == Point2i{0 , 5 });
76
- CHECK (result->end == Point2i{19 , 5 });
77
+ CHECK (result->end == Point2i{20 , 6 });
77
78
}
78
79
79
80
SECTION (" two rows" ) {
@@ -82,7 +83,7 @@ TEST_CASE("Auto crop mask with rows set") {
82
83
auto result = FindLargestCrop (mask);
83
84
REQUIRE (result.has_value ());
84
85
CHECK (result->start == Point2i{0 , 5 });
85
- CHECK (result->end == Point2i{19 , 6 });
86
+ CHECK (result->end == Point2i{20 , 7 });
86
87
}
87
88
}
88
89
@@ -91,10 +92,8 @@ TEST_CASE("Auto crop mask with empty column") {
91
92
mask.col (5 ) = 0 ;
92
93
auto result = FindLargestCrop (mask);
93
94
REQUIRE (result.has_value ());
94
- // Algorithm will stop when encountering empty column 5
95
- // this is to simplify the implementation
96
95
CHECK (result->start == Point2i{6 , 0 });
97
- CHECK (result->end == Point2i{13 , 9 });
96
+ CHECK (result->end == Point2i{20 , 10 });
98
97
}
99
98
100
99
TEST_CASE (" Auto crop empty matrix" ) {
@@ -114,7 +113,7 @@ II->1 1 1 1 1 1
114
113
1 1 0 1 1 1
115
114
IV
116
115
*/
117
- TEST_CASE (" Auto crop complex case" ) {
116
+ TEST_CASE (" Auto crop complex case I " ) {
118
117
cv::Mat mask (6 , 6 , CV_8U, cv::Scalar (kMaskValueOn ));
119
118
mask.at <unsigned char >(0 , 4 ) = 0 ;
120
119
mask.at <unsigned char >(1 , 2 ) = 0 ;
@@ -126,7 +125,35 @@ TEST_CASE("Auto crop complex case") {
126
125
auto result = FindLargestCrop (mask);
127
126
REQUIRE (result.has_value ());
128
127
CHECK (result->start == Point2i{1 , 2 });
129
- CHECK (result->end == Point2i{4 , 4 });
128
+ CHECK (result->end == Point2i{5 , 5 });
129
+ }
130
+
131
+ /* X
132
+ 1 1 1 1 1 1 X
133
+ 1 1 1 1 1 1
134
+ 1 1 0 1 1 1
135
+ 0 1 1 1 1 1
136
+ 1 1 1 1 1 1
137
+ 1 1 1 1 1 1 X
138
+ X
139
+ */
140
+ TEST_CASE (" Auto crop complex case II" ) {
141
+ cv::Mat mask (6 , 6 , CV_8U, cv::Scalar (kMaskValueOn ));
142
+ mask.at <unsigned char >(2 , 2 ) = 0 ;
143
+ mask.at <unsigned char >(3 , 0 ) = 0 ;
144
+
145
+ auto result = FindLargestCrop (mask);
146
+ REQUIRE (result.has_value ());
147
+ CHECK (result->start == Point2i{3 , 0 });
148
+ CHECK (result->end == Point2i{6 , 6 });
149
+ }
150
+
151
+ TEST_CASE (" Real life example" ) {
152
+ auto mask = cv::imread (" mask.png" , cv::IMREAD_UNCHANGED);
153
+ auto result = FindLargestCrop (mask);
154
+ REQUIRE (result.has_value ());
155
+ CHECK (result->start == Point2i{67 , 659 });
156
+ CHECK (result->end == Point2i{5985 , 2950 });
130
157
}
131
158
132
159
// NOLINTEND(readability-magic-numbers)
0 commit comments