From 76ac7ab4efeba0c55ad33fdffbd64fc1b9be44d5 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 22 May 2018 13:55:14 +0300 Subject: [PATCH 1/2] imgcodecs: added test for imwrite parameter types issue 11545 --- modules/imgcodecs/test/test_grfmt.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/modules/imgcodecs/test/test_grfmt.cpp b/modules/imgcodecs/test/test_grfmt.cpp index 88f8501d89..9bcb23205e 100644 --- a/modules/imgcodecs/test/test_grfmt.cpp +++ b/modules/imgcodecs/test/test_grfmt.cpp @@ -327,4 +327,18 @@ TEST(Imgcodecs_Pam, read_write) remove(writefile_no_param.c_str()); } +TEST(Imgcodecs, write_parameter_type) +{ + cv::Mat m(10, 10, CV_8UC1, cv::Scalar::all(0)); + cv::Mat1b m_type = cv::Mat1b::zeros(10, 10); + string tmp_file = cv::tempfile(".bmp"); + EXPECT_NO_THROW(cv::imwrite(tmp_file, cv::Mat(m * 2))) << "* Failed with cv::Mat"; + EXPECT_NO_THROW(cv::imwrite(tmp_file, m * 2)) << "* Failed with cv::MatExpr"; + EXPECT_NO_THROW(cv::imwrite(tmp_file, m_type)) << "* Failed with cv::Mat_"; + EXPECT_NO_THROW(cv::imwrite(tmp_file, m_type * 2)) << "* Failed with cv::MatExpr(Mat_)"; + cv::Matx matx; + EXPECT_NO_THROW(cv::imwrite(tmp_file, matx)) << "* Failed with cv::Matx"; + EXPECT_EQ(0, remove(tmp_file.c_str())); +} + }} // namespace From 35a4551609e32222ac0f2467b64f314412480e0b Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 22 May 2018 13:56:17 +0300 Subject: [PATCH 2/2] imgcodecs: fix imwrite handling of different OutputArray types --- modules/imgcodecs/src/loadsave.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/imgcodecs/src/loadsave.cpp b/modules/imgcodecs/src/loadsave.cpp index e6782dcbec..5dba2412de 100644 --- a/modules/imgcodecs/src/loadsave.cpp +++ b/modules/imgcodecs/src/loadsave.cpp @@ -716,13 +716,10 @@ bool imwrite( const String& filename, InputArray _img, { CV_TRACE_FUNCTION(); std::vector img_vec; - //Did we get a Mat or a vector of Mats? - if (_img.isMat() || _img.isUMat()) - img_vec.push_back(_img.getMat()); - else if (_img.isMatVector() || _img.isUMatVector()) + if (_img.isMatVector() || _img.isUMatVector()) _img.getMatVector(img_vec); else - CV_Error(Error::StsBadArg, "Unknown/unsupported input encountered"); + img_vec.push_back(_img.getMat()); CV_Assert(!img_vec.empty()); return imwrite_(filename, img_vec, params, false);