Browse Source

!11635 【MD】【BUG】Add parameter verification for getROI function

From: @xulei2020
Reviewed-by: @pandoublefeng,@liucunwei
Signed-off-by: @pandoublefeng
tags/v1.2.0-rc1
mindspore-ci-bot Gitee 4 years ago
parent
commit
59e5be7ae0
2 changed files with 55 additions and 17 deletions
  1. +24
    -4
      mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/lite_mat.cc
  2. +31
    -13
      tests/ut/cpp/dataset/image_process_test.cc

+ 24
- 4
mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/lite_mat.cc View File

@@ -299,7 +299,7 @@ void LiteMat::AlignFree(void *ptr) {
inline void LiteMat::InitElemSize(LDataType data_type) { elem_size_ = data_type.SizeInBytes(); } inline void LiteMat::InitElemSize(LDataType data_type) { elem_size_ = data_type.SizeInBytes(); }


bool LiteMat::GetROI(int x, int y, int w, int h, LiteMat &m) { bool LiteMat::GetROI(int x, int y, int w, int h, LiteMat &m) {
if (x < 0 || y < 0 || x + w > width_ || h + y > height_) {
if (x < 0 || y < 0 || x > width_ - w || h > height_ - y || w < 0 || h < 0) {
return false; return false;
} }
if (!m.IsEmpty()) { if (!m.IsEmpty()) {
@@ -374,7 +374,7 @@ inline void SubtractImpl(const uint32_t *src0, const uint32_t *src1, uint32_t *d
} }
} }


bool Subtract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
inline bool CheckSubstract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (dst == NULL) { if (dst == NULL) {
return false; return false;
} }
@@ -386,6 +386,13 @@ bool Subtract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (src_a.data_type_ != src_b.data_type_) { if (src_a.data_type_ != src_b.data_type_) {
return false; return false;
} }
return true;
}

bool Subtract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (!CheckSubstract(src_a, src_b, dst)) {
return false;
}


if (dst->IsEmpty()) { if (dst->IsEmpty()) {
dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_); dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_);
@@ -534,7 +541,7 @@ inline void DivideImpl(const uint32_t *src0, const uint32_t *src1, uint32_t *dst
} }
} }


bool Divide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
inline bool CheckDivide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (dst == NULL) { if (dst == NULL) {
return false; return false;
} }
@@ -546,6 +553,13 @@ bool Divide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (src_a.data_type_ != src_b.data_type_) { if (src_a.data_type_ != src_b.data_type_) {
return false; return false;
} }
return true;
}

bool Divide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (!CheckDivide(src_a, src_b, dst)) {
return true;
}


if (dst->IsEmpty()) { if (dst->IsEmpty()) {
dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_); dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_);
@@ -635,7 +649,7 @@ inline void MultiplyImpl(const uint32_t *src0, const uint32_t *src1, uint32_t *d
} }
} }


bool Multiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
inline bool CheckMultiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (dst == NULL) { if (dst == NULL) {
return false; return false;
} }
@@ -647,7 +661,13 @@ bool Multiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (src_a.data_type_ != src_b.data_type_) { if (src_a.data_type_ != src_b.data_type_) {
return false; return false;
} }
return true;
}


bool Multiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) {
if (!CheckMultiply(src_a, src_b, dst)) {
return false;
}
if (dst->IsEmpty()) { if (dst->IsEmpty()) {
dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_); dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_);
} else if (src_a.width_ != dst->width_ || src_a.height_ != dst->height_ || src_a.channel_ != dst->channel_) { } else if (src_a.width_ != dst->width_ || src_a.height_ != dst->height_ || src_a.channel_ != dst->channel_) {


+ 31
- 13
tests/ut/cpp/dataset/image_process_test.cc View File

@@ -917,6 +917,24 @@ TEST_F(MindDataImageProcess, testROI3C) {
cv::imwrite("./lite_roi.jpg", dst_imageR); cv::imwrite("./lite_roi.jpg", dst_imageR);
} }


TEST_F(MindDataImageProcess, testROI3CFalse) {
std::string filename = "data/dataset/apple.jpg";
cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR);

cv::Mat cv_roi = cv::Mat(src_image, cv::Rect(500, 500, 3000, 1500));

cv::imwrite("./cv_roi.jpg", cv_roi);

bool ret = false;
LiteMat lite_mat_bgr;
ret = InitFromPixel(src_image.data, LPixelType::BGR, LDataType::UINT8, src_image.cols, src_image.rows, lite_mat_bgr);
EXPECT_TRUE(ret);
LiteMat lite_roi;

ret = lite_mat_bgr.GetROI(500, 500, 1200, -100, lite_roi);
EXPECT_FALSE(ret);
}

TEST_F(MindDataImageProcess, testROI1C) { TEST_F(MindDataImageProcess, testROI1C) {
std::string filename = "data/dataset/apple.jpg"; std::string filename = "data/dataset/apple.jpg";
cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR); cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR);
@@ -952,9 +970,7 @@ TEST_F(MindDataImageProcess, testROI1C) {
cv::imwrite("./lite_roi.jpg", dst_imageR); cv::imwrite("./lite_roi.jpg", dst_imageR);
} }




//warp
// warp
TEST_F(MindDataImageProcess, testWarpAffineBGR) { TEST_F(MindDataImageProcess, testWarpAffineBGR) {
std::string filename = "data/dataset/apple.jpg"; std::string filename = "data/dataset/apple.jpg";
cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR); cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR);
@@ -986,7 +1002,8 @@ TEST_F(MindDataImageProcess, testWarpAffineBGR) {
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_, PADD_BORDER_CONSTANT, borderValues);
ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_,
PADD_BORDER_CONSTANT, borderValues);
EXPECT_TRUE(ret); EXPECT_TRUE(ret);


cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_);
@@ -1024,7 +1041,8 @@ TEST_F(MindDataImageProcess, testWarpAffineBGRScale) {
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_, PADD_BORDER_CONSTANT, borderValues);
ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_,
PADD_BORDER_CONSTANT, borderValues);
EXPECT_TRUE(ret); EXPECT_TRUE(ret);


cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_);
@@ -1062,8 +1080,8 @@ TEST_F(MindDataImageProcess, testWarpAffineBGRResize) {
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300, PADD_BORDER_CONSTANT,
borderValues);
ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300,
PADD_BORDER_CONSTANT, borderValues);
EXPECT_TRUE(ret); EXPECT_TRUE(ret);


cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_);
@@ -1106,8 +1124,8 @@ TEST_F(MindDataImageProcess, testWarpAffineGray) {
LiteMat lite_warp; LiteMat lite_warp;
std::vector<uint8_t> borderValues; std::vector<uint8_t> borderValues;
borderValues.push_back(0); borderValues.push_back(0);
ret = WarpAffineBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, lite_mat_gray.height_ - 300, PADD_BORDER_CONSTANT,
borderValues);
ret = WarpAffineBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, lite_mat_gray.height_ - 300,
PADD_BORDER_CONSTANT, borderValues);
EXPECT_TRUE(ret); EXPECT_TRUE(ret);


cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC1, lite_warp.data_ptr_); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC1, lite_warp.data_ptr_);
@@ -1153,8 +1171,8 @@ TEST_F(MindDataImageProcess, testWarpPerspectiveBGRResize) {
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
borderValues.push_back(0); borderValues.push_back(0);
ret = WarpPerspectiveBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300, PADD_BORDER_CONSTANT,
borderValues);
ret = WarpPerspectiveBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300,
PADD_BORDER_CONSTANT, borderValues);
EXPECT_TRUE(ret); EXPECT_TRUE(ret);


cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_);
@@ -1205,8 +1223,8 @@ TEST_F(MindDataImageProcess, testWarpPerspectiveGrayResize) {
LiteMat lite_warp; LiteMat lite_warp;
std::vector<uint8_t> borderValues; std::vector<uint8_t> borderValues;
borderValues.push_back(0); borderValues.push_back(0);
ret = WarpPerspectiveBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, lite_mat_gray.height_ - 300, PADD_BORDER_CONSTANT,
borderValues);
ret = WarpPerspectiveBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200,
lite_mat_gray.height_ - 300, PADD_BORDER_CONSTANT, borderValues);
EXPECT_TRUE(ret); EXPECT_TRUE(ret);


cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC1, lite_warp.data_ptr_); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC1, lite_warp.data_ptr_);


Loading…
Cancel
Save