|
41 | 41 | //M*/
|
42 | 42 |
|
43 | 43 | #include "test_precomp.hpp"
|
| 44 | +#include "opencv2/ts/ocl_test.hpp" // T-API like tests |
44 | 45 |
|
45 |
| -#include <string> |
46 |
| -#include <iostream> |
47 |
| -#include <fstream> |
48 |
| -#include <iterator> |
49 |
| -#include <limits> |
50 |
| -#include <numeric> |
51 |
| - |
52 |
| -using namespace cv; |
53 |
| -using namespace std; |
54 |
| - |
| 46 | +namespace cvtest { |
| 47 | +namespace { |
55 | 48 |
|
56 | 49 | class CV_OperationsTest : public cvtest::BaseTest
|
57 | 50 | {
|
@@ -1120,8 +1113,8 @@ void CV_OperationsTest::run( int /* start_from */)
|
1120 | 1113 | if (!TestTemplateMat())
|
1121 | 1114 | return;
|
1122 | 1115 |
|
1123 |
| - /* if (!TestMatND()) |
1124 |
| - return;*/ |
| 1116 | + if (!TestMatND()) |
| 1117 | + return; |
1125 | 1118 |
|
1126 | 1119 | if (!TestSparseMat())
|
1127 | 1120 | return;
|
@@ -1254,3 +1247,145 @@ TEST(MatTestRoi, adjustRoiOverflow)
|
1254 | 1247 |
|
1255 | 1248 | ASSERT_EQ(roi.rows, m.rows);
|
1256 | 1249 | }
|
| 1250 | + |
| 1251 | + |
| 1252 | +CV_ENUM(SortRowCol, SORT_EVERY_COLUMN, SORT_EVERY_ROW) |
| 1253 | +CV_ENUM(SortOrder, SORT_ASCENDING, SORT_DESCENDING) |
| 1254 | + |
| 1255 | +PARAM_TEST_CASE(sortIdx, MatDepth, SortRowCol, SortOrder, Size, bool) |
| 1256 | +{ |
| 1257 | + int type; |
| 1258 | + Size size; |
| 1259 | + int flags; |
| 1260 | + bool use_roi; |
| 1261 | + |
| 1262 | + Mat src, src_roi; |
| 1263 | + Mat dst, dst_roi; |
| 1264 | + |
| 1265 | + virtual void SetUp() |
| 1266 | + { |
| 1267 | + int depth = GET_PARAM(0); |
| 1268 | + int rowFlags = GET_PARAM(1); |
| 1269 | + int orderFlags = GET_PARAM(2); |
| 1270 | + size = GET_PARAM(3); |
| 1271 | + use_roi = GET_PARAM(4); |
| 1272 | + |
| 1273 | + type = CV_MAKE_TYPE(depth, 1); |
| 1274 | + |
| 1275 | + flags = rowFlags | orderFlags; |
| 1276 | + } |
| 1277 | + |
| 1278 | + void generateTestData() |
| 1279 | + { |
| 1280 | + Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0); |
| 1281 | + randomSubMat(src, src_roi, size, srcBorder, type, -100, 100); |
| 1282 | + |
| 1283 | + Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0); |
| 1284 | + randomSubMat(dst, dst_roi, size, dstBorder, CV_32S, 5, 16); |
| 1285 | + } |
| 1286 | + |
| 1287 | + template<typename T> |
| 1288 | + void check_(const cv::Mat& values_, const cv::Mat_<int>& idx_) |
| 1289 | + { |
| 1290 | + cv::Mat_<T>& values = (cv::Mat_<T>&)values_; |
| 1291 | + cv::Mat_<int>& idx = (cv::Mat_<int>&)idx_; |
| 1292 | + size_t N = values.total(); |
| 1293 | + std::vector<bool> processed(N, false); |
| 1294 | + int prevIdx = idx(0); |
| 1295 | + T prevValue = values(prevIdx); |
| 1296 | + processed[prevIdx] = true; |
| 1297 | + for (size_t i = 1; i < N; i++) |
| 1298 | + { |
| 1299 | + int nextIdx = idx((int)i); |
| 1300 | + T value = values(nextIdx); |
| 1301 | + ASSERT_EQ(false, processed[nextIdx]) << "Indexes must be unique. i=" << i << " idx=" << nextIdx << std::endl << idx; |
| 1302 | + processed[nextIdx] = true; |
| 1303 | + if ((flags & SORT_DESCENDING) == SORT_DESCENDING) |
| 1304 | + ASSERT_GE(prevValue, value) << "i=" << i << " prevIdx=" << prevIdx << " idx=" << nextIdx; |
| 1305 | + else |
| 1306 | + ASSERT_LE(prevValue, value) << "i=" << i << " prevIdx=" << prevIdx << " idx=" << nextIdx; |
| 1307 | + prevValue = value; |
| 1308 | + prevIdx = nextIdx; |
| 1309 | + } |
| 1310 | + } |
| 1311 | + |
| 1312 | + void validate() |
| 1313 | + { |
| 1314 | + ASSERT_EQ(CV_32SC1, dst_roi.type()); |
| 1315 | + ASSERT_EQ(size, dst_roi.size()); |
| 1316 | + bool isColumn = (flags & SORT_EVERY_COLUMN) == SORT_EVERY_COLUMN; |
| 1317 | + size_t N = isColumn ? src_roi.cols : src_roi.rows; |
| 1318 | + Mat values_row((int)N, 1, type), idx_row((int)N, 1, CV_32S); |
| 1319 | + for (size_t i = 0; i < N; i++) |
| 1320 | + { |
| 1321 | + SCOPED_TRACE(cv::format("row/col=%d", (int)i)); |
| 1322 | + if (isColumn) |
| 1323 | + { |
| 1324 | + src_roi.col((int)i).copyTo(values_row); |
| 1325 | + dst_roi.col((int)i).copyTo(idx_row); |
| 1326 | + } |
| 1327 | + else |
| 1328 | + { |
| 1329 | + src_roi.row((int)i).copyTo(values_row); |
| 1330 | + dst_roi.row((int)i).copyTo(idx_row); |
| 1331 | + } |
| 1332 | + switch(type) |
| 1333 | + { |
| 1334 | + case CV_8U: check_<uchar>(values_row, idx_row); break; |
| 1335 | + case CV_8S: check_<char>(values_row, idx_row); break; |
| 1336 | + case CV_16S: check_<short>(values_row, idx_row); break; |
| 1337 | + case CV_32S: check_<int>(values_row, idx_row); break; |
| 1338 | + case CV_32F: check_<float>(values_row, idx_row); break; |
| 1339 | + case CV_64F: check_<double>(values_row, idx_row); break; |
| 1340 | + default: ASSERT_FALSE(true) << "Unsupported type: " << type; |
| 1341 | + } |
| 1342 | + } |
| 1343 | + } |
| 1344 | +}; |
| 1345 | + |
| 1346 | +TEST_P(sortIdx, simple) |
| 1347 | +{ |
| 1348 | + for (int j = 0; j < 5; j++) |
| 1349 | + { |
| 1350 | + generateTestData(); |
| 1351 | + |
| 1352 | + cv::sortIdx(src_roi, dst_roi, flags); |
| 1353 | + validate(); |
| 1354 | + } |
| 1355 | +} |
| 1356 | + |
| 1357 | +INSTANTIATE_TEST_CASE_P(Core, sortIdx, Combine( |
| 1358 | + Values(CV_8U, CV_8S, CV_16S, CV_32S, CV_32F, CV_64F), // depth |
| 1359 | + Values(SORT_EVERY_COLUMN, SORT_EVERY_ROW), |
| 1360 | + Values(SORT_ASCENDING, SORT_DESCENDING), |
| 1361 | + Values(Size(3, 3), Size(16, 8)), |
| 1362 | + ::testing::Bool() |
| 1363 | +)); |
| 1364 | + |
| 1365 | + |
| 1366 | +TEST(Core_sortIdx, regression_8941) |
| 1367 | +{ |
| 1368 | + cv::Mat src = (cv::Mat_<int>(3, 3) << |
| 1369 | + 1, 2, 3, |
| 1370 | + 0, 9, 5, |
| 1371 | + 8, 1, 6 |
| 1372 | + ); |
| 1373 | + cv::Mat expected = (cv::Mat_<int>(3, 1) << |
| 1374 | + 1, |
| 1375 | + 0, |
| 1376 | + 2 |
| 1377 | + ); |
| 1378 | + |
| 1379 | + cv::Mat result; |
| 1380 | + cv::sortIdx(src.col(0), result, CV_SORT_EVERY_COLUMN | CV_SORT_ASCENDING); |
| 1381 | +#if 0 |
| 1382 | + std::cout << src.col(0) << std::endl; |
| 1383 | + std::cout << result << std::endl; |
| 1384 | +#endif |
| 1385 | + ASSERT_EQ(expected.size(), result.size()); |
| 1386 | + EXPECT_EQ(0, cvtest::norm(expected, result, NORM_INF)) << |
| 1387 | + "result=" << std::endl << result << std::endl << |
| 1388 | + "expected=" << std::endl << expected; |
| 1389 | +} |
| 1390 | + |
| 1391 | +}} // namespace |
0 commit comments