feat: change OpenJPEG encoder to lossy with default parameters
authorVadim Levin <vadim.levin@xperience.ai>
Thu, 27 Aug 2020 12:11:45 +0000 (15:11 +0300)
committerVadim Levin <vadim.levin@xperience.ai>
Thu, 27 Aug 2020 12:11:45 +0000 (15:11 +0300)
modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp
modules/imgcodecs/test/test_read_write.cpp

index 4771559..0f16293 100644 (file)
@@ -327,12 +327,14 @@ opj_cparameters setupEncoderParameters(const std::vector<int>& params)
 {
     opj_cparameters parameters;
     opj_set_default_encoder_parameters(&parameters);
+    bool rate_is_specified = false;
     for (size_t i = 0; i < params.size(); i += 2)
     {
         switch (params[i])
         {
         case cv::IMWRITE_JPEG2000_COMPRESSION_X1000:
             parameters.tcp_rates[0] = 1000.f / std::min(std::max(params[i + 1], 1), 1000);
+            rate_is_specified = true;
             break;
         default:
             CV_LOG_WARNING(NULL, "OpenJPEG2000(encoder): skip unsupported parameter: " << params[i]);
@@ -341,6 +343,10 @@ opj_cparameters setupEncoderParameters(const std::vector<int>& params)
     }
     parameters.tcp_numlayers = 1;
     parameters.cp_disto_alloc = 1;
+    if (!rate_is_specified)
+    {
+        parameters.tcp_rates[0] = 4;
+    }
     return parameters;
 }
 
index 890d47a..9dbd2e3 100644 (file)
@@ -228,9 +228,12 @@ TEST_P(Imgcodecs_Image, read_write_BGR)
     double psnrThreshold = 100;
     if (ext == "jpg")
         psnrThreshold = 32;
-#ifdef HAVE_JASPER
+#if defined(HAVE_JASPER)
     if (ext == "jp2")
         psnrThreshold = 95;
+#elif defined(HAVE_OPENJPEG)
+    if (ext == "jp2")
+        psnrThreshold = 35;
 #endif
 
     Mat image = generateTestImageBGR();
@@ -254,9 +257,12 @@ TEST_P(Imgcodecs_Image, read_write_GRAYSCALE)
     double psnrThreshold = 100;
     if (ext == "jpg")
         psnrThreshold = 40;
-#ifdef HAVE_JASPER
+#if defined(HAVE_JASPER)
     if (ext == "jp2")
         psnrThreshold = 70;
+#elif defined(HAVE_OPENJPEG)
+    if (ext == "jp2")
+        psnrThreshold = 35;
 #endif
 
     Mat image = generateTestImageGrayscale();