diff --git a/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.cc b/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.cc index 9fd6ae171f5..6a90845b7b1 100644 --- a/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.cc +++ b/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.cc @@ -1433,5 +1433,89 @@ bool GetPerspectiveTransform(std::vector src_point, std::vector ds return true; } +bool GetAffineTransformImpl(LiteMat src, LiteMat dst) { + int m = src.height_; + int n = dst.width_; + for (int i = 0; i < m; i++) { + int k = i; + for (int j = i + 1; j < m; j++) { + if (std::abs(src.ptr(j)[i]) > std::abs(src.ptr(k)[i])) { + k = j; + } + } + + if (std::abs(src.ptr(k)[i]) < DBL_EPSILON * 100) { + return false; + } + if (k != i) { + for (int j = i; j < m; j++) { + std::swap(src.ptr(i)[j], src.ptr(k)[j]); + } + + if (dst.data_ptr_) { + for (int j = 0; j < n; j++) { + std::swap(dst.ptr(i)[j], dst.ptr(k)[j]); + } + } + } + + double d = -1 / src.ptr(i)[i]; + for (int j = i + 1; j < m; j++) { + double alpha = src.ptr(j)[i] * d; + for (k = i + 1; k < m; k++) { + src.ptr(j)[k] += alpha * src.ptr(i)[k]; + } + + if (dst.data_ptr_) { + for (k = 0; k < n; k++) { + dst.ptr(j)[k] += alpha * dst.ptr(i)[k]; + } + } + } + } + + if (dst.data_ptr_) { + for (int i = m - 1; i >= 0; i--) { + for (int j = 0; j < n; j++) { + double s = dst.ptr(i)[j]; + for (int k = i + 1; k < m; k++) { + s -= src.ptr(i)[k] * dst.ptr(k)[j]; + } + dst.ptr(i)[j] = s / src.ptr(i)[i]; + } + } + } + + return true; +} + +bool GetAffineTransform(std::vector src_point, std::vector dst_point, LiteMat &M) { + double m[6 * 6]; + double n[6]; + LiteMat src1(6, 6, m, LDataType(LDataType::DOUBLE)); + LiteMat src2(1, 6, n, LDataType(LDataType::DOUBLE)); + + for (int i = 0; i < 3; i++) { + int j = i * 12; + int k = i * 12 + 6; + m[j] = m[k + 3] = src_point[i].x; + m[j + 1] = m[k + 4] = src_point[i].y; + m[j + 2] = m[k + 5] = 1; + m[j + 3] = m[j + 4] = m[j + 5] = 0; + m[k] = m[k + 1] = m[k + 2] = 0; + n[i * 2] = dst_point[i].x; + n[i * 2 + 1] = dst_point[i].y; + } + + GetAffineTransformImpl(src1, src2); + M.Init(3, 2, LDataType(LDataType::DOUBLE)); + for (int i = 0; i < M.height_; i++) { + for (int j = 0; j < M.width_; j++) { + M.ptr(i)[j] = src2.ptr(i * M.width_ + j)[0]; + } + } + return true; +} + } // namespace dataset } // namespace mindspore diff --git a/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.h b/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.h index 6991e774966..37a2873f390 100644 --- a/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.h +++ b/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/image_process.h @@ -107,6 +107,9 @@ bool GetRotationMatrix2D(float x, float y, double angle, double scale, LiteMat & /// \brief Perspective transformation bool GetPerspectiveTransform(std::vector src_point, std::vector dst_point, LiteMat &M); +/// \brief Affine transformation +bool GetAffineTransform(std::vector src_point, std::vector dst_point, LiteMat &M); + /// \brief Matrix transpose bool Transpose(LiteMat &src, LiteMat &dst); diff --git a/mindspore/dataset/engine/datasets.py b/mindspore/dataset/engine/datasets.py index 2ec1821fc5f..292de85c0f5 100644 --- a/mindspore/dataset/engine/datasets.py +++ b/mindspore/dataset/engine/datasets.py @@ -697,7 +697,7 @@ class Dataset: python_multiprocessing, cache, callbacks) @check_filter - def filter(self, predicate, input_columns=None, num_parallel_workers=1): + def filter(self, predicate, input_columns=None, num_parallel_workers=None): """ Filter dataset by predicate. diff --git a/tests/ut/cpp/dataset/image_process_test.cc b/tests/ut/cpp/dataset/image_process_test.cc index 76869c29ae9..96a21aac98b 100644 --- a/tests/ut/cpp/dataset/image_process_test.cc +++ b/tests/ut/cpp/dataset/image_process_test.cc @@ -1241,9 +1241,8 @@ TEST_F(MindDataImageProcess, testWarpPerspectiveGrayResize) { } TEST_F(MindDataImageProcess, testGetRotationMatrix2D) { - std::vector> expect_matrix = {{0.250000, 0.433013, -0.116025}, - {-0.433013, 0.250000, 1.933013}}; - + std::vector> expect_matrix = {{0.250000, 0.433013, -0.116025}, {-0.433013, 0.250000, 1.933013}}; + double angle = 60.0; double scale = 0.5; @@ -1255,10 +1254,9 @@ TEST_F(MindDataImageProcess, testGetRotationMatrix2D) { } TEST_F(MindDataImageProcess, testGetPerspectiveTransform) { - std::vector> expect_matrix = {{1.272113, 3.665216, -788.484287}, - {-0.394146, 3.228247, -134.009780}, - {-0.001460, 0.006414, 1}}; - + std::vector> expect_matrix = { + {1.272113, 3.665216, -788.484287}, {-0.394146, 3.228247, -134.009780}, {-0.001460, 0.006414, 1}}; + std::vector src = {Point(165, 270), Point(835, 270), Point(360, 125), Point(615, 125)}; std::vector dst = {Point(165, 270), Point(835, 270), Point(100, 100), Point(500, 30)}; @@ -1268,3 +1266,16 @@ TEST_F(MindDataImageProcess, testGetPerspectiveTransform) { EXPECT_TRUE(ret); AccuracyComparison(expect_matrix, M); } + +TEST_F(MindDataImageProcess, testGetAffineTransform) { + std::vector> expect_matrix = {{0.400000, 0.066667, 16.666667}, {0.000000, 0.333333, 23.333333}}; + + std::vector src = {Point(50, 50), Point(200, 50), Point(50, 200)}; + std::vector dst = {Point(40, 40), Point(100, 40), Point(50, 90)}; + + LiteMat M; + bool ret = false; + ret = GetAffineTransform(src, dst, M); + EXPECT_TRUE(ret); + AccuracyComparison(expect_matrix, M); +}