test_grfmt.cpp 10.9 KB
Newer Older
A
Andrey Kamaev 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                           License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of the copyright holders may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

#include "test_precomp.hpp"

A
Alexander Alekhin 已提交
45
namespace opencv_test { namespace {
A
Andrey Kamaev 已提交
46

47 48
typedef tuple<string, int> File_Mode;
typedef testing::TestWithParam<File_Mode> Imgcodecs_FileMode;
49

50 51 52 53 54
TEST_P(Imgcodecs_FileMode, regression)
{
    const string root = cvtest::TS::ptr()->get_data_path();
    const string filename = root + get<0>(GetParam());
    const int mode = get<1>(GetParam());
55

56 57
    const Mat single = imread(filename, mode);
    ASSERT_FALSE(single.empty());
58 59

    vector<Mat> pages;
60 61 62 63 64 65 66 67 68 69
    ASSERT_TRUE(imreadmulti(filename, pages, mode));
    ASSERT_FALSE(pages.empty());
    const Mat page = pages[0];
    ASSERT_FALSE(page.empty());

    EXPECT_EQ(page.channels(), single.channels());
    EXPECT_EQ(page.depth(), single.depth());
    EXPECT_EQ(page.size().height, single.size().height);
    EXPECT_EQ(page.size().width, single.size().width);
    EXPECT_PRED_FORMAT2(cvtest::MatComparator(0, 0), page, single);
70 71
}

72
const string all_images[] =
73
{
74
#ifdef HAVE_JASPER
75 76 77 78 79
    "readwrite/Rome.jp2",
    "readwrite/Bretagne2.jp2",
    "readwrite/Bretagne2.jp2",
    "readwrite/Grey.jp2",
    "readwrite/Grey.jp2",
M
mrquorr 已提交
80 81
#endif
#ifdef HAVE_GDCM
82 83 84 85
    "readwrite/int16-mono1.dcm",
    "readwrite/uint8-mono2.dcm",
    "readwrite/uint16-mono2.dcm",
    "readwrite/uint8-rgb.dcm",
86
#endif
87 88 89 90 91
    "readwrite/color_palette_alpha.png",
    "readwrite/multipage.tif",
    "readwrite/ordinary.bmp",
    "readwrite/rle8.bmp",
    "readwrite/test_1_c1.jpg",
92
#ifdef HAVE_IMGCODEC_HDR
93
    "readwrite/rle.hdr"
94
#endif
95 96
};

97
const int basic_modes[] =
98
{
99 100 101 102 103
    IMREAD_UNCHANGED,
    IMREAD_GRAYSCALE,
    IMREAD_COLOR,
    IMREAD_ANYDEPTH,
    IMREAD_ANYCOLOR
A
Andrey Kamaev 已提交
104 105
};

106 107 108 109
INSTANTIATE_TEST_CASE_P(All, Imgcodecs_FileMode,
                        testing::Combine(
                            testing::ValuesIn(all_images),
                            testing::ValuesIn(basic_modes)));
A
Andrey Kamaev 已提交
110

111 112 113 114
// GDAL does not support "hdr", "dcm" and have problems with "jp2"
struct notForGDAL {
    bool operator()(const string &name) const {
        const string &ext = name.substr(name.size() - 3, 3);
115 116
        return ext == "hdr" || ext == "dcm" || ext == "jp2" ||
                name.find("rle8.bmp") != std::string::npos;
117 118 119
    }
};

120
inline vector<string> gdal_images()
121
{
122
    vector<string> res;
A
Alexander Alekhin 已提交
123 124
    std::back_insert_iterator< vector<string> > it(res);
    std::remove_copy_if(all_images, all_images + sizeof(all_images)/sizeof(all_images[0]), it, notForGDAL());
125
    return res;
126
}
127

128 129 130 131
INSTANTIATE_TEST_CASE_P(GDAL, Imgcodecs_FileMode,
                        testing::Combine(
                            testing::ValuesIn(gdal_images()),
                            testing::Values(IMREAD_LOAD_GDAL)));
132

133
//==================================================================================================
134

135 136
typedef tuple<string, Size> Ext_Size;
typedef testing::TestWithParam<Ext_Size> Imgcodecs_ExtSize;
137

138
TEST_P(Imgcodecs_ExtSize, write_imageseq)
139
{
140 141 142 143
    const string ext = get<0>(GetParam());
    const Size size = get<1>(GetParam());
    const Point2i center = Point2i(size.width / 2, size.height / 2);
    const int radius = std::min(size.height, size.width / 4);
144

145
    for (int cn = 1; cn <= 4; cn++)
146
    {
147
        SCOPED_TRACE(format("channels %d", cn));
148
        std::vector<int> parameters;
149 150 151 152
        if (cn == 2)
            continue;
        if (cn == 4 && ext != ".tiff")
            continue;
153 154 155 156
        if (cn > 1 && (ext == ".pbm" || ext == ".pgm"))
            continue;
        if (cn != 3 && ext == ".ppm")
            continue;
157
        string filename = cv::tempfile(format("%d%s", cn, ext.c_str()).c_str());
158

159 160
        Mat img_gt(size, CV_MAKETYPE(CV_8U, cn), Scalar::all(0));
        circle(img_gt, center, radius, Scalar::all(255));
161 162 163 164 165 166 167 168
#if 1
        if (ext == ".pbm" || ext == ".pgm" || ext == ".ppm")
        {
            parameters.push_back(IMWRITE_PXM_BINARY);
            parameters.push_back(0);
        }
#endif
        ASSERT_TRUE(imwrite(filename, img_gt, parameters));
169
        Mat img = imread(filename, IMREAD_UNCHANGED);
170 171 172 173
        ASSERT_FALSE(img.empty());
        EXPECT_EQ(img.size(), img.size());
        EXPECT_EQ(img.type(), img.type());
        EXPECT_EQ(cn, img.channels());
174

175
        if (ext == ".jpg")
176
        {
177 178 179 180 181 182
            // JPEG format does not provide 100% accuracy
            // using fuzzy image comparison
            double n = cvtest::norm(img, img_gt, NORM_L1);
            double expected = 0.07 * img.size().area();
            EXPECT_LT(n, expected);
            EXPECT_PRED_FORMAT2(cvtest::MatComparator(10, 0), img, img_gt);
183
        }
184
        else
185
        {
186 187 188
            double n = cvtest::norm(img, img_gt, NORM_L2);
            EXPECT_LT(n, 1.);
            EXPECT_PRED_FORMAT2(cvtest::MatComparator(0, 0), img, img_gt);
189
        }
190 191 192 193 194
#if 0
        std::cout << filename << std::endl;
        imshow("loaded", img);
        waitKey(0);
#else
195
        EXPECT_EQ(0, remove(filename.c_str()));
196
#endif
197 198 199
    }
}

200
const string all_exts[] =
201
{
202 203
#ifdef HAVE_PNG
    ".png",
204
#endif
205 206 207 208 209 210 211
#ifdef HAVE_TIFF
    ".tiff",
#endif
#ifdef HAVE_JPEG
    ".jpg",
#endif
    ".bmp",
212
#ifdef HAVE_IMGCODEC_PXM
213 214
    ".pam",
    ".ppm",
215
    ".pgm",
216 217
    ".pbm",
    ".pnm"
218
#endif
219
};
A
AoD314 已提交
220

221
vector<Size> all_sizes()
A
AoD314 已提交
222
{
223 224 225 226
    vector<Size> res;
    for (int k = 1; k <= 5; ++k)
        res.push_back(Size(640 * k, 480 * k));
    return res;
A
AoD314 已提交
227 228
}

229 230 231 232
INSTANTIATE_TEST_CASE_P(All, Imgcodecs_ExtSize,
                        testing::Combine(
                            testing::ValuesIn(all_exts),
                            testing::ValuesIn(all_sizes())));
A
AoD314 已提交
233

234
#ifdef HAVE_IMGCODEC_PXM
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
typedef testing::TestWithParam<bool> Imgcodecs_pbm;
TEST_P(Imgcodecs_pbm, write_read)
{
    bool binary = GetParam();
    const String ext = "pbm";
    const string full_name = cv::tempfile(ext.c_str());

    Size size(640, 480);
    const Point2i center = Point2i(size.width / 2, size.height / 2);
    const int radius = std::min(size.height, size.width / 4);
    Mat image(size, CV_8UC1, Scalar::all(0));
    circle(image, center, radius, Scalar::all(255));

    vector<int> pbm_params;
    pbm_params.push_back(IMWRITE_PXM_BINARY);
    pbm_params.push_back(binary);

    imwrite( full_name, image, pbm_params );
    Mat loaded = imread(full_name, IMREAD_UNCHANGED);
    ASSERT_FALSE(loaded.empty());

    EXPECT_EQ(0, cvtest::norm(loaded, image, NORM_INF));

    FILE *f = fopen(full_name.c_str(), "rb");
    ASSERT_TRUE(f != NULL);
    ASSERT_EQ('P', getc(f));
    ASSERT_EQ('1' + (binary ? 3 : 0), getc(f));
    fclose(f);
    EXPECT_EQ(0, remove(full_name.c_str()));
}

INSTANTIATE_TEST_CASE_P(All, Imgcodecs_pbm, testing::Bool());
267
#endif
268 269


270
//==================================================================================================
A
AoD314 已提交
271

272
TEST(Imgcodecs_Bmp, read_rle8)
273
{
274 275 276 277 278 279 280
    const string root = cvtest::TS::ptr()->get_data_path();
    Mat rle = imread(root + "readwrite/rle8.bmp");
    ASSERT_FALSE(rle.empty());
    Mat ord = imread(root + "readwrite/ordinary.bmp");
    ASSERT_FALSE(ord.empty());
    EXPECT_LE(cvtest::norm(rle, ord, NORM_L2), 1.e-10);
    EXPECT_PRED_FORMAT2(cvtest::MatComparator(0, 0), rle, ord);
281 282
}

283
#ifdef HAVE_IMGCODEC_HDR
284
TEST(Imgcodecs_Hdr, regression)
F
Fedor Morozov 已提交
285
{
286
    string folder = string(cvtest::TS::ptr()->get_data_path()) + "/readwrite/";
287 288 289 290 291 292 293 294 295
    string name_rle = folder + "rle.hdr";
    string name_no_rle = folder + "no_rle.hdr";
    Mat img_rle = imread(name_rle, -1);
    ASSERT_FALSE(img_rle.empty()) << "Could not open " << name_rle;
    Mat img_no_rle = imread(name_no_rle, -1);
    ASSERT_FALSE(img_no_rle.empty()) << "Could not open " << name_no_rle;

    double min = 0.0, max = 1.0;
    minMaxLoc(abs(img_rle - img_no_rle), &min, &max);
296
    ASSERT_FALSE(max > DBL_EPSILON);
297 298 299 300 301 302 303 304
    string tmp_file_name = tempfile(".hdr");
    vector<int>param(1);
    for(int i = 0; i < 2; i++) {
        param[0] = i;
        imwrite(tmp_file_name, img_rle, param);
        Mat written_img = imread(tmp_file_name, -1);
        ASSERT_FALSE(written_img.empty()) << "Could not open " << tmp_file_name;
        minMaxLoc(abs(img_rle - written_img), &min, &max);
305
        ASSERT_FALSE(max > DBL_EPSILON);
306
    }
307
    remove(tmp_file_name.c_str());
F
Fedor Morozov 已提交
308
}
309
#endif
310

311
#ifdef HAVE_IMGCODEC_PXM
312
TEST(Imgcodecs_Pam, read_write)
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
{
    string folder = string(cvtest::TS::ptr()->get_data_path()) + "readwrite/";
    string filepath = folder + "lena.pam";

    cv::Mat img = cv::imread(filepath);
    ASSERT_FALSE(img.empty());

    std::vector<int> params;
    params.push_back(IMWRITE_PAM_TUPLETYPE);
    params.push_back(IMWRITE_PAM_FORMAT_RGB);

    string writefile = cv::tempfile(".pam");
    EXPECT_NO_THROW(cv::imwrite(writefile, img, params));
    cv::Mat reread = cv::imread(writefile);

    string writefile_no_param = cv::tempfile(".pam");
    EXPECT_NO_THROW(cv::imwrite(writefile_no_param, img));
    cv::Mat reread_no_param = cv::imread(writefile_no_param);

    EXPECT_EQ(0, cvtest::norm(reread, reread_no_param, NORM_INF));
    EXPECT_EQ(0, cvtest::norm(img, reread, NORM_INF));
334 335 336

    remove(writefile.c_str());
    remove(writefile_no_param.c_str());
337
}
338
#endif
A
Alexander Alekhin 已提交
339 340

}} // namespace